diff --git a/.gitmodules b/.gitmodules
index 1862419..2f894c4 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -199,10 +199,6 @@
 [submodule "third_party/crossbench"]
 	path = third_party/crossbench
 	url = https://chromium.googlesource.com/crossbench
-[submodule "third_party/crubit/src"]
-	path = third_party/crubit/src
-	url = https://chromium.googlesource.com/external/github.com/google/crubit
-	gclient-condition = checkout_crubit
 [submodule "third_party/depot_tools"]
 	path = third_party/depot_tools
 	url = https://chromium.googlesource.com/chromium/tools/depot_tools
diff --git a/DEPS b/DEPS
index c31cf6f..c3284ca 100644
--- a/DEPS
+++ b/DEPS
@@ -152,19 +152,6 @@
   # Fetch clangd into the same bin/ directory as our clang binary.
   'checkout_clangd': False,
 
-  # Fetch prebuilt and prepackaged Bazel binary/executable. Bazel is currently
-  # only needed by `chromium/src/tools/rust/build_crubit.py` and therefore
-  # shouldn't be used outside of Chromium Rust Experiments project.
-  # Furthermore note that Bazel is only needed when building Crubit during Rust
-  # toolchain build (and is *not* needed during regular Chromium builds).
-  'checkout_bazel': False,
-
-  # Fetch Crubit support libraries in order to build ..._rs_api.rs and
-  # ..._rs_api_impl.cc that are generated by prebuilt (see
-  # tools/rust/build_crubit.py) Crubit tools during Chromium build (see
-  # also //build/rust/rs_bindings_from_cc.gni).
-  'checkout_crubit': False,
-
   # By default checkout the OpenXR loader library only on Windows and Android.
   # The OpenXR backend for VR in Chromium is currently only supported for these
   # platforms, but support for other platforms may be added in the future.
@@ -204,12 +191,6 @@
   # qemu on linux-arm64 machines.
   'checkout_fuchsia_for_arm64_host': False,
 
-  # Revision of Crubit (trunk on 2022-10-15).  This should typically be the
-  # same as the revision specified in CRUBIT_REVISION in
-  # tools/rust/update_rust.py.  More details and roll instructions can be
-  # found in tools/rust/README.md.
-  'crubit_revision': 'f5cbdf4b54b0e6b9f63a4464a2c901c82e0f0209',
-
   # By default, download the fuchsia sdk from the public sdk directory.
   'fuchsia_sdk_cipd_prefix': 'fuchsia/sdk/core/',
 
@@ -300,11 +281,11 @@
   # 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': 'ee6b0d656f2c6feb3d3e4b3a7371439443e87957',
+  'src_internal_revision': '882104e8ef00c37b322eb765dca65f7220a7a854',
   # 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': '5218f67ec716edb39f5d005ddaf6e9d70eca7cc9',
+  'skia_revision': '5fb36dd08a257623ee0738747286de09662e4591',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -312,7 +293,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '0040cda1170f9d481135a95d2fbff616120f404b',
+  'angle_revision': 'cc44090d3483efdbae0dacf9c3fdb6c5d5a950fa',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -320,7 +301,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'fba5ab2f1c9c9b66b61e94d00662f9c12fcb692b',
+  'pdfium_revision': 'cd4887caa580fe6b54be2fd5abe87dc3fb4de27e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -396,7 +377,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '5fea877e0b17578765cd4520857b5b3b172b5199',
+  'devtools_frontend_revision': 'b40634d52b0f5dcde839e73c8bdac4909458217a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -420,7 +401,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': '690b037a7532f18b68e4907ddb0ddff6b1a8f1e7',
+  'dawn_revision': '9d1b7b42eb282d2ce24e329a8bf41c89fdd67973',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -488,7 +469,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.
-  'libunwind_revision':    'b7cdacaadbc4d121081ad6b146c7e94acec4c7ff',
+  'libunwind_revision':    '37c7d984b0b8520a0f99c6e6bbb0514e9996edc8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -952,31 +933,31 @@
     'bucket': 'chromium-browser-clang',
     'objects': [
       {
-        'object_name': 'Linux_x64/rust-toolchain-009e73825af0e59ad4fc603562e038b3dbd6593a-22-llvmorg-20-init-3847-g69c43468.tar.xz',
-        'sha256sum': '28f91ad46cce2750da95a6de305909a7f3904878cb1294de530ea962d19ccf19',
-        'size_bytes': 115038168,
-        'generation': 1727459972380358,
+        'object_name': 'Linux_x64/rust-toolchain-009e73825af0e59ad4fc603562e038b3dbd6593a-23-llvmorg-20-init-3847-g69c43468.tar.xz',
+        'sha256sum': 'a6c4e006002fd396331d77a1ccc8d2ab41fcfd0df5d3df7a6660b6aa7dc6f961',
+        'size_bytes': 123945520,
+        'generation': 1727798075788514,
         'condition': 'host_os == "linux" and non_git_source',
       },
       {
-        'object_name': 'Mac/rust-toolchain-009e73825af0e59ad4fc603562e038b3dbd6593a-22-llvmorg-20-init-3847-g69c43468.tar.xz',
-        'sha256sum': '7aa67826a75a39344a0eb1a7ca0ce439c811eb0318a7e1229cff1b4771d51a84',
-        'size_bytes': 108381448,
-        'generation': 1727459977622304,
+        'object_name': 'Mac/rust-toolchain-009e73825af0e59ad4fc603562e038b3dbd6593a-23-llvmorg-20-init-3847-g69c43468.tar.xz',
+        'sha256sum': '15927f50613ea0740e3fd7ff1fa40c255dcd4d7e7cd2a48fc85e6723ff9362fa',
+        'size_bytes': 117066196,
+        'generation': 1727798077728157,
         'condition': 'host_os == "mac" and host_cpu == "x64"',
       },
       {
-        'object_name': 'Mac_arm64/rust-toolchain-009e73825af0e59ad4fc603562e038b3dbd6593a-22-llvmorg-20-init-3847-g69c43468.tar.xz',
-        'sha256sum': '5b7399445e48c0cf87d4c56a577505ab7f03f936fc3d9eb538f3a5545d740497',
-        'size_bytes': 97828296,
-        'generation': 1727459981528990,
+        'object_name': 'Mac_arm64/rust-toolchain-009e73825af0e59ad4fc603562e038b3dbd6593a-23-llvmorg-20-init-3847-g69c43468.tar.xz',
+        'sha256sum': 'fb8daa448ed50eea88ac9c25c871332213a5c12a7c9beff0261478a6195b994d',
+        'size_bytes': 103504896,
+        'generation': 1727798079645218,
         'condition': 'host_os == "mac" and host_cpu == "arm64"',
       },
       {
-        'object_name': 'Win/rust-toolchain-009e73825af0e59ad4fc603562e038b3dbd6593a-22-llvmorg-20-init-3847-g69c43468.tar.xz',
-        'sha256sum': 'b518511a6278bbd7673c4eb42c3650160655ab3a6b8eeaefe0640de879123585',
-        'size_bytes': 172446400,
-        'generation': 1727459983614492,
+        'object_name': 'Win/rust-toolchain-009e73825af0e59ad4fc603562e038b3dbd6593a-23-llvmorg-20-init-3847-g69c43468.tar.xz',
+        'sha256sum': '139fbd7092526abcb91d5df67d4fc472a2bdae9a6487fcf3ec122c8ac112b4f8',
+        'size_bytes': 178572296,
+        'generation': 1727798081586976,
         'condition': 'host_os == "win"',
       },
     ],
@@ -1295,7 +1276,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '59c00202c7c9270d760bf9a57ffd242ef6b0f271',
+    '4120c4d811f4c534ae4be631037163de6f797935',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1733,7 +1714,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' + '@' + 'f834f05d9e79b960930b90da2d6e8f824c85a9b1',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'c621276d4f2ec43ef4346a40f5dd328aa8bcbaaf',
       'condition': 'checkout_chromeos',
   },
 
@@ -1762,19 +1743,14 @@
     Var('chromium_git') + '/crossbench.git' + '@' + Var('crossbench_revision'),
 
 
-  'src/third_party/crubit/src': {
-      'url': Var('chromium_git') + '/external/github.com/google/crubit.git' + '@' + Var('crubit_revision'),
-      'condition': 'checkout_crubit',
-  },
-
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '6dec85272d23ae587984cdd78eae428ce3b2ad9b',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'cc39a5681f48f42e8f0d16b9979bd3085c93de0a',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '51db6cf38207673d6bfa25c8e136277c3cfb6e9c',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '84c1220a80b203163a2c3d124ca103f63580d8ce',
     'condition': 'checkout_src_internal',
   },
 
@@ -2240,7 +2216,7 @@
     Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '478e5ab3eca30e600006d5a0a08b176fd34d3bd1',
 
   'src/third_party/openscreen/src':
-    Var('chromium_git') + '/openscreen' + '@' + '6508900f6f6cbe87a61abdc337fcdfc289c43cea',
+    Var('chromium_git') + '/openscreen' + '@' + '1335531d0d7847625b52e9365902d7fcba82f3c6',
 
   'src/third_party/openxr/src': {
     'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '288d3a7ebc1ad959f62d51da75baa3d27438c499',
@@ -2266,7 +2242,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '077bb360edecb33551e88c8097035e4b8cef245b',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '226197a61ac2b08b3860b5c73f8411ba0ba43947',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -2554,7 +2530,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@fb8f0127fca4d687f0584b62183572ed39ffc198',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@0828416b3eae17db848880d486e5c7f0038e46b0',
   'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@a729c86d78552ec7e05e3748448e7a99f6f2a696',
   '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@ec59c77a3bb5c747a369931ef101ac7c14823f2f',
@@ -2603,7 +2579,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '9d029d337ae1832b5a7b9bf049a87076c12f749d',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '8569a0d5346330eb6641512df65b864bbaed11e9',
+    Var('webrtc_git') + '/src.git' + '@' + '076eb6cdf236cd6125ab126df2340ca3ee265425',
 
   # 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.
@@ -2743,7 +2719,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'RlxrAZbJURNWeJnj9fybs_LDcbvjGjPa82Jx5_rz6K8C',
+        'version': 'swnHsMK93RsqwT2pV61xuuotI2-ti-_np8j5BSXvmpoC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -2754,7 +2730,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'uLcuCv4vP-zbrrt6V9EDkeKSlPWvYejOMIU3WfWaDcQC',
+        'version': 'xlRQrk5SDu4Nzw6mU6FfUm0VlXN1RlAz6CynFnVnnRgC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -4068,42 +4044,6 @@
       'dep_type': 'cipd',
   },
 
-  'src/tools/bazel/linux-amd64': {
-    'packages': [{
-       'package': 'infra/3pp/tools/bazel_bootstrap/linux-amd64',
-       'version': 'version:2@5.3.2.1',
-    }],
-    'dep_type': 'cipd',
-    'condition': 'host_os == "linux" and checkout_bazel and non_git_source',
-  },
-
-  'src/tools/bazel/mac-amd64': {
-    'packages': [{
-       'package': 'infra/3pp/tools/bazel_bootstrap/mac-amd64',
-       'version': 'version:2@5.3.2.1',
-    }],
-    'dep_type': 'cipd',
-    'condition': 'host_os == "mac" and host_cpu == "x64" and checkout_bazel',
-  },
-
-  'src/tools/bazel/mac-arm64': {
-    'packages': [{
-       'package': 'infra/3pp/tools/bazel_bootstrap/mac-arm64',
-       'version': 'version:2@5.3.2.1',
-    }],
-    'dep_type': 'cipd',
-    'condition': 'host_os == "mac" and host_cpu == "arm64" and checkout_bazel',
-  },
-
-  'src/tools/bazel/windows-amd64': {
-    'packages': [{
-       'package': 'infra/3pp/tools/bazel_bootstrap/windows-amd64',
-       'version': 'version:2@5.3.2',
-    }],
-    'dep_type': 'cipd',
-    'condition': 'host_os == "win" and checkout_bazel',
-  },
-
   # Dependencies from src_internal
   'src/chromeos/ash/resources/internal': {
       'url': Var('chrome_git') + '/chrome/chromeos/ash/resources/internal.git' + '@' +
@@ -4396,7 +4336,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        'c7ca556bc732c861810971db63ceffa352c2442e',
+        '028fcf85bcfd643709d3174307c2e4303e76fcd7',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/WATCHLISTS b/WATCHLISTS
index 96b45f5..acdd7cc 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -2144,6 +2144,12 @@
         'content/browser/tab_contents/|'\
         'chrome/browser/ui/tab_contents/',
     },
+    'tab_group_infra': {
+      'filepath': 'chrome/browser/data_sharing/'\
+        '|chrome/browser/tab_group_sync/'\
+        '|components/data_sharing/'\
+        '|components/saved_tab_groups/'
+    },
     'tab_interface': {
       'filepath': 'chrome/browser/tab/'
     },
@@ -3271,6 +3277,7 @@
     'tab_contents': ['ajwong+watch@chromium.org',
                      'avi@chromium.org',
                      'creis+watch@chromium.org'],
+    'tab_group_infra' : [ 'chrome-tab-group-eng-leads+watch-infra@google.com' ],
     'tab_interface': ['jinsukkim+watch@chromium.org'],
     'tab_ui_and_start_surface': ['meiliang+watch@chromium.org',
                                  'yuezhanggg+watch@chromium.org',
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java
index bc446b4..efdb190 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java
@@ -491,11 +491,13 @@
             ChromeComponent expected) {
         return new TypeSafeMatcher<ChromeComponent>() {
             @Override
+            @SuppressWarnings("LiteProtoToString")
             public void describeTo(Description description) {
                 description.appendText(expected.toString());
             }
 
             @Override
+            @SuppressWarnings("LiteProtoToString")
             protected void describeMismatchSafely(
                     ChromeComponent item, Description mismatchDescription) {
                 mismatchDescription.appendText("Doesn't match " + item.toString());
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ClientHintsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ClientHintsTest.java
index 6e296e8..f8c33ad 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/ClientHintsTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/ClientHintsTest.java
@@ -810,8 +810,7 @@
                 "fake_platform",
                 customUserAgentMetadata.get(AwUserAgentMetadata.MetadataKeys.PLATFORM));
         Assert.assertEquals(
-                new Boolean(true),
-                customUserAgentMetadata.get(AwUserAgentMetadata.MetadataKeys.WOW64));
+                true, customUserAgentMetadata.get(AwUserAgentMetadata.MetadataKeys.WOW64));
         Assert.assertEquals(
                 Arrays.deepToString(overrideBrands),
                 Arrays.deepToString(
@@ -835,8 +834,7 @@
         Assert.assertEquals(
                 "Android", customUserAgentMetadata.get(AwUserAgentMetadata.MetadataKeys.PLATFORM));
         Assert.assertEquals(
-                new Boolean(false),
-                customUserAgentMetadata.get(AwUserAgentMetadata.MetadataKeys.WOW64));
+                false, customUserAgentMetadata.get(AwUserAgentMetadata.MetadataKeys.WOW64));
 
         String[][] actualOverrideBrands =
                 (String[][])
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java
index 4d74af7..b7087c5 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java
@@ -301,7 +301,7 @@
                                         mWebServer.getBaseUrl(),
                                         null);
                             } catch (UnsupportedEncodingException e) {
-                                Assert.fail();
+                                throw new RuntimeException(e);
                             }
                         });
         expectTitle(testString);
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/devui/FlagsFragmentTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/devui/FlagsFragmentTest.java
index a8355f48..86a4a97 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/devui/FlagsFragmentTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/devui/FlagsFragmentTest.java
@@ -572,10 +572,10 @@
         return flagInteraction;
     }
 
+    /** Verify if the baseFeature flag contains only "Default", "Enabled" , "Disabled" states. */
     @Test
     @MediumTest
     @Feature({"AndroidWebView"})
-    /** Verify if the baseFeature flag contains only "Default", "Enabled" , "Disabled" states. */
     public void testFlagStates_baseFeature() throws Throwable {
         ListView flagsList = mRule.getActivity().findViewById(R.id.flags_list);
 
@@ -594,10 +594,10 @@
         testFlagStatesHelper(firstBaseFeaturePosition);
     }
 
+    /** Verify if the commandline flag contains only "Default", "Enabled" states. */
     @Test
     @MediumTest
     @Feature({"AndroidWebView"})
-    /** Verify if the commandline flag contains only "Default", "Enabled" states. */
     public void testFlagStates_commandLineFlag() throws Throwable {
         ListView flagsList = mRule.getActivity().findViewById(R.id.flags_list);
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/services/JsSandboxServiceTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/services/JsSandboxServiceTest.java
index 4e5f301..68dac32 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/services/JsSandboxServiceTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/services/JsSandboxServiceTest.java
@@ -465,7 +465,7 @@
         // Invalid offset extending beyond end of file.
         // Note that file contains only ascii characters for testing purposes, hence we
         // can assume the length of the string to be the number of bytes it contains.
-        long offsetBeyondEof = fileContent.length() + 10;
+        long offsetBeyondEof = (long) fileContent.length() + 10;
         try (AssetFileDescriptor afd =
                 new AssetFileDescriptor(pfd, offsetBeyondEof, fileContent.length())) {
             ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
@@ -532,7 +532,7 @@
         // Read only up to call to `hello();
         // File contains only ascii characters for testing purposes, hence we can predict the
         // number of bytes to remove from the end.
-        long length = fileContent.length() - "bye();".length();
+        long length = (long) fileContent.length() - "bye();".length();
         try (AssetFileDescriptor afd = new AssetFileDescriptor(pfd, 0, length)) {
             ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                     JavaScriptSandbox.createConnectedInstanceForTestingAsync(context);
@@ -588,7 +588,7 @@
         // Declare length beyond EOF.
         // Note that file contains only ascii characters for testing purposes, hence we
         // can assume the length of the string to be the number of bytes it contains.
-        long length = fileContent.length() + 10;
+        long length = (long) fileContent.length() + 10;
         try (AssetFileDescriptor afd = new AssetFileDescriptor(pfd, 0, length)) {
             ListenableFuture<JavaScriptSandbox> jsSandboxFuture =
                     JavaScriptSandbox.createConnectedInstanceForTestingAsync(context);
diff --git a/android_webview/tools/automated_ui_tests/javatests/src/org/chromium/webview_ui_test/test/ActionModeTest.java b/android_webview/tools/automated_ui_tests/javatests/src/org/chromium/webview_ui_test/test/ActionModeTest.java
index 4579269..4dab588 100644
--- a/android_webview/tools/automated_ui_tests/javatests/src/org/chromium/webview_ui_test/test/ActionModeTest.java
+++ b/android_webview/tools/automated_ui_tests/javatests/src/org/chromium/webview_ui_test/test/ActionModeTest.java
@@ -192,10 +192,8 @@
             onData(new MenuItemMatcher(equalTo(name))).inRoot(rootMatcher).perform(click());
         }
 
-        /**
-         * After select all action is clicked, the PopUp Menu may disappear
-         * briefly due to selection change, wait for the menu to reappear
-         */
+        // After select all action is clicked, the PopUp Menu may disappear briefly due to selection
+        // change, wait for the menu to reappear
         if (name.equals(SELECT_ALL_ACTION)) {
             assertTrue(mWebViewActivityRule.waitForActionBarPopup());
         }
diff --git a/ash/auth/active_session_auth_controller_impl.cc b/ash/auth/active_session_auth_controller_impl.cc
index 2e6d9807..ed524273 100644
--- a/ash/auth/active_session_auth_controller_impl.cc
+++ b/ash/auth/active_session_auth_controller_impl.cc
@@ -141,6 +141,52 @@
 
 }  // namespace
 
+// This class manages the closing process after successful fingerprint
+// authentication. It listens for two signals:
+//  1. The completion of the successful authentication animation.
+//  2. The authentication callback from cryptohome.
+// Once both signals are received, the class triggers the closing process.
+class ActiveSessionAuthControllerImpl::FingerprintAuthTracker {
+ public:
+  explicit FingerprintAuthTracker(ActiveSessionAuthControllerImpl* owner)
+      : owner_(owner) {
+    CHECK(owner_);
+  }
+
+  void OnAuthenticationFinished(
+      std::unique_ptr<UserContext> user_context,
+      std::optional<AuthenticationError> authentication_error) {
+    CHECK_EQ(authentication_finished_, false);
+    authentication_finished_ = true;
+    if (authentication_error.has_value()) {
+      LOG(ERROR) << "Authentication error during OnFingerprintSuccess code: "
+                 << authentication_error->get_cryptohome_code();
+    }
+    owner_->user_context_ = std::move(user_context);
+    MaybeNotifyOwner();
+  }
+
+  void OnAnimationFinished() {
+    VLOG(1) << "OnAnimationFinished";
+    CHECK_EQ(animation_finished_, false);
+    animation_finished_ = true;
+    MaybeNotifyOwner();
+  }
+
+  void MaybeNotifyOwner() {
+    if (authentication_finished_ && animation_finished_) {
+      owner_->StartClose();
+    }
+    CHECK(owner_);
+    CHECK(owner_->fp_auth_tracker_);
+  }
+
+ private:
+  const raw_ptr<ActiveSessionAuthControllerImpl> owner_;
+  bool animation_finished_ = false;
+  bool authentication_finished_ = false;
+};
+
 ActiveSessionAuthControllerImpl::TestApi::TestApi(
     ActiveSessionAuthControllerImpl* controller)
     : controller_(controller) {}
@@ -207,6 +253,9 @@
   auth_performer_ = std::make_unique<AuthPerformer>(UserDataAuthClient::Get());
   account_id_ = Shell::Get()->session_controller()->GetActiveAccountId();
 
+  fingerprint_animation_finished_ = false;
+  fingerprint_authentication_finished_ = false;
+
   user_manager::User* active_user =
       user_manager::UserManager::Get()->GetActiveUser();
   auto user_context = std::make_unique<UserContext>(*active_user);
@@ -299,6 +348,7 @@
     LOG(ERROR) << "Failed to start fingerprint auth session - only "
                   "non-fingerprint factors will be available.";
   } else {
+    fp_auth_tracker_ = std::make_unique<FingerprintAuthTracker>(this);
     available_factors_.Put(AuthInputType::kFingerprint);
   }
   std::move(on_auth_factors_ready).Run(std::move(user_context));
@@ -319,6 +369,9 @@
   }
   switch (scan_result) {
     case FingerprintAuthScanResult::kSuccess:
+      contents_view_->NotifyFingerprintAuthSuccess(
+          base::BindOnce(&FingerprintAuthTracker::OnAnimationFinished,
+                         base::Unretained(fp_auth_tracker_.get())));
       if (state_ == ActiveSessionAuthState::kPasswordAuthStarted ||
           state_ == ActiveSessionAuthState::kPinAuthStarted) {
         SetState(ActiveSessionAuthState::kFingerprintAuthSucceededWaiting);
@@ -346,25 +399,14 @@
   NOTREACHED();
 }
 
-void ActiveSessionAuthControllerImpl::OnFingerprintSuccess(
-    std::unique_ptr<UserContext> user_context,
-    std::optional<AuthenticationError> authentication_error) {
-  if (authentication_error.has_value()) {
-    LOG(ERROR) << "Authentication error during OnFingerprintSuccess code: "
-               << authentication_error->get_cryptohome_code();
-  }
-  user_context_ = std::move(user_context);
-  StartClose();
-}
-
 void ActiveSessionAuthControllerImpl::HandleFingerprintAuthSuccess() {
   CHECK(user_context_);
   uma_recorder_.RecordAuthSucceeded(AuthInputType::kFingerprint);
   SetState(ActiveSessionAuthState::kFingerprintAuthSucceeded);
   auth_performer_->AuthenticateWithLegacyFingerprint(
       std::move(user_context_),
-      base::BindOnce(&ActiveSessionAuthControllerImpl::OnFingerprintSuccess,
-                     weak_ptr_factory_.GetWeakPtr()));
+      base::BindOnce(&FingerprintAuthTracker::OnAuthenticationFinished,
+                     base::Unretained(fp_auth_tracker_.get())));
 }
 
 void ActiveSessionAuthControllerImpl::InitUi() {
@@ -410,12 +452,14 @@
 
   auth_performer_->InvalidateCurrentAttempts();
   if (fp_client_ && available_factors_.Has(AuthInputType::kFingerprint)) {
+    CHECK(fp_auth_tracker_);
     fp_client_->TerminateFingerprintAuth(
         std::move(user_context_),
         base::BindOnce(&ActiveSessionAuthControllerImpl::CompleteClose,
                        weak_ptr_factory_.GetWeakPtr()));
     return;
   }
+  CHECK(!fp_auth_tracker_);
   CompleteClose(std::move(user_context_), std::nullopt);
 }
 
@@ -441,7 +485,7 @@
 
   title_.clear();
   description_.clear();
-
+  fp_auth_tracker_.reset();
   widget_.reset();
 }
 
diff --git a/ash/auth/active_session_auth_controller_impl.h b/ash/auth/active_session_auth_controller_impl.h
index fcc26595..3a8e3fc 100644
--- a/ash/auth/active_session_auth_controller_impl.h
+++ b/ash/auth/active_session_auth_controller_impl.h
@@ -115,6 +115,7 @@
   void OnFingerprintTerminated(
       std::unique_ptr<UserContext> user_context,
       std::optional<AuthenticationError> authentication_error);
+  void OnFingerprintAnimationFinished();
 
   // Tracks the authentication flow for the active session.
   enum class ActiveSessionAuthState {
@@ -136,6 +137,9 @@
   };
 
  private:
+  class FingerprintAuthTracker;
+  friend class FingerprintAuthTracker;
+
   using AuthFactorsReadyCallback =
       base::OnceCallback<void(std::unique_ptr<UserContext>)>;
 
@@ -197,7 +201,11 @@
 
   std::unique_ptr<AuthRequest> auth_request_;
 
+  bool fingerprint_animation_finished_ = false;
+  bool fingerprint_authentication_finished_ = false;
+
   raw_ptr<ActiveSessionFingerprintClient> fp_client_;
+  std::unique_ptr<FingerprintAuthTracker> fp_auth_tracker_;
 
   ActiveSessionAuthMetricsRecorder uma_recorder_;
 
diff --git a/ash/auth/views/active_session_auth_view.cc b/ash/auth/views/active_session_auth_view.cc
index e1e2b04..62bfc1f1 100644
--- a/ash/auth/views/active_session_auth_view.cc
+++ b/ash/auth/views/active_session_auth_view.cc
@@ -290,6 +290,12 @@
   auth_container_->SetFingerprintState(state);
 }
 
+void ActiveSessionAuthView::NotifyFingerprintAuthSuccess(
+    base::OnceClosure on_success_animation_finished) {
+  auth_container_->NotifyFingerprintAuthSuccess(
+      std::move(on_success_animation_finished));
+}
+
 void ActiveSessionAuthView::NotifyFingerprintAuthFailure() {
   auth_container_->NotifyFingerprintAuthFailure();
 }
diff --git a/ash/auth/views/active_session_auth_view.h b/ash/auth/views/active_session_auth_view.h
index a6dc9f60..2ab4ed4 100644
--- a/ash/auth/views/active_session_auth_view.h
+++ b/ash/auth/views/active_session_auth_view.h
@@ -118,6 +118,8 @@
 
   // FingerprintView actions:
   void SetFingerprintState(FingerprintState state);
+  void NotifyFingerprintAuthSuccess(
+      base::OnceClosure on_success_animation_finished);
   void NotifyFingerprintAuthFailure();
 
  private:
diff --git a/ash/auth/views/auth_container_view.cc b/ash/auth/views/auth_container_view.cc
index 2f23fdb..10ad61e 100644
--- a/ash/auth/views/auth_container_view.cc
+++ b/ash/auth/views/auth_container_view.cc
@@ -330,6 +330,13 @@
   fingerprint_view_->SetState(state);
 }
 
+void AuthContainerView::NotifyFingerprintAuthSuccess(
+    base::OnceCallback<void()> on_success_animation_finished) {
+  CHECK(fingerprint_view_);
+  fingerprint_view_->NotifyAuthSuccess(
+      std::move(on_success_animation_finished));
+}
+
 void AuthContainerView::NotifyFingerprintAuthFailure() {
   CHECK(fingerprint_view_);
   fingerprint_view_->NotifyAuthFailure();
diff --git a/ash/auth/views/auth_container_view.h b/ash/auth/views/auth_container_view.h
index 967876e..8561cc14 100644
--- a/ash/auth/views/auth_container_view.h
+++ b/ash/auth/views/auth_container_view.h
@@ -127,6 +127,8 @@
 
   // FingerprintView actions:
   void SetFingerprintState(FingerprintState state);
+  void NotifyFingerprintAuthSuccess(
+      base::OnceClosure on_success_animation_finished);
   void NotifyFingerprintAuthFailure();
 
  private:
diff --git a/ash/auth/views/fingerprint_view.cc b/ash/auth/views/fingerprint_view.cc
index 86fd725..f0f4271 100644
--- a/ash/auth/views/fingerprint_view.cc
+++ b/ash/auth/views/fingerprint_view.cc
@@ -5,8 +5,10 @@
 #include "ash/auth/views/fingerprint_view.h"
 
 #include <memory>
+#include <optional>
 #include <string>
 #include <string_view>
+#include <vector>
 
 #include "ash/auth/views/auth_common.h"
 #include "ash/login/resources/grit/login_resources.h"
@@ -18,6 +20,7 @@
 #include "ash/style/ash_color_id.h"
 #include "base/check.h"
 #include "base/check_op.h"
+#include "base/containers/flat_tree.h"
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
@@ -28,7 +31,9 @@
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/chromeos/styles/cros_tokens_color_mappings.h"
+#include "ui/color/color_provider.h"
 #include "ui/gfx/geometry/size.h"
+#include "ui/lottie/animation.h"
 #include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/box_layout.h"
@@ -68,6 +73,34 @@
 constexpr ui::ColorId kFingerprintIconDisabledColorId =
     cros_tokens::kCrosSysDisabled;
 
+constexpr float kCheckmarkAnimationPlaybackSpeed = 2.25;
+
+std::unique_ptr<lottie::Animation> GetCheckmarkAnimation(
+    ui::ColorProvider* color_provider) {
+  std::optional<std::vector<uint8_t>> lottie_data =
+      ui::ResourceBundle::GetSharedInstance().GetLottieData(
+          IDR_LOGIN_ARROW_CHECKMARK_ANIMATION);
+  CHECK(lottie_data.has_value());
+
+  cc::SkottieColorMap color_map = cc::SkottieColorMap{
+      cc::SkottieMapColor(
+          "cros.sys.illo.color2",
+          color_provider->GetColor(cros_tokens::kCrosSysPositive)),
+      cc::SkottieMapColor(
+          "cros.sys.app_base_shaded",
+          color_provider->GetColor(cros_tokens::kCrosSysOnSurface)),
+  };
+
+  std::unique_ptr<lottie::Animation> animation =
+      std::make_unique<lottie::Animation>(
+          cc::SkottieWrapper::UnsafeCreateSerializable(lottie_data.value()),
+          std::move(color_map));
+
+  animation->SetPlaybackSpeed(kCheckmarkAnimationPlaybackSpeed);
+
+  return animation;
+}
+
 }  // namespace
 
 //----------------------- FingerprintView Test API ------------------------
@@ -125,6 +158,12 @@
       gfx::Size(kFingerprintIconSizeDp, kFingerprintIconSizeDp),
       0 /*corner_radius*/));
 
+  lottie_animation_view_ =
+      AddChildView(std::make_unique<views::AnimatedImageView>());
+  lottie_animation_view_->SetImageSize(
+      gfx::Size(kFingerprintIconSizeDp, kFingerprintIconSizeDp));
+  lottie_animation_view_->SetVisible(false);
+
   label_ = AddChildView(std::make_unique<views::Label>());
   label_->SetSubpixelRenderingEnabled(false);
   label_->SetAutoColorReadabilityEnabled(false);
@@ -141,6 +180,8 @@
 
 FingerprintView::~FingerprintView() {
   icon_ = nullptr;
+  scoped_animation_observer_.Reset();
+  lottie_animation_view_ = nullptr;
   label_ = nullptr;
 }
 
@@ -148,6 +189,11 @@
   if (state_ == state) {
     return;
   }
+
+  if (has_success_) {
+    return;
+  }
+
   reset_state_.Stop();
   state_ = state;
   DisplayCurrentState();
@@ -158,11 +204,39 @@
     return;
   }
 
+  if (has_success_) {
+    return;
+  }
+
   has_pin_ = has_pin;
   DisplayCurrentState();
 }
 
+void FingerprintView::NotifyAuthSuccess(
+    base::OnceClosure on_success_animation_finished) {
+  has_success_ = true;
+  CHECK(on_success_animation_finished_.is_null());
+  on_success_animation_finished_ = std::move(on_success_animation_finished);
+  CHECK(GetColorProvider());
+  std::unique_ptr<lottie::Animation> animation =
+      GetCheckmarkAnimation(GetColorProvider());
+  CHECK(animation);
+  auto playback_config = lottie::Animation::PlaybackConfig::CreateWithStyle(
+      lottie::Animation::Style::kLinear, *animation);
+  // Observe animation to know when it finishes playing.
+  scoped_animation_observer_.Observe(animation.get());
+  lottie_animation_view_->SetAnimatedImage(std::move(animation));
+  lottie_animation_view_->Play(playback_config);
+
+  icon_->SetVisible(false);
+  lottie_animation_view_->SetVisible(true);
+}
+
 void FingerprintView::NotifyAuthFailure() {
+  if (has_success_) {
+    return;
+  }
+
   SetState(FingerprintState::AVAILABLE_WITH_FAILED_ATTEMPT);
   reset_state_.Start(
       FROM_HERE, kResetToDefaultIconDelay,
@@ -171,9 +245,14 @@
 }
 
 void FingerprintView::OnGestureEvent(ui::GestureEvent* event) {
+  if (has_success_) {
+    return;
+  }
+
   if (event->type() != ui::EventType::kGestureTap) {
     return;
   }
+
   if (state_ == FingerprintState::AVAILABLE_DEFAULT ||
       state_ == FingerprintState::AVAILABLE_WITH_TOUCH_SENSOR_WARNING ||
       state_ == FingerprintState::AVAILABLE_WITH_FAILED_ATTEMPT) {
@@ -186,6 +265,7 @@
 }
 
 void FingerprintView::DisplayCurrentState() {
+  CHECK(!has_success_);
   if (state_ == FingerprintState::UNAVAILABLE) {
     SetVisible(false);
     return;
@@ -198,6 +278,7 @@
 }
 
 void FingerprintView::SetIcon() {
+  CHECK(!has_success_);
   switch (state_) {
     case FingerprintState::AVAILABLE_DEFAULT:
     case FingerprintState::AVAILABLE_WITH_TOUCH_SENSOR_WARNING:
@@ -222,6 +303,7 @@
 }
 
 ui::ColorId FingerprintView::GetIconColorIdFromState() const {
+  CHECK(!has_success_);
   switch (state_) {
     case FingerprintState::AVAILABLE_DEFAULT:
     case FingerprintState::AVAILABLE_WITH_TOUCH_SENSOR_WARNING:
@@ -236,6 +318,7 @@
 }
 
 int FingerprintView::GetTextIdFromState() const {
+  CHECK(!has_success_);
   switch (state_) {
     case FingerprintState::AVAILABLE_DEFAULT:
     case FingerprintState::AVAILABLE_WITH_FAILED_ATTEMPT:
@@ -255,6 +338,7 @@
 }
 
 int FingerprintView::GetA11yTextIdFromState() const {
+  CHECK(!has_success_);
   switch (state_) {
     case FingerprintState::AVAILABLE_DEFAULT:
     case FingerprintState::AVAILABLE_WITH_FAILED_ATTEMPT:
@@ -284,6 +368,15 @@
   return gfx::Size(kTextLineWidthDp, preferred_height);
 }
 
+void FingerprintView::AnimationCycleEnded(const lottie::Animation* animation) {
+  CHECK(has_success_);
+  scoped_animation_observer_.Reset();
+
+  if (on_success_animation_finished_) {
+    std::move(on_success_animation_finished_).Run();
+  }
+}
+
 BEGIN_METADATA(FingerprintView)
 END_METADATA
 
diff --git a/ash/auth/views/fingerprint_view.h b/ash/auth/views/fingerprint_view.h
index dfff9f9..887aeac 100644
--- a/ash/auth/views/fingerprint_view.h
+++ b/ash/auth/views/fingerprint_view.h
@@ -11,10 +11,13 @@
 #include "ash/style/ash_color_id.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
+#include "base/scoped_observation.h"
 #include "base/timer/timer.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/gfx/geometry/size.h"
+#include "ui/lottie/animation_observer.h"
+#include "ui/views/controls/animated_image_view.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/view.h"
 
@@ -23,7 +26,8 @@
 // FingerprintView is a view displaying a fingerprint icon and label,
 // dynamically adapting based on fingerprint availability,
 // authentication state, and the presence of a PIN.
-class ASH_EXPORT FingerprintView : public views::View {
+class ASH_EXPORT FingerprintView : public views::View,
+                                   public lottie::AnimationObserver {
   METADATA_HEADER(FingerprintView, views::View)
  public:
   class TestApi {
@@ -66,6 +70,9 @@
   // Indicates if a PIN is set, potentially influencing the label text.
   void SetHasPin(bool has_pin);
 
+  // Triggers a brief animation to signal an authentication success.
+  void NotifyAuthSuccess(base::OnceClosure on_success_animation_finished);
+
   // Triggers a brief animation to signal an authentication failure.
   void NotifyAuthFailure();
 
@@ -74,6 +81,9 @@
   gfx::Size CalculatePreferredSize(
       const views::SizeBounds& available_size) const override;
 
+  // lottie::AnimationObserver:
+  void AnimationCycleEnded(const lottie::Animation* animation) override;
+
  private:
   // Updates the visual elements to reflect the current state and PIN
   // availability.
@@ -90,6 +100,16 @@
   raw_ptr<views::Label> label_ = nullptr;
   raw_ptr<AnimatedRoundedImageView> icon_ = nullptr;
 
+  // A green checkmark animation shown when NotifyAuthSuccess called.
+  raw_ptr<views::AnimatedImageView> lottie_animation_view_;
+
+  base::ScopedObservation<lottie::Animation, lottie::AnimationObserver>
+      scoped_animation_observer_{this};
+
+  base::OnceClosure on_success_animation_finished_;
+
+  bool has_success_ = false;
+
   // State:
   FingerprintState state_ = FingerprintState::UNAVAILABLE;
   bool has_pin_ = false;
diff --git a/ash/capture_mode/base_capture_mode_session.h b/ash/capture_mode/base_capture_mode_session.h
index ff704734..e7a16ec 100644
--- a/ash/capture_mode/base_capture_mode_session.h
+++ b/ash/capture_mode/base_capture_mode_session.h
@@ -10,6 +10,7 @@
 #include "ash/capture_mode/capture_mode_controller.h"
 #include "ash/shell_observer.h"
 #include "ui/compositor/layer_owner.h"
+#include "ui/views/controls/button/button.h"
 
 namespace ash {
 
@@ -154,6 +155,11 @@
   // the captured region as `image`.
   virtual void ShowSearchResultsPanel(const gfx::ImageSkia& image) = 0;
 
+  // Adds an action button below the selected region during an active session.
+  virtual void AddActionButton(views::Button::PressedCallback callback,
+                               std::u16string text,
+                               const gfx::VectorIcon* icon) = 0;
+
   // ShellObserver:
   void OnRootWindowWillShutdown(aura::Window* root_window) override;
 
diff --git a/ash/capture_mode/capture_mode_session.cc b/ash/capture_mode/capture_mode_session.cc
index c9e2c6c..3648816 100644
--- a/ash/capture_mode/capture_mode_session.cc
+++ b/ash/capture_mode/capture_mode_session.cc
@@ -32,12 +32,14 @@
 #include "ash/keyboard/ui/keyboard_ui_controller.h"
 #include "ash/public/cpp/resources/grit/ash_public_unscaled_resources.h"
 #include "ash/public/cpp/shell_window_ids.h"
+#include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/root_window_controller.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/ash_color_id.h"
 #include "ash/style/color_util.h"
 #include "ash/style/icon_button.h"
+#include "ash/style/pill_button.h"
 #include "ash/style/tab_slider_button.h"
 #include "ash/utility/cursor_setter.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
@@ -188,6 +190,9 @@
 // The horizontal distance between action buttons in a row.
 constexpr int kActionButtonSpacing = 10;
 
+// The corner radius for an action button.
+constexpr int kActionButtonRadius = 18;
+
 // Mouse cursor warping is disabled when the capture source is a custom region.
 // Sets the mouse warp status to |enable| and return the original value.
 bool SetMouseWarpEnabled(bool enable) {
@@ -484,6 +489,59 @@
   return widget_bounds;
 }
 
+class ActionButtonView : public PillButton {
+  METADATA_HEADER(ActionButtonView, PillButton)
+
+ public:
+  ActionButtonView(views::Button::PressedCallback callback,
+                   std::u16string text,
+                   const gfx::VectorIcon* icon)
+      : PillButton(std::move(callback),
+                   text,
+                   Type::kDefaultLargeWithIconLeading,
+                   icon),
+        // Since this view has fully circular rounded corners, we can't use a
+        // nine patch layer for the shadow. We have to use the
+        // `ShadowOnTextureLayer`. For more info, see https://crbug.com/1308800.
+        shadow_(SystemShadow::CreateShadowOnTextureLayer(
+            SystemShadow::Type::kElevation12)) {
+    shadow_->SetRoundedCornerRadius(kActionButtonRadius);
+    capture_mode_util::SetHighlightBorder(
+        this, kActionButtonRadius,
+        views::HighlightBorder::Type::kHighlightBorderNoShadow);
+  }
+  ActionButtonView(const ActionButtonView&) = delete;
+  ActionButtonView& operator=(const ActionButtonView&) = delete;
+  ~ActionButtonView() override = default;
+
+  // views::View:
+  void AddedToWidget() override {
+    PillButton::AddedToWidget();
+
+    // Attach the shadow at the bottom of the widget layer.
+    auto* shadow_layer = shadow_->GetLayer();
+    auto* widget_layer = GetWidget()->GetLayer();
+    widget_layer->Add(shadow_layer);
+    widget_layer->StackAtBottom(shadow_layer);
+
+    // Make the shadow observe the color provider source change to update the
+    // colors.
+    shadow_->ObserveColorProviderSource(GetWidget());
+  }
+
+  void OnBoundsChanged(const gfx::Rect& previous_bounds) override {
+    // The shadow layer is a sibling of this view's layer, and should have the
+    // same bounds.
+    shadow_->SetContentBounds(layer()->bounds());
+  }
+
+ private:
+  std::unique_ptr<SystemShadow> shadow_;
+};
+
+BEGIN_METADATA(ActionButtonView)
+END_METADATA
+
 }  // namespace
 
 // -----------------------------------------------------------------------------
@@ -1306,10 +1364,6 @@
 void CaptureModeSession::ShowSearchResultsPanel(const gfx::ImageSkia& image) {
   DCHECK_EQ(active_behavior()->behavior_type(), BehaviorType::kSunfish);
 
-  // When we show the panel, we also want to update the action button container
-  // and any buttons that might be visible.
-  UpdateActionContainerWidget();
-
   if (!search_results_panel_widget_) {
     search_results_panel_widget_ =
         SearchResultsPanel::CreateWidget(current_root());
@@ -1320,6 +1374,27 @@
   auto* search_results_panel = views::AsViewClass<SearchResultsPanel>(
       search_results_panel_widget_->GetContentsView());
   search_results_panel->SetSearchBoxImage(image);
+
+  UpdateActionContainerWidget();
+}
+
+void CaptureModeSession::AddActionButton(
+    views::Button::PressedCallback callback,
+    std::u16string text,
+    const gfx::VectorIcon* icon) {
+  // Another process may try to add an action button before the container is
+  // created, or while it is invalid. In these cases, we don't want to do
+  // anything.
+  if (!action_container_widget_) {
+    return;
+  }
+
+  // TODO(http://b/368674223): Add a ranking when the button is added.
+  CHECK(action_container_view_);
+  action_container_view_->AddChildView(std::make_unique<ActionButtonView>(
+      std::move(callback), text, &kCaptureModeImageIcon));
+
+  UpdateActionContainerWidget();
 }
 
 void CaptureModeSession::OnPaintLayer(const ui::PaintContext& context) {
@@ -2202,6 +2277,10 @@
 
   fine_tune_position_ = GetFineTunePosition(screen_location, is_touch);
 
+  // The capture region will be changing, so remove any existing action buttons,
+  // if any, as they will no longer be applicable.
+  RemoveAllActionButtons();
+
   if (fine_tune_position_ == FineTunePosition::kNone) {
     // If the point is outside the capture region and not on the capture bar or
     // settings menu, restart to the select phase.
@@ -2664,62 +2743,6 @@
   return capture_label_view_->ShouldHandleEvent();
 }
 
-// TODO(http://b/363069895): Upload strings for translation.
-void CaptureModeSession::UpdateActionContainerWidget() {
-  CHECK(features::IsSunfishFeatureEnabled());
-
-  if (!action_container_widget_) {
-    action_container_widget_ = std::make_unique<views::Widget>();
-    auto* parent = GetParentContainer(current_root_);
-    action_container_widget_->Init(
-        CreateWidgetParams(parent, gfx::Rect(), "ActionButtonsContainer"));
-
-    action_container_widget_->SetContentsView(
-        views::Builder<views::BoxLayoutView>()
-            .CopyAddressTo(&action_container_view_)
-            .SetOrientation(views::BoxLayout::Orientation::kHorizontal)
-            .SetBetweenChildSpacing(kActionButtonSpacing)
-            .SetMainAxisAlignment(views::BoxLayout::MainAxisAlignment::kCenter)
-            .SetCrossAxisAlignment(
-                views::BoxLayout::CrossAxisAlignment::kStretch)
-            .Build());
-
-    action_container_widget_->Show();
-  }
-
-  UpdateActionContainerWidgetBounds();
-}
-
-void CaptureModeSession::UpdateActionContainerWidgetBounds() {
-  DCHECK(action_container_widget_);
-
-  const gfx::Rect bounds = CalculateActionContainerWidgetBounds();
-  const gfx::Rect old_bounds =
-      action_container_widget_->GetNativeWindow()->GetBoundsInScreen();
-  if (old_bounds == bounds) {
-    return;
-  }
-
-  action_container_widget_->SetBounds(bounds);
-}
-
-gfx::Rect CaptureModeSession::CalculateActionContainerWidgetBounds() const {
-  DCHECK(action_container_widget_);
-
-  const gfx::Size preferred_size = action_container_view_->GetPreferredSize();
-  const gfx::Rect capture_bar_bounds =
-      action_container_widget_->GetNativeWindow()->bounds();
-
-  gfx::Rect bounds(current_root_->bounds());
-  const gfx::Rect capture_region = controller_->user_capture_region();
-  bounds = CalculateRegionEdgeBounds(preferred_size, capture_bar_bounds,
-                                     capture_region, current_root_);
-
-  // User capture bounds are in root window coordinates so convert them here.
-  wm::ConvertRectToScreen(current_root_, &bounds);
-  return bounds;
-}
-
 void CaptureModeSession::UpdateRootWindowDimmers() {
   root_window_dimmers_.clear();
 
@@ -2955,6 +2978,65 @@
           selected_window);
 }
 
+// TODO(http://b/363069895): Upload strings for translation.
+void CaptureModeSession::UpdateActionContainerWidget() {
+  DCHECK_EQ(active_behavior()->behavior_type(), BehaviorType::kSunfish);
+
+  if (!action_container_widget_) {
+    action_container_widget_ = std::make_unique<views::Widget>();
+    auto* parent = GetParentContainer(current_root_);
+    action_container_widget_->Init(
+        CreateWidgetParams(parent, gfx::Rect(), "ActionButtonsContainer"));
+
+    action_container_widget_->SetContentsView(
+        views::Builder<views::BoxLayoutView>()
+            .CopyAddressTo(&action_container_view_)
+            .SetOrientation(views::BoxLayout::Orientation::kHorizontal)
+            .SetBetweenChildSpacing(kActionButtonSpacing)
+            .SetMainAxisAlignment(views::BoxLayout::MainAxisAlignment::kCenter)
+            .SetCrossAxisAlignment(
+                views::BoxLayout::CrossAxisAlignment::kStretch)
+            .Build());
+
+    action_container_widget_->Show();
+  }
+
+  UpdateActionContainerWidgetBounds();
+}
+
+void CaptureModeSession::UpdateActionContainerWidgetBounds() {
+  DCHECK(action_container_widget_);
+
+  const gfx::Rect bounds = CalculateActionContainerWidgetBounds();
+  if (bounds != action_container_widget_->GetWindowBoundsInScreen()) {
+    action_container_widget_->SetBounds(bounds);
+  }
+}
+
+gfx::Rect CaptureModeSession::CalculateActionContainerWidgetBounds() const {
+  DCHECK(action_container_widget_);
+
+  const gfx::Size preferred_size = action_container_view_->GetPreferredSize();
+  const gfx::Rect capture_bar_bounds =
+      action_container_widget_->GetNativeWindow()->bounds();
+
+  const gfx::Rect capture_region = controller_->user_capture_region();
+  gfx::Rect bounds = CalculateRegionEdgeBounds(
+      preferred_size, capture_bar_bounds, capture_region, current_root_);
+
+  // User capture bounds are in root window coordinates so convert them here.
+  wm::ConvertRectToScreen(current_root_, &bounds);
+  return bounds;
+}
+
+void CaptureModeSession::RemoveAllActionButtons() {
+  // Remove all children from the action button container, if the widget exists.
+  if (action_container_widget_) {
+    CHECK(action_container_view_);
+    action_container_view_->RemoveAllChildViews();
+  }
+}
+
 void CaptureModeSession::InitInternal() {
   layer()->set_delegate(this);
   auto* parent = GetParentContainer(current_root_);
diff --git a/ash/capture_mode/capture_mode_session.h b/ash/capture_mode/capture_mode_session.h
index 6e42a3b1..253c53f 100644
--- a/ash/capture_mode/capture_mode_session.h
+++ b/ash/capture_mode/capture_mode_session.h
@@ -179,6 +179,9 @@
                        bool root_window_will_shutdown) override;
   std::set<aura::Window*> GetWindowsToIgnoreFromWidgets() override;
   void ShowSearchResultsPanel(const gfx::ImageSkia& image) override;
+  void AddActionButton(views::Button::PressedCallback callback,
+                       std::u16string text,
+                       const gfx::VectorIcon* icon) override;
 
   // ui::LayerDelegate:
   void OnPaintLayer(const ui::PaintContext& context) override;
@@ -329,17 +332,6 @@
   // child is visible.
   bool ShouldCaptureLabelHandleEvent(aura::Window* event_target);
 
-  // Creates the the action container widget if it wasn't previously created,
-  // and updates the widget's bounds.
-  void UpdateActionContainerWidget();
-
-  // Updates the action container widget's bounds.
-  void UpdateActionContainerWidgetBounds();
-
-  // Calculates the targeted action container widget bounds in screen
-  // coordinates.
-  gfx::Rect CalculateActionContainerWidgetBounds() const;
-
   // Updates |root_window_dimmers_| to dim the correct root windows.
   void UpdateRootWindowDimmers();
 
@@ -401,6 +393,21 @@
   // capturable window at `screen_point`. Returns false otherwise.
   bool IsPointOverSelectedWindow(const gfx::Point& screen_point) const;
 
+  // Creates the the action container widget if it wasn't previously created,
+  // and updates the widget's bounds.
+  void UpdateActionContainerWidget();
+
+  // Updates the action container widget's bounds.
+  void UpdateActionContainerWidgetBounds();
+
+  // Calculates the targeted action container widget bounds in screen
+  // coordinates.
+  gfx::Rect CalculateActionContainerWidgetBounds() const;
+
+  // Removes any existing action buttons from `action_container_view_` if the
+  // `action_container_widget_` exists,
+  void RemoveAllActionButtons();
+
   // BaseCaptureModeSession:
   void InitInternal() override;
   void ShutdownInternal() override;
diff --git a/ash/capture_mode/capture_mode_session_test_api.cc b/ash/capture_mode/capture_mode_session_test_api.cc
index 50a2363..11231a5 100644
--- a/ash/capture_mode/capture_mode_session_test_api.cc
+++ b/ash/capture_mode/capture_mode_session_test_api.cc
@@ -8,6 +8,9 @@
 #include "ash/capture_mode/capture_mode_session.h"
 #include "ash/capture_mode/capture_mode_types.h"
 #include "ash/capture_mode/recording_type_menu_view.h"
+#include "ash/style/pill_button.h"
+#include "ui/views/layout/box_layout_view.h"
+#include "ui/views/view_utils.h"
 
 namespace ash {
 
@@ -118,4 +121,20 @@
   return session_->GetSelectedWindowTargetBounds();
 }
 
+std::vector<PillButton*> CaptureModeSessionTestApi::GetActionButtons() const {
+  std::vector<PillButton*> action_buttons;
+
+  // The action container widget, and thus the container view, may not have been
+  // created yet when this function is called. In this case, return an empty
+  // vector.
+  if (session_->action_container_widget_) {
+    CHECK(session_->action_container_view_);
+    for (views::View* button : session_->action_container_view_->children()) {
+      action_buttons.emplace_back(views::AsViewClass<PillButton>(button));
+    }
+  }
+
+  return action_buttons;
+}
+
 }  // namespace ash
diff --git a/ash/capture_mode/capture_mode_session_test_api.h b/ash/capture_mode/capture_mode_session_test_api.h
index cf563cd..e382440 100644
--- a/ash/capture_mode/capture_mode_session_test_api.h
+++ b/ash/capture_mode/capture_mode_session_test_api.h
@@ -19,6 +19,7 @@
 class CaptureModeBarView;
 class CaptureModeSettingsView;
 class MagnifierGlass;
+class PillButton;
 class RecordingTypeMenuView;
 class UserNudgeController;
 
@@ -77,6 +78,10 @@
 
   gfx::Rect GetSelectedWindowTargetBounds();
 
+  // A vector of the current action buttons for a Sunfish session. Will return
+  // an empty vector if there are no buttons or there is no selected region.
+  std::vector<PillButton*> GetActionButtons() const;
+
  private:
   const raw_ptr<CaptureModeSession, DanglingUntriaged> session_;
 };
diff --git a/ash/capture_mode/capture_mode_util.cc b/ash/capture_mode/capture_mode_util.cc
index 19c20ee..3dd5a40 100644
--- a/ash/capture_mode/capture_mode_util.cc
+++ b/ash/capture_mode/capture_mode_util.cc
@@ -585,4 +585,13 @@
   return result;
 }
 
+void AddActionButton(views::Button::PressedCallback callback,
+                     std::u16string text,
+                     const gfx::VectorIcon* icon) {
+  if (auto* controller = CaptureModeController::Get(); controller->IsActive()) {
+    controller->capture_mode_session()->AddActionButton(std::move(callback),
+                                                        text, icon);
+  }
+}
+
 }  // namespace ash::capture_mode_util
diff --git a/ash/capture_mode/capture_mode_util.h b/ash/capture_mode/capture_mode_util.h
index 12657bc..f8d205b1 100644
--- a/ash/capture_mode/capture_mode_util.h
+++ b/ash/capture_mode/capture_mode_util.h
@@ -14,6 +14,7 @@
 #include "ui/gfx/animation/tween.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/size.h"
+#include "ui/views/controls/button/button.h"
 #include "ui/views/highlight_border.h"
 
 namespace aura {
@@ -236,6 +237,13 @@
     const gfx::Rect& partial_region_bounds,
     aura::Window* root_window);
 
+// TODO(http://b/368674223): Add some type of ordering mechanism to the API.
+// Adds a new action button to a sunfish capture session if the session is
+// active.
+ASH_EXPORT void AddActionButton(views::Button::PressedCallback callback,
+                                std::u16string text,
+                                const gfx::VectorIcon* icon);
+
 }  // namespace capture_mode_util
 
 }  // namespace ash
diff --git a/ash/capture_mode/null_capture_mode_session.cc b/ash/capture_mode/null_capture_mode_session.cc
index a28b735f..cebc847c 100644
--- a/ash/capture_mode/null_capture_mode_session.cc
+++ b/ash/capture_mode/null_capture_mode_session.cc
@@ -116,6 +116,11 @@
 void NullCaptureModeSession::ShowSearchResultsPanel(
     const gfx::ImageSkia& image) {}
 
+void NullCaptureModeSession::AddActionButton(
+    views::Button::PressedCallback callback,
+    std::u16string text,
+    const gfx::VectorIcon* icon) {}
+
 void NullCaptureModeSession::InitInternal() {
   layer()->SetName("NullCaptureModeSession");
 }
diff --git a/ash/capture_mode/null_capture_mode_session.h b/ash/capture_mode/null_capture_mode_session.h
index de1e67b..42b4120 100644
--- a/ash/capture_mode/null_capture_mode_session.h
+++ b/ash/capture_mode/null_capture_mode_session.h
@@ -49,6 +49,9 @@
                        bool root_window_will_shutdown) override;
   std::set<aura::Window*> GetWindowsToIgnoreFromWidgets() override;
   void ShowSearchResultsPanel(const gfx::ImageSkia& image) override;
+  void AddActionButton(views::Button::PressedCallback callback,
+                       std::u16string text,
+                       const gfx::VectorIcon* icon) override;
 
  private:
   // CaptureModeSession:
diff --git a/ash/capture_mode/sunfish_unittest.cc b/ash/capture_mode/sunfish_unittest.cc
index 105217a9e..66b0c63 100644
--- a/ash/capture_mode/sunfish_unittest.cc
+++ b/ash/capture_mode/sunfish_unittest.cc
@@ -10,16 +10,20 @@
 #include "ash/capture_mode/capture_mode_session.h"
 #include "ash/capture_mode/capture_mode_session_test_api.h"
 #include "ash/capture_mode/capture_mode_test_util.h"
+#include "ash/capture_mode/capture_mode_util.h"
 #include "ash/capture_mode/search_results_panel.h"
 #include "ash/capture_mode/sunfish_capture_bar_view.h"
 #include "ash/capture_mode/test_capture_mode_delegate.h"
 #include "ash/constants/ash_features.h"
 #include "ash/constants/ash_switches.h"
 #include "ash/public/cpp/capture_mode/capture_mode_test_api.h"
+#include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/scanner/scanner_controller.h"
 #include "ash/shell.h"
 #include "ash/style/icon_button.h"
+#include "ash/style/pill_button.h"
 #include "ash/test/ash_test_base.h"
+#include "ash/test/ash_test_util.h"
 #include "ash/test/test_ash_web_view_factory.h"
 #include "base/auto_reset.h"
 #include "base/test/bind.h"
@@ -108,7 +112,7 @@
   // Immediately upon region selection, `PerformImageSearch()` and
   // `OnCaptureImageAttempted()` will be called once.
   SelectCaptureModeRegion(GetEventGenerator(), gfx::Rect(100, 100, 600, 500),
-                          /*release_mouse=*/true, /*proceed=*/true);
+                          /*release_mouse=*/true, /*verify_region=*/true);
   ASSERT_FALSE(capture_button->GetVisible());
   ASSERT_FALSE(capture_label->GetVisible());
   auto* test_delegate =
@@ -131,7 +135,7 @@
   CaptureModeSessionTestApi test_api(session);
 
   SelectCaptureModeRegion(GetEventGenerator(), gfx::Rect(100, 100, 600, 500),
-                          /*release_mouse=*/true, /*proceed=*/true);
+                          /*release_mouse=*/true, /*verify_region=*/true);
   WaitForImageCapturedForSearch();
   EXPECT_TRUE(session->search_results_panel_widget());
 
@@ -192,7 +196,7 @@
   // Tests after selecting a region, the session is ended.
   auto* event_generator = GetEventGenerator();
   SelectCaptureModeRegion(event_generator, gfx::Rect(100, 100, 600, 500),
-                          /*release_mouse=*/true, /*proceed=*/false);
+                          /*release_mouse=*/true, /*verify_region=*/false);
   EXPECT_FALSE(controller->IsActive());
   test_delegate->set_is_allowed_by_dlp(true);
 }
@@ -434,7 +438,7 @@
 
   // Test we can select a region and show the search results panel.
   SelectCaptureModeRegion(GetEventGenerator(), gfx::Rect(100, 100, 600, 500),
-                          /*release_mouse=*/true, /*proceed=*/true);
+                          /*release_mouse=*/true, /*verify_region=*/true);
   WaitForImageCapturedForSearch();
   EXPECT_TRUE(session->search_results_panel_widget());
 
@@ -467,6 +471,52 @@
   VerifyActiveBehavior(BehaviorType::kSunfish);
 }
 
+// Tests that while a sunfish session has a region selected, calling the API
+// will successfully create a new action button.
+TEST_F(SunfishTest, AddActionButton) {
+  auto* controller = CaptureModeController::Get();
+  controller->StartSunfishSession();
+  ASSERT_TRUE(controller->IsActive());
+  auto* session =
+      static_cast<CaptureModeSession*>(controller->capture_mode_session());
+
+  CaptureModeSessionTestApi session_test_api(
+      controller->capture_mode_session());
+  EXPECT_EQ(session_test_api.GetActionButtons().size(), 0u);
+
+  // Attempt to add a new action button using the API.
+  capture_mode_util::AddActionButton(views::Button::PressedCallback(),
+                                     u"Do not show", &kCaptureModeImageIcon);
+
+  // The region has not been selected yet, so attempting to add a button should
+  // do nothing.
+  EXPECT_EQ(session_test_api.GetActionButtons().size(), 0u);
+
+  // Select a region on the far left of the screen so we have space for the
+  // button between it and the search results panel.
+  SelectCaptureModeRegion(GetEventGenerator(), gfx::Rect(0, 0, 50, 200),
+                          /*release_mouse=*/true, /*verify_region=*/true);
+  WaitForImageCapturedForSearch();
+  EXPECT_TRUE(session->search_results_panel_widget());
+
+  // Create another action button that, when clicked, will change the value of a
+  // bool that can be verified later.
+  bool pressed = false;
+  capture_mode_util::AddActionButton(
+      base::BindLambdaForTesting([&]() { pressed = true; }), u"Test",
+      &kCaptureModeImageIcon);
+
+  // There should only be one valid button in the session.
+  const std::vector<PillButton*> action_buttons =
+      session_test_api.GetActionButtons();
+  EXPECT_EQ(action_buttons.size(), 1u);
+
+  // Clicking the button should successfully run the callback, and change the
+  // value of the bool.
+  LeftClickOn(action_buttons[0]);
+  ASSERT_TRUE(pressed);
+}
+
 class SunfishWithScannerTest : public SunfishTest {
  public:
   SunfishWithScannerTest() = default;
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 0804a09..49763b4 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -381,10 +381,8 @@
 // shortcut and feature tile.
 BASE_FEATURE(kCaptureModeEducation,
              "CaptureModeEducation",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-// TODO(hewer): Remove the unused paths after at least one milestone after
-// Capture Mode Education has been enabled by default.
 // Determines how we educate the user to the screen capture entry points.
 constexpr base::FeatureParam<CaptureModeEducationParam>::Option
     capture_mode_education_type_options[] = {
diff --git a/ash/webui/common/resources/BUILD.gn b/ash/webui/common/resources/BUILD.gn
index 45342ff8..1461c2f0 100644
--- a/ash/webui/common/resources/BUILD.gn
+++ b/ash/webui/common/resources/BUILD.gn
@@ -47,7 +47,6 @@
   "network/network_property_list_mojo.js",
   "network/network_proxy_exclusions.js",
   "network/network_proxy_input.js",
-  "network/network_proxy.js",
   "network/network_select.js",
   "network/sim_lock_dialogs.js",
   "network/apn_detail_dialog.js",
@@ -113,6 +112,7 @@
   "bluetooth/bluetooth_pairing_ui.ts",
   "bluetooth/bluetooth_spinner_page.ts",
   "network/network_nameservers.ts",
+  "network/network_proxy.ts",
   "network/network_siminfo.ts",
   "network_health/network_diagnostics.ts",
   "network_health/network_health_container.ts",
@@ -454,6 +454,7 @@
   "network/network_config_element_behavior.js",
   "network/network_listener_behavior.js",
   "network/network_nameservers.html.js",
+  "network/network_proxy.html.js",
   "network/network_proxy_exclusions.html.js",
   "network/network_proxy_exclusions.js",
   "network/network_proxy_input.html.js",
@@ -546,7 +547,6 @@
   "network/network_list_types.d.ts",
   "network/network_password_input.d.ts",
   "network/network_property_list_mojo.d.ts",
-  "network/network_proxy.d.ts",
   "network/network_select.d.ts",
   "network/sim_lock_dialogs.d.ts",
 
diff --git a/ash/webui/common/resources/network/BUILD.gn b/ash/webui/common/resources/network/BUILD.gn
index 7ffe5e5..64cd0322 100644
--- a/ash/webui/common/resources/network/BUILD.gn
+++ b/ash/webui/common/resources/network/BUILD.gn
@@ -35,7 +35,6 @@
     ":network_listener_behavior",
     ":network_password_input",
     ":network_property_list_mojo",
-    ":network_proxy",
     ":network_proxy_exclusions",
     ":network_proxy_input",
     ":network_select",
@@ -312,24 +311,6 @@
   ]
 }
 
-js_library("network_proxy") {
-  deps = [
-    ":cr_policy_network_behavior_mojo",
-    ":network_proxy_exclusions",
-    ":network_proxy_input",
-    ":onc_mojo",
-    "//ash/webui/common/resources:assert",
-    "//ash/webui/common/resources:i18n_behavior",
-    "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = [
-    "//ash/webui/common/resources/cr_elements/cr_button/cr_button_externs.js",
-    "//ash/webui/common/resources/cr_elements/cr_input/cr_input_externs.js",
-    "//ash/webui/common/resources/cr_elements/cr_toggle/cr_toggle_externs.js",
-  ]
-}
-
 js_library("network_proxy_exclusions") {
   deps = [
     "//ash/webui/common/resources:i18n_behavior",
diff --git a/ash/webui/common/resources/network/network_proxy.d.ts b/ash/webui/common/resources/network/network_proxy.d.ts
deleted file mode 100644
index c567313..0000000
--- a/ash/webui/common/resources/network/network_proxy.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {LegacyElementMixin} from '//resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js';
-interface NetworkProxyElement extends LegacyElementMixin, HTMLElement {
-  editable: boolean;
-  reset(): void;
-}
-export {NetworkProxyElement};
diff --git a/ash/webui/common/resources/network/network_proxy.html b/ash/webui/common/resources/network/network_proxy.html
index 10f636c0..121a8ed 100644
--- a/ash/webui/common/resources/network/network_proxy.html
+++ b/ash/webui/common/resources/network/network_proxy.html
@@ -40,7 +40,7 @@
     hidden$="[[!matches_(proxy_.type.activeValue, 'PAC')]]">
   <cr-input id="pacInput" class="flex"
       label="[[i18n('networkProxyAutoConfig')]]"
-      value="{{proxy_.pac.activeValue}}" on-change="onPACChange_"
+      value="{{proxy_.pac.activeValue}}" on-change="onPacChange_"
       disabled="[[!isEditable_('pac', managedProperties, editable,
           useSharedProxies)]]">
   </cr-input>
@@ -120,7 +120,7 @@
           aria-label="[[i18n('networkProxyExceptionInputA11yLabel')]]"
           on-keypress="onAddProxyExclusionKeypress_">
         <cr-button id="proxyExclusionButton"
-            on-click="onAddProxyExclusionTap_"
+            on-click="onAddProxyExclusionClicked_"
             slot="suffix"
             disabled="[[shouldProxyExclusionButtonBeDisabled_(
                 proxyExclusionInputValue_)]]">
@@ -131,7 +131,7 @@
   </div>
 
   <cr-button id="saveManualProxy"
-      on-click="onSaveProxyTap_" class="action-button"
+      on-click="onSaveProxyClicked_" class="action-button"
       disabled="[[!isSaveManualProxyEnabled_(managedProperties,
           proxyIsUserModified_, proxy_.*)]]">
     [[i18n('save')]]
diff --git a/ash/webui/common/resources/network/network_proxy.js b/ash/webui/common/resources/network/network_proxy.ts
similarity index 66%
rename from ash/webui/common/resources/network/network_proxy.js
rename to ash/webui/common/resources/network/network_proxy.ts
index b37a9a7f..432f8e70 100644
--- a/ash/webui/common/resources/network/network_proxy.js
+++ b/ash/webui/common/resources/network/network_proxy.ts
@@ -17,30 +17,35 @@
 import './network_proxy_input.js';
 import './network_shared.css.js';
 
-import {assert} from '//resources/ash/common/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
-import {ManagedManualProxySettings, ManagedProperties, ManagedProxyLocation, ManagedProxySettings, ManagedStringList, ProxyLocation, ProxySettings} from '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {IPConfigType, OncSource, PolicySource} from '//resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
-import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {microTask} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {I18nMixin, I18nMixinInterface} from 'chrome://resources/ash/common/cr_elements/i18n_mixin.js';
+import {assert} from 'chrome://resources/js/assert.js';
+import {ManagedManualProxySettings, ManagedProperties, ManagedProxyLocation, ManagedProxySettings, ManagedStringList, ManualProxySettings, ProxyLocation, ProxySettings} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {IPConfigType, OncSource, PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {microTask, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {CrPolicyNetworkBehaviorMojo, CrPolicyNetworkBehaviorMojoInterface} from './cr_policy_network_behavior_mojo.js';
 import {getTemplate} from './network_proxy.html.js';
 import {OncMojo} from './onc_mojo.js';
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {I18nBehaviorInterface}
- * @implements {CrPolicyNetworkBehaviorMojoInterface}
- */
-const NetworkProxyElementBase =
-    mixinBehaviors([CrPolicyNetworkBehaviorMojo, I18nBehavior], PolymerElement);
+function createDefaultProxySettings(): ManagedProxySettings {
+  return {
+    type: OncMojo.createManagedString('Direct'),
+    manual: undefined,
+    excludeDomains: undefined,
+    pac: undefined,
+  };
+}
 
-/** @polymer */
-class NetworkProxyElement extends NetworkProxyElementBase {
+type Constructor<T> = new (...args: any[]) => T;
+
+const NetworkProxyElementBase =
+    mixinBehaviors([CrPolicyNetworkBehaviorMojo], I18nMixin(PolymerElement)) as
+    Constructor<PolymerElement&I18nMixinInterface&
+                CrPolicyNetworkBehaviorMojoInterface>;
+
+export class NetworkProxyElement extends NetworkProxyElementBase {
   static get is() {
-    return 'network-proxy';
+    return 'network-proxy' as const;
   }
 
   static get template() {
@@ -55,7 +60,6 @@
         value: false,
       },
 
-      /** @type {!ManagedProperties|undefined} */
       managedProperties: {
         type: Object,
         observer: 'managedPropertiesChanged_',
@@ -70,18 +74,16 @@
 
       /**
        * UI visible / edited proxy configuration.
-       * @private {!ManagedProxySettings}
        */
       proxy_: {
         type: Object,
         value() {
-          return this.createDefaultProxySettings_();
+          return createDefaultProxySettings();
         },
       },
 
       /**
        * The Web Proxy Auto Discovery URL extracted from managedProperties.
-       * @private
        */
       wpad_: {
         type: String,
@@ -90,7 +92,6 @@
 
       /**
        * Whether or not to use the same manual proxy for all protocols.
-       * @private
        */
       useSameProxy_: {
         type: Boolean,
@@ -100,8 +101,6 @@
 
       /**
        * Array of proxy configuration types.
-       * @private {!Array<string>}
-       * @const
        */
       proxyTypes_: {
         type: Array,
@@ -111,7 +110,6 @@
 
       /**
        * The current value of the proxy exclusion input.
-       * @private
        */
       proxyExclusionInputValue_: {
         type: String,
@@ -121,7 +119,6 @@
       /**
        * Set to true while modifying proxy values so that an update does not
        * override the edited values.
-       * @private {boolean}
        */
       proxyIsUserModified_: {
         type: Boolean,
@@ -131,23 +128,30 @@
     };
   }
 
-  /** @override */
-  connectedCallback() {
+  editable: boolean;
+  managedProperties: ManagedProperties|undefined;
+  useSharedProxies: boolean;
+  private proxy_: ManagedProxySettings;
+  private wpad_: string;
+  private useSameProxy_: boolean;
+  private proxyTypes_: [];
+  private proxyExclusionInputValue_: string;
+  private proxyIsUserModified_: boolean;
+
+  /**
+   * Saved ExcludeDomains properties so that switching to a non-Manual type
+   * does not loose any set exclusions while the UI is open.
+   */
+  private savedManual_: ManagedManualProxySettings|undefined = undefined;
+
+  /**
+   * Saved Manual properties so that switching to another type does not loose
+   * any set properties while the UI is open.
+   */
+  private savedExcludeDomains_: ManagedStringList|undefined = undefined;
+
+  override connectedCallback() {
     super.connectedCallback();
-
-    /**
-     * Saved ExcludeDomains properties so that switching to a non-Manual type
-     * does not loose any set exclusions while the UI is open.
-     * @private {!ManagedManualProxySettings|undefined}
-     */
-    this.savedManual_ = undefined;
-
-    /**
-     * Saved Manual properties so that switching to another type does not loose
-     * any set properties while the UI is open.
-     * @private {!ManagedStringList|undefined}
-     */
-    this.savedExcludeDomains_ = undefined;
     this.reset();
   }
 
@@ -160,12 +164,9 @@
     this.updateProxy_();
   }
 
-  /**
-   * @param {!ManagedProperties|undefined} newValue
-   * @param {!ManagedProperties|undefined} oldValue
-   * @private
-   */
-  managedPropertiesChanged_(newValue, oldValue) {
+  private managedPropertiesChanged_(
+      newValue: ManagedProperties|undefined,
+      oldValue: ManagedProperties|undefined) {
     if ((newValue && newValue.guid) !== (oldValue && oldValue.guid)) {
       // Clear saved manual properties and exclude domains if we're updating
       // to show a different network.
@@ -181,15 +182,11 @@
     this.updateProxy_();
   }
 
-  /**
-   * @return {boolean} True if any input elements are currently being edited.
-   * @private
-   */
-  isInputEditInProgress_() {
+  private isInputEditInProgress_(): boolean {
     if (!this.editable) {
       return false;
     }
-    const activeElement = this.shadowRoot.activeElement;
+    const activeElement = this.shadowRoot!.activeElement;
     if (!activeElement) {
       return false;
     }
@@ -219,23 +216,14 @@
     return this.isEditable_(property);
   }
 
-  /**
-   * @param {?ManagedProxyLocation|undefined} a
-   * @param {?ManagedProxyLocation|undefined} b
-   * @return {boolean}
-   * @private
-   */
-  proxyMatches_(a, b) {
+  private proxyMatches_(
+      a: ManagedProxyLocation|undefined|null,
+      b: ManagedProxyLocation|undefined|null): boolean {
     return !!a && !!b && a.host.activeValue === b.host.activeValue &&
         a.port.activeValue === b.port.activeValue;
   }
 
-  /**
-   * @param {number} port
-   * @return {!ManagedProxyLocation}
-   * @private
-   */
-  createDefaultProxyLocation_(port) {
+  private createDefaultProxyLocation_(port: number): ManagedProxyLocation {
     return {
       host: OncMojo.createManagedString(''),
       port: OncMojo.createManagedInt(port),
@@ -244,20 +232,19 @@
 
   /**
    * Returns a copy of |inputProxy| with all required properties set correctly.
-   * @param {!ManagedProxySettings} inputProxy
-   * @return {!ManagedProxySettings}
-   * @private
    */
-  validateProxy_(inputProxy) {
-    const proxy =
-        /** @type {!ManagedProxySettings} */ (Object.assign({}, inputProxy));
+  private validateProxy_(inputProxy: ManagedProxySettings):
+      ManagedProxySettings {
+    const proxy = {...inputProxy};
     const type = proxy.type.activeValue;
     if (type === 'PAC') {
       if (!proxy.pac) {
         proxy.pac = OncMojo.createManagedString('');
       }
     } else if (type === 'Manual') {
-      proxy.manual = proxy.manual || this.savedManual_ || {};
+      proxy.manual =
+          proxy.manual || this.savedManual_ || new ManagedManualProxySettings();
+      assert(proxy.manual);
       if (!proxy.manual.httpProxy) {
         proxy.manual.httpProxy = this.createDefaultProxyLocation_(80);
       }
@@ -271,13 +258,13 @@
           proxy.excludeDomains || this.savedExcludeDomains_ || {
             activeValue: [],
             policySource: PolicySource.kNone,
+            policyValue: undefined,
           };
     }
     return proxy;
   }
 
-  /** @private */
-  updateProxy_() {
+  private updateProxy_(): void {
     if (!this.managedProperties) {
       return;
     }
@@ -288,11 +275,11 @@
     // settings and use the default value.
     if (this.isShared_() && proxySettings &&
         !this.isControlled(proxySettings.type) && !this.useSharedProxies) {
-      proxySettings = null;  // Ignore proxy settings.
+      proxySettings = undefined;  // Ignore proxy settings.
     }
 
     const proxy = proxySettings ? this.validateProxy_(proxySettings) :
-                                  this.createDefaultProxySettings_();
+                                  createDefaultProxySettings();
 
     if (proxy.type.activeValue === 'WPAD') {
       // Set the Web Proxy Auto Discovery URL for display purposes.
@@ -308,11 +295,7 @@
     microTask.run(() => this.setProxy_(proxy));
   }
 
-  /**
-   * @param {!ManagedProxySettings} proxy
-   * @private
-   */
-  setProxy_(proxy) {
+  private setProxy_(proxy: ManagedProxySettings): void {
     this.proxy_ = proxy;
     if (proxy.manual) {
       const manual = proxy.manual;
@@ -322,8 +305,8 @@
         // If all four proxies match, enable the 'use same proxy' toggle.
         this.useSameProxy_ = true;
       } else if (
-          !manual.secureHttpProxy.host.activeValue &&
-          !manual.socks.host.activeValue) {
+          !manual.secureHttpProxy?.host?.activeValue &&
+          !manual.socks?.host?.activeValue) {
         // Otherwise if no proxies other than http have a host value, also
         // enable the 'use same proxy' toggle.
         this.useSameProxy_ = true;
@@ -332,28 +315,12 @@
     this.proxyIsUserModified_ = false;
   }
 
-  /** @private */
-  useSameProxyChanged_() {
+  private useSameProxyChanged_(): void {
     this.proxyIsUserModified_ = true;
   }
 
-  /**
-   * @return {!ManagedProxySettings}
-   * @private
-   */
-  createDefaultProxySettings_() {
-    return {
-      type: OncMojo.createManagedString('Direct'),
-    };
-  }
-
-  /**
-   * @param {?ManagedProxyLocation|undefined}
-   *     location
-   * @return {!ProxyLocation|undefined}
-   * @private
-   */
-  getProxyLocation_(location) {
+  private getProxyLocation_(location: ManagedProxyLocation|undefined|
+                            null): ProxyLocation|undefined {
     if (!location) {
       return undefined;
     }
@@ -365,43 +332,38 @@
 
   /**
    * Called when the proxy changes in the UI.
-   * @private
    */
-  sendProxyChange_() {
+  private sendProxyChange_(): void {
     const proxyType = OncMojo.getActiveString(this.proxy_.type);
     if (!proxyType || (proxyType === 'PAC' && !this.proxy_.pac)) {
       return;
     }
 
-    const proxy = /** @type {!ProxySettings} */ ({
-      type: proxyType,
-      excludeDomains: OncMojo.getActiveValue(this.proxy_.excludeDomains),
-    });
+    const proxy = new ProxySettings();
+    proxy.type = proxyType;
+    proxy.excludeDomains =
+        OncMojo.getActiveValue(this.proxy_.excludeDomains) as string[] |
+        undefined;
 
     if (proxyType === 'Manual') {
-      let manual = {};
+      let manual = new ManualProxySettings();
       if (this.proxy_.manual) {
-        this.savedManual_ =
-            /** @type{!ManagedManualProxySettings}*/ (
-                Object.assign({}, this.proxy_.manual));
+        this.savedManual_ = {...this.proxy_.manual};
         manual = {
           httpProxy: this.getProxyLocation_(this.proxy_.manual.httpProxy),
           secureHttpProxy:
               this.getProxyLocation_(this.proxy_.manual.secureHttpProxy),
+          ftpProxy: undefined,
           socks: this.getProxyLocation_(this.proxy_.manual.socks),
         };
       }
       if (this.proxy_.excludeDomains) {
-        this.savedExcludeDomains_ =
-            /** @type{!ManagedStringList}*/ (
-                Object.assign({}, this.proxy_.excludeDomains));
+        this.savedExcludeDomains_ = {...this.proxy_.excludeDomains};
       }
       const defaultProxy = manual.httpProxy || {host: '', port: 80};
       if (this.useSameProxy_) {
-        manual.secureHttpProxy =
-            /** @type {!ProxyLocation} */ (Object.assign({}, defaultProxy));
-        manual.socks =
-            /** @type {!ProxyLocation} */ (Object.assign({}, defaultProxy));
+        manual.secureHttpProxy = {...defaultProxy};
+        manual.socks = {...defaultProxy};
       } else {
         // Remove properties with empty hosts to unset them.
         if (manual.httpProxy && !manual.httpProxy.host) {
@@ -428,14 +390,12 @@
 
   /**
    * Event triggered when the selected proxy type changes.
-   * @param {!Event} event
-   * @private
    */
-  onTypeChange_(event) {
+  private onTypeChange_(event: Event): void {
     if (!this.proxy_ || !this.proxy_.type) {
       return;
     }
-    const target = /** @type {!HTMLSelectElement} */ (event.target);
+    const target = event.target as HTMLSelectElement;
     const type = target.value;
     this.proxy_.type.activeValue = type;
     this.set('proxy_', this.validateProxy_(this.proxy_));
@@ -448,7 +408,7 @@
         proxyTypeChangeIsReady = true;
         break;
       case 'PAC':
-        elementToFocus = this.shadowRoot.querySelector('#pacInput');
+        elementToFocus = this.shadowRoot!.querySelector('#pacInput');
         // If a PAC is already set, send the type change now, otherwise wait
         // until the user provides a PAC value.
         proxyTypeChangeIsReady = !!OncMojo.getActiveString(this.proxy_.pac);
@@ -458,7 +418,7 @@
         // until the 'send' button is clicked.
         proxyTypeChangeIsReady = false;
         elementToFocus =
-            this.shadowRoot.querySelector('#manualProxy network-proxy-input');
+            this.shadowRoot!.querySelector('#manualProxy network-proxy-input');
         break;
     }
 
@@ -476,18 +436,15 @@
     }
   }
 
-  /** @private */
-  onPACChange_() {
+  private onPacChange_(): void {
     this.sendProxyChange_();
   }
 
-  /** @private */
-  onProxyInputChange_() {
+  private onProxyInputChange_(): void {
     this.proxyIsUserModified_ = true;
   }
 
-  /** @private */
-  onAddProxyExclusionTap_() {
+  private onAddProxyExclusionClicked_(): void {
     assert(this.proxyExclusionInputValue_);
     this.push(
         'proxy_.excludeDomains.activeValue', this.proxyExclusionInputValue_);
@@ -496,47 +453,31 @@
     this.proxyIsUserModified_ = true;
   }
 
-  /**
-   * @param {!Event} event
-   * @private
-   */
-  onAddProxyExclusionKeypress_(event) {
+  private onAddProxyExclusionKeypress_(event: KeyboardEvent): void {
     if (event.key !== 'Enter') {
       return;
     }
     event.stopPropagation();
-    this.onAddProxyExclusionTap_();
+    this.onAddProxyExclusionClicked_();
   }
 
-  /**
-   * @param {string} proxyExclusionInputValue
-   * @return {boolean}
-   * @private
-   */
-  shouldProxyExclusionButtonBeDisabled_(proxyExclusionInputValue) {
+  private shouldProxyExclusionButtonBeDisabled_(proxyExclusionInputValue:
+                                                    string): boolean {
     return !proxyExclusionInputValue;
   }
 
   /**
    * Event triggered when the proxy exclusion list changes.
-   * @param {!Event} event The remove proxy exclusions change event.
-   * @private
    */
-  onProxyExclusionsChange_(event) {
+  private onProxyExclusionsChange_(): void {
     this.proxyIsUserModified_ = true;
   }
 
-  /** @private */
-  onSaveProxyTap_() {
+  private onSaveProxyClicked_(): void {
     this.sendProxyChange_();
   }
 
-  /**
-   * @param {string} proxyType The proxy type.
-   * @return {string} The description for |proxyType|.
-   * @private
-   */
-  getProxyTypeDesc_(proxyType) {
+  private getProxyTypeDesc_(proxyType: string): string {
     if (proxyType === 'Manual') {
       return this.i18n('networkProxyTypeManual');
     }
@@ -549,38 +490,25 @@
     return this.i18n('networkProxyTypeDirect');
   }
 
-  /**
-   * @param {string} propertyName
-   * @return {boolean} Whether the named property setting is editable.
-   * @private
-   */
-  isEditable_(propertyName) {
+  private isEditable_(propertyName: string): boolean {
     if (!this.editable || (this.isShared_() && !this.useSharedProxies)) {
       return false;
     }
-    const property = /** @type {!OncMojo.ManagedProperty|undefined} */ (
-        this.get('proxySettings.' + propertyName, this.managedProperties));
+    const property =
+        this.get('proxySettings.' + propertyName, this.managedProperties);
     if (!property) {
       return true;  // Default to editable if property is not defined.
     }
     return this.isPropertyEditable_(property);
   }
 
-  /**
-   * @param {!OncMojo.ManagedProperty|undefined} property
-   * @return {boolean} Whether |property| is editable.
-   * @private
-   */
-  isPropertyEditable_(property) {
+  private isPropertyEditable_(property: OncMojo.ManagedProperty|
+                              undefined): boolean {
     return !!property && !this.isNetworkPolicyEnforced(property) &&
         !this.isExtensionControlled(property);
   }
 
-  /**
-   * @return {boolean}
-   * @private
-   */
-  isShared_() {
+  private isShared_(): boolean {
     if (!this.managedProperties) {
       return false;
     }
@@ -588,11 +516,7 @@
     return source === OncSource.kDevice || source === OncSource.kDevicePolicy;
   }
 
-  /**
-   * @return {boolean}
-   * @private
-   */
-  isSaveManualProxyEnabled_() {
+  private isSaveManualProxyEnabled_(): boolean {
     if (!this.proxyIsUserModified_) {
       return false;
     }
@@ -606,13 +530,7 @@
         !!this.get('socks.host.activeValue', manual);
   }
 
-  /**
-   * @param {string} property The property to test
-   * @param {string} value The value to test against
-   * @return {boolean} True if property === value
-   * @private
-   */
-  matches_(property, value) {
+  private matches_(property: string, value: string): boolean {
     return property === value;
   }
 }
diff --git a/ash/webui/demo_mode_app_ui/resources/demo_mode_metrics_service.js b/ash/webui/demo_mode_app_ui/resources/demo_mode_metrics_service.js
index 914b5d2..5eee8a8 100644
--- a/ash/webui/demo_mode_app_ui/resources/demo_mode_metrics_service.js
+++ b/ash/webui/demo_mode_app_ui/resources/demo_mode_metrics_service.js
@@ -81,6 +81,11 @@
 
   // Enum shared between CB & CBX are: BATTERY, GOOGLE_APPS, NEARBY_SHARE,
   // MESSAGING, BUILT_IN_SECURITY,MS_365_APPS, SWITCHING, COMPARISON
+
+  // New in 2024 Cycle 2 refresh
+  // CBX:
+  HELP_ME_READ: 'HelpMeRead',
+  LIVE_TRANSLATE: 'LiveTranslate',
 };
 
 /**
diff --git a/base/allocator/partition_allocator/partition_alloc.gni b/base/allocator/partition_allocator/partition_alloc.gni
index b78f042..423c081 100644
--- a/base/allocator/partition_allocator/partition_alloc.gni
+++ b/base/allocator/partition_allocator/partition_alloc.gni
@@ -286,12 +286,21 @@
 # PartitionAlloc at all. If `use_partition_alloc` is false, we jam all
 # related args to `false`.
 #
+# We also disable PA-Everywhere and PA-based features in two types of
+# toolchains:
+# - Toolchains that disable PA-Everywhere explicitly.
+# - The rust host build tools toochain, which builds DLLs to dlopen into the
+#   compiler for proc macros. We would want any allocations to use the same
+#   paths as the compiler.
+#
 # Do not clear the following, as they can function outside of PartitionAlloc
 # - has_64_bit_pointers
 # - has_memory_tagging
 if (!use_partition_alloc ||
     (defined(toolchain_allows_use_partition_alloc_as_malloc) &&
-     !toolchain_allows_use_partition_alloc_as_malloc)) {
+     !toolchain_allows_use_partition_alloc_as_malloc) ||
+    (defined(toolchain_for_rust_host_build_tools) &&
+     toolchain_for_rust_host_build_tools)) {
   use_partition_alloc_as_malloc = false
   glue_core_pools = false
   enable_backup_ref_ptr_support = false
diff --git a/base/android/javatests/src/org/chromium/base/task/ChainedTasksTest.java b/base/android/javatests/src/org/chromium/base/task/ChainedTasksTest.java
index e60442c..9c0b5df 100644
--- a/base/android/javatests/src/org/chromium/base/task/ChainedTasksTest.java
+++ b/base/android/javatests/src/org/chromium/base/task/ChainedTasksTest.java
@@ -132,7 +132,7 @@
                         secondTaskFinished.notifyCalled();
                         waitForHighPriorityTask.waitForOnly();
                     } catch (TimeoutException e) {
-                        Assert.fail();
+                        throw new RuntimeException(e);
                     }
                 });
         tasks.add(TaskTraits.UI_DEFAULT, new TestRunnable(messages, "Third"));
diff --git a/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java b/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java
index 69431443..66ad3c1 100644
--- a/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java
+++ b/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java
@@ -124,6 +124,7 @@
         mHost2 = null;
     }
 
+    @SuppressWarnings({"SelfAssertion", "JUnitIncompatibleType"})
     @Test
     public void testKeyEquality() {
         assertEquals(Foo.KEY, Foo.KEY);
diff --git a/base/hash/sha1_boringssl.cc b/base/hash/sha1_boringssl.cc
index 957ee47e..90eeac7 100644
--- a/base/hash/sha1_boringssl.cc
+++ b/base/hash/sha1_boringssl.cc
@@ -36,7 +36,7 @@
   SHA1_Init(&context);
 }
 
-void SHA1Update(const std::string_view data, SHA1Context& context) {
+void SHA1Update(std::string_view data, SHA1Context& context) {
   SHA1_Update(&context, data.data(), data.size());
 }
 
diff --git a/base/test/launcher/test_launcher.cc b/base/test/launcher/test_launcher.cc
index 633a4875..99cf980 100644
--- a/base/test/launcher/test_launcher.cc
+++ b/base/test/launcher/test_launcher.cc
@@ -962,7 +962,7 @@
 
 // Truncates a snippet in the middle to the given byte limit. byte_limit should
 // be at least 30.
-std::string TruncateSnippet(const std::string_view snippet, size_t byte_limit) {
+std::string TruncateSnippet(std::string_view snippet, size_t byte_limit) {
   if (snippet.length() <= byte_limit) {
     return std::string(snippet);
   }
@@ -2385,7 +2385,7 @@
   return snippet;
 }
 
-std::string TruncateSnippetFocused(const std::string_view snippet,
+std::string TruncateSnippetFocused(std::string_view snippet,
                                    size_t byte_limit) {
   // Find the start of anything that looks like a fatal log message.
   // We want to preferentially preserve these from truncation as we
diff --git a/base/test/launcher/test_launcher.h b/base/test/launcher/test_launcher.h
index 3d71a6f..ffae4e7 100644
--- a/base/test/launcher/test_launcher.h
+++ b/base/test/launcher/test_launcher.h
@@ -393,8 +393,7 @@
 
 // Truncates a snippet to approximately the allowed length, while trying to
 // retain fatal messages. Exposed for testing only.
-std::string TruncateSnippetFocused(const std::string_view snippet,
-                                   size_t byte_limit);
+std::string TruncateSnippetFocused(std::string_view snippet, size_t byte_limit);
 
 }  // namespace base
 
diff --git a/base/test/scoped_feature_list_unittest.cc b/base/test/scoped_feature_list_unittest.cc
index b98223b6..60fe222 100644
--- a/base/test/scoped_feature_list_unittest.cc
+++ b/base/test/scoped_feature_list_unittest.cc
@@ -39,7 +39,7 @@
   EXPECT_EQ(disabled_features, actual_disabled_features);
 }
 
-std::string GetActiveFieldTrialGroupName(const std::string trial_name) {
+std::string GetActiveFieldTrialGroupName(const std::string& trial_name) {
   FieldTrial::ActiveGroups groups;
   FieldTrialList::GetActiveFieldTrialGroups(&groups);
   for (const auto& group : groups) {
diff --git a/base/test/test_proto_loader.cc b/base/test/test_proto_loader.cc
index 8ee91dfd..01acd65a 100644
--- a/base/test/test_proto_loader.cc
+++ b/base/test/test_proto_loader.cc
@@ -63,7 +63,7 @@
 TestProtoSetLoader::~TestProtoSetLoader() = default;
 
 std::string TestProtoSetLoader::ParseFromText(
-    const std::string_view type_name,
+    std::string_view type_name,
     const std::string& proto_text) const {
   // Create a message of the given type, parse, and return.
   std::unique_ptr<google::protobuf::Message> message =
@@ -74,7 +74,7 @@
 }
 
 std::string TestProtoSetLoader::PrintToText(
-    const std::string_view type_name,
+    std::string_view type_name,
     const std::string& serialized_message) const {
   // Create a message of the given type, read the serialized message, and
   // print to text format.
diff --git a/base/trace_event/memory_dump_manager_unittest.cc b/base/trace_event/memory_dump_manager_unittest.cc
index da4cd52a2..6b9f562 100644
--- a/base/trace_event/memory_dump_manager_unittest.cc
+++ b/base/trace_event/memory_dump_manager_unittest.cc
@@ -241,7 +241,7 @@
     mdm_->SetupForTracing(TraceConfig::MemoryDumpConfig());
   }
 
-  void EnableForTracingWithTraceConfig(const std::string trace_config_string) {
+  void EnableForTracingWithTraceConfig(const std::string& trace_config_string) {
     TraceConfig trace_config(trace_config_string);
     mdm_->SetupForTracing(trace_config.memory_dump_config());
   }
diff --git a/third_party/crubit/BUILD.gn b/build/rust/crubit/BUILD.gn
similarity index 90%
rename from third_party/crubit/BUILD.gn
rename to build/rust/crubit/BUILD.gn
index a14822b6..2bc6eb0 100644
--- a/third_party/crubit/BUILD.gn
+++ b/build/rust/crubit/BUILD.gn
@@ -2,11 +2,12 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/rust.gni")
 import("//build/rust/rust_macro.gni")
 import("//build/rust/rust_static_library.gni")
 
 # Common constants.
-_support_dir = "src/rs_bindings_from_cc/support"
+_support_dir = "{rust_sysroot}/lib/crubit"
 
 # Dependencies of ..._rs_api.rs files generated by Crubit's
 # `bin/rs_bindings_from_cc` tool.  See also `deps_for_generated_rs_file` in
@@ -31,6 +32,8 @@
   ]
 }
 
+# TODO: crbug.com/40226863 - Crubit should publish a Cargo.toml for these
+# crates, then we can generate rules for them dynamically with gnrt.
 rust_static_library("ctor") {
   crate_root = "${_support_dir}/ctor.rs"
   sources = [ "${_support_dir}/ctor.rs" ]
diff --git a/build/rust/rustc_wrapper.py b/build/rust/rustc_wrapper.py
index b8e490d..8f2096dfe 100755
--- a/build/rust/rustc_wrapper.py
+++ b/build/rust/rustc_wrapper.py
@@ -177,6 +177,7 @@
     # Work around for "-l<foo>.lib", where ".lib" suffix is undesirable.
     # Full fix will come from https://gn-review.googlesource.com/c/gn/+/12480
     rsp_args = [remove_lib_suffix_from_l_args(arg) for arg in rsp_args]
+    rustc_args = [remove_lib_suffix_from_l_args(arg) for arg in rustc_args]
   out_rsp = str(args.rsp) + ".rsp"
   with open(out_rsp, 'w') as rspfile:
     # rustc needs the rsp file to be separated by newlines. Note that GN
diff --git a/cc/slim/frame_sink.cc b/cc/slim/frame_sink.cc
index d780a9d..1287001 100644
--- a/cc/slim/frame_sink.cc
+++ b/cc/slim/frame_sink.cc
@@ -6,9 +6,12 @@
 
 #include <utility>
 
+#include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "cc/slim/delayed_scheduler.h"
 #include "cc/slim/frame_sink_impl.h"
+#include "cc/slim/simple_scheduler.h"
+#include "components/viz/common/features.h"
 
 namespace cc::slim {
 
@@ -23,6 +26,15 @@
     // Parameters below only used when wrapping cc.
     gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     base::PlatformThreadId io_thread_id) {
+#if BUILDFLAG(IS_ANDROID)
+  if (base::FeatureList::IsEnabled(features::kAndroidBcivWithSimpleScheduler)) {
+    return base::WrapUnique<FrameSink>(new FrameSinkImpl(
+        std::move(task_runner),
+        std::move(compositor_frame_sink_associated_remote),
+        std::move(client_receiver), std::move(context_provider), io_thread_id,
+        std::make_unique<SimpleScheduler>()));
+  }
+#endif
   return base::WrapUnique<FrameSink>(
       new FrameSinkImpl(std::move(task_runner),
                         std::move(compositor_frame_sink_associated_remote),
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 33c1c45..f0559ab 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -293,7 +293,6 @@
   java_group("delegate_public_impl_java") {
     deps = [
       "//chrome/android/modules/readaloud/public:provider_public_java",
-      "//chrome/browser/lens:delegate_public_impl_java",
       "//chrome/browser/locale:delegate_public_impl_java",
       "//chrome/browser/supervised_user:parent_auth_delegate_impl_java",
       "//chrome/browser/touch_to_fill/password_manager/android/internal:resource_provider_public_impl_java",
@@ -1067,7 +1066,6 @@
       "//chrome/browser/incognito:java",
       "//chrome/browser/language/android:java",
       "//chrome/browser/language/android:junit",
-      "//chrome/browser/lens:delegate_public_impl_java",
       "//chrome/browser/lens:java",
       "//chrome/browser/loading_modal/android:junit",
       "//chrome/browser/locale:java",
@@ -2592,6 +2590,7 @@
       "//base:base_java",
       "//base:base_java_test_support",
       "//build/android:build_java",
+      "//chrome/browser/autofill/test:test_support_java",
       "//chrome/browser/download/android:java",
       "//chrome/browser/prefetch/android:java",
       "//chrome/browser/profiles/android:java",
@@ -2624,6 +2623,7 @@
       ":test_support_jni_headers",
       "//chrome/browser",
       "//chrome/browser:browser_process",
+      "//chrome/browser/autofill/test:test_support",
       "//chrome/browser/sync",
       "//chrome/browser/thumbnail:test_support",
       "//components/offline_pages/core/background:test_support",
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
index 1549000..a2bc9ba 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
@@ -41,7 +41,6 @@
 import org.chromium.chrome.browser.tab.TabSelectionType;
 import org.chromium.chrome.browser.tab_group_sync.TabGroupSyncFeatures;
 import org.chromium.chrome.browser.tab_group_sync.TabGroupSyncServiceFactory;
-import org.chromium.chrome.browser.tab_group_sync.TabGroupSyncUtils;
 import org.chromium.chrome.browser.tab_ui.RecyclerViewPosition;
 import org.chromium.chrome.browser.tab_ui.TabUiThemeUtils;
 import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
@@ -69,7 +68,6 @@
 import org.chromium.components.browser_ui.widget.gesture.BackPressHandler;
 import org.chromium.components.data_sharing.DataSharingService;
 import org.chromium.components.signin.identitymanager.IdentityManager;
-import org.chromium.components.tab_group_sync.LocalTabGroupId;
 import org.chromium.components.tab_group_sync.TabGroupSyncService;
 import org.chromium.components.tab_groups.TabGroupColorId;
 import org.chromium.ui.KeyboardVisibilityDelegate;
@@ -989,10 +987,7 @@
         mModel.set(TabGridDialogProperties.IS_SHARE_SHEET_VISIBLE, true);
 
         String tabGroupDisplayName = mModel.get(TabGridDialogProperties.HEADER_TITLE);
-
         TabGroupModelFilter filter = (TabGroupModelFilter) mCurrentTabModelFilterSupplier.get();
-        Tab tab = filter.getTabModel().getTabById(mCurrentTabId);
-        LocalTabGroupId localTabGroupId = TabGroupSyncUtils.getLocalTabGroupId(tab);
 
         TabUiUtils.startShareTabGroupFlow(
                 mActivity,
@@ -1082,7 +1077,8 @@
             String originalTitle = TabGroupTitleEditor.getDefaultTitle(mActivity, tabsCount);
             mModel.set(
                     TabGridDialogProperties.COLLAPSE_BUTTON_CONTENT_DESCRIPTION,
-                    mActivity.getResources()
+                    mActivity
+                            .getResources()
                             .getQuantityString(
                                     R.plurals.accessibility_dialog_back_button,
                                     tabsCount,
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
index d79192e6..bdf5572 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
@@ -481,14 +481,14 @@
         mRecyclerView.setRecyclerViewPosition(recyclerViewPosition);
     }
 
-    void initWithNative(@NonNull Profile profile) {
+    void initWithNative(@NonNull Profile originalProfile) {
         if (mIsInitialized) return;
 
         try (TraceEvent e = TraceEvent.scoped("TabListCoordinator.initWithNative")) {
             mIsInitialized = true;
 
-            assert !profile.isOffTheRecord() : "Expecting a non-incognito profile.";
-            mMediator.initWithNative(profile);
+            assert !originalProfile.isOffTheRecord() : "Expecting a non-incognito profile.";
+            mMediator.initWithNative(originalProfile);
         }
     }
 
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
index aa6c4cc..38e61ae 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -363,7 +363,7 @@
     private boolean mActionsOnAllRelatedTabs;
     private String mComponentName;
     private @TabActionState int mTabActionState;
-    private @Nullable Profile mProfile;
+    private @Nullable Profile mOriginalProfile;
     private TabListGroupMenuCoordinator mTabListGroupMenuCoordinator;
     private Size mDefaultGridCardSize;
     private ComponentCallbacks mComponentCallbacks;
@@ -912,7 +912,6 @@
         mActionConfirmationManager = actionConfirmationManager;
         mOnTabGroupCreation = onTabGroupCreation;
 
-        mProfile = mCurrentTabModelFilterSupplier.get().getTabModel().getProfile();
         mTabModelObserver =
                 new TabModelObserver() {
                     @Override
@@ -1282,10 +1281,10 @@
         }
     }
 
-    public void initWithNative(Profile profile) {
-        assert !profile.isOffTheRecord() : "Expecting a non-incognito profile.";
-        mProfile = profile;
-        mTabListFaviconProvider.initWithNative(profile);
+    public void initWithNative(Profile originalProfile) {
+        assert !originalProfile.isOffTheRecord() : "Expecting a non-incognito profile.";
+        mOriginalProfile = originalProfile;
+        mTabListFaviconProvider.initWithNative(originalProfile);
 
         mOnTabModelFilterChanged.onResult(
                 mCurrentTabModelFilterSupplier.addObserver(mOnTabModelFilterChanged));
@@ -1335,7 +1334,7 @@
         // switcher.
         if (mMode == TabListMode.GRID
                 && mTabActionState != TabActionState.SELECTABLE
-                && PriceTrackingFeatures.isPriceTrackingEnabled(profile)) {
+                && PriceTrackingFeatures.isPriceTrackingEnabled(originalProfile)) {
             mListObserver =
                     new ListObserver<Void>() {
                         @Override
@@ -1552,10 +1551,11 @@
 
     void hardCleanup() {
         assert !mShowingTabs;
-        if (mProfile != null
-                && PriceTrackingUtilities.isTrackPricesOnTabsEnabled(mProfile)
-                && (PriceTrackingFeatures.isPriceDropIphEnabled(mProfile)
-                        || PriceTrackingFeatures.isPriceDropBadgeEnabled(mProfile))) {
+        if (!mCurrentTabModelFilterSupplier.get().isIncognitoBranded()
+                && mOriginalProfile != null
+                && PriceTrackingUtilities.isTrackPricesOnTabsEnabled(mOriginalProfile)
+                && (PriceTrackingFeatures.isPriceDropIphEnabled(mOriginalProfile)
+                        || PriceTrackingFeatures.isPriceDropBadgeEnabled(mOriginalProfile))) {
             saveSeenPriceDrops();
         }
         sViewedTabIds.clear();
@@ -1726,11 +1726,12 @@
     void registerOnScrolledListener(RecyclerView recyclerView) {
         // For InstantStart, this can be called before native is initialized, so ensure the Profile
         // is available before proceeding.
-        if (mProfile == null) return;
+        if (mOriginalProfile == null) return;
 
-        if (PriceTrackingUtilities.isTrackPricesOnTabsEnabled(mProfile)
-                && (PriceTrackingFeatures.isPriceDropIphEnabled(mProfile)
-                        || PriceTrackingFeatures.isPriceDropBadgeEnabled(mProfile))) {
+        if (!mCurrentTabModelFilterSupplier.get().isIncognitoBranded()
+                && PriceTrackingUtilities.isTrackPricesOnTabsEnabled(mOriginalProfile)
+                && (PriceTrackingFeatures.isPriceDropIphEnabled(mOriginalProfile)
+                        || PriceTrackingFeatures.isPriceDropBadgeEnabled(mOriginalProfile))) {
             mRecyclerView = recyclerView;
             mOnScrollListener =
                     new OnScrollListener() {
@@ -1882,17 +1883,18 @@
 
     private TabListMediator.TabActionListener getTabGroupOverflowMenuClickListener() {
         if (mTabListGroupMenuCoordinator == null) {
-            boolean isTabGroupSyncEnabled = TabGroupSyncFeatures.isTabGroupSyncEnabled(mProfile);
-            TabModel tabModel = mCurrentTabModelFilterSupplier.get().getTabModel();
-            Profile profile = tabModel.getProfile().getOriginalProfile();
+            boolean isTabGroupSyncEnabled =
+                    !mCurrentTabModelFilterSupplier.get().isIncognitoBranded()
+                            && TabGroupSyncFeatures.isTabGroupSyncEnabled(mOriginalProfile);
             IdentityManager identityManager = null;
             TabGroupSyncService tabGroupSyncService = null;
             DataSharingService dataSharingService = null;
             if (isTabGroupSyncEnabled
                     && ChromeFeatureList.isEnabled(ChromeFeatureList.DATA_SHARING)) {
-                identityManager = IdentityServicesProvider.get().getIdentityManager(profile);
-                tabGroupSyncService = TabGroupSyncServiceFactory.getForProfile(profile);
-                dataSharingService = DataSharingServiceFactory.getForProfile(profile);
+                identityManager =
+                        IdentityServicesProvider.get().getIdentityManager(mOriginalProfile);
+                tabGroupSyncService = TabGroupSyncServiceFactory.getForProfile(mOriginalProfile);
+                dataSharingService = DataSharingServiceFactory.getForProfile(mOriginalProfile);
             }
             mTabListGroupMenuCoordinator =
                     new TabListGroupMenuCoordinator(
@@ -2230,8 +2232,8 @@
     private void setupPersistedTabDataFetcherForTab(Tab tab, int index) {
         PropertyModel model = mModel.get(index).model;
         if (mMode == TabListMode.GRID && !tab.isIncognito()) {
-            assert mProfile != null;
-            if (PriceTrackingUtilities.isTrackPricesOnTabsEnabled(mProfile)
+            assert mOriginalProfile != null;
+            if (PriceTrackingUtilities.isTrackPricesOnTabsEnabled(mOriginalProfile)
                     && !isTabInTabGroup(tab)) {
                 model.set(
                         TabProperties.SHOPPING_PERSISTED_TAB_DATA_FETCHER,
@@ -2386,8 +2388,9 @@
     void updateLayout() {
         // Right now we need to update layout only if there is a price welcome message card in tab
         // switcher.
-        if (mProfile == null
-                || !PriceTrackingUtilities.isPriceWelcomeMessageCardEnabled(mProfile)) {
+        if (mOriginalProfile == null
+                || !PriceTrackingUtilities.isPriceWelcomeMessageCardEnabled(mOriginalProfile)
+                || mCurrentTabModelFilterSupplier.get().isIncognitoBranded()) {
             return;
         }
         assert mGridLayoutManager != null;
@@ -2424,9 +2427,10 @@
     @VisibleForTesting
     void recordPriceAnnotationsEnabledMetrics() {
         if (mMode != TabListMode.GRID
+                || mCurrentTabModelFilterSupplier.get().isIncognitoBranded()
                 || !mActionsOnAllRelatedTabs
-                || mProfile == null
-                || !PriceTrackingFeatures.isPriceTrackingEligible(mProfile)) {
+                || mOriginalProfile == null
+                || !PriceTrackingFeatures.isPriceTrackingEligible(mOriginalProfile)) {
             return;
         }
         SharedPreferencesManager preferencesManager = ChromeSharedPreferences.getInstance();
@@ -2438,7 +2442,7 @@
                 >= PriceTrackingFeatures.getAnnotationsEnabledMetricsWindowDurationMilliSeconds()) {
             RecordHistogram.recordBooleanHistogram(
                     "Commerce.PriceDrop.AnnotationsEnabled",
-                    PriceTrackingUtilities.isTrackPricesOnTabsEnabled(mProfile));
+                    PriceTrackingUtilities.isTrackPricesOnTabsEnabled(mOriginalProfile));
             preferencesManager.writeLong(
                     ChromePreferenceKeys.PRICE_TRACKING_ANNOTATIONS_ENABLED_METRICS_TIMESTAMP,
                     System.currentTimeMillis());
@@ -2768,7 +2772,9 @@
 
     @VisibleForTesting
     void onMenuItemClicked(@IdRes int menuId, int tabId, @Nullable String collaborationId) {
-        boolean isSyncEnabled = TabGroupSyncFeatures.isTabGroupSyncEnabled(mProfile);
+        boolean isSyncEnabled =
+                !mCurrentTabModelFilterSupplier.get().isIncognitoBranded()
+                        && TabGroupSyncFeatures.isTabGroupSyncEnabled(mOriginalProfile);
         if (menuId == R.id.close_tab || menuId == R.id.delete_tab) {
             boolean hideTabGroups = menuId == R.id.close_tab;
             if (hideTabGroups) {
@@ -2949,8 +2955,7 @@
 
         @Nullable TabGroupSyncService tabGroupSyncService = null;
         if (TabGroupSyncFeatures.isTabGroupSyncEnabled(tab.getProfile())) {
-            tabGroupSyncService =
-                    TabGroupSyncServiceFactory.getForProfile(tab.getProfile().getOriginalProfile());
+            tabGroupSyncService = TabGroupSyncServiceFactory.getForProfile(mOriginalProfile);
         }
         @Nullable
         String collaborationId =
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewBinder.java
index 0d67b13..370a260 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewBinder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewBinder.java
@@ -272,7 +272,7 @@
     }
 
     private static void setTabGroupColorIcon(ViewGroup view, PropertyModel model) {
-        ImageView colorIconView = view.findViewById(R.id.icon);
+        ImageView colorIconView = view.findViewById(R.id.before_title_icon);
 
         if (ChromeFeatureList.sTabGroupParityAndroid.isEnabled()) {
             colorIconView.setVisibility(View.VISIBLE);
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogViewBinderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogViewBinderTest.java
index 005cd26..d45be3a 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogViewBinderTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogViewBinderTest.java
@@ -192,9 +192,9 @@
         assertNull(mTabGridDialogView.getBindingToken());
 
         String title = "1024 tabs";
-        assertNotEquals(title, mTitleTextView.getText());
+        assertNotEquals(title, mTitleTextView.getText().toString());
         mModel.set(TabGridDialogProperties.HEADER_TITLE, title);
-        assertNotEquals(title, mTitleTextView.getText());
+        assertNotEquals(title, mTitleTextView.getText().toString());
 
         mModel.set(TabGridDialogProperties.BINDING_TOKEN, 4);
         assertEquals(mTabGridDialogView.getBindingToken().intValue(), 4);
@@ -240,7 +240,7 @@
     @UiThreadTest
     public void testSetHeaderTitle() {
         String title = "1024 tabs";
-        assertNotEquals(title, mTitleTextView.getText());
+        assertNotEquals(title, mTitleTextView.getText().toString());
 
         mModel.set(TabGridDialogProperties.HEADER_TITLE, title);
 
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java
index 1d02880..ac8d0c15 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java
@@ -1027,7 +1027,7 @@
         final int colorId = TabGroupColorId.BLUE;
         final int colorLayer = 1;
 
-        ImageView colorIconView = mTabListView.findViewById(R.id.icon);
+        ImageView colorIconView = mTabListView.findViewById(R.id.before_title_icon);
         assertNull(colorIconView.getBackground());
 
         mGridModel.set(TabProperties.TAB_GROUP_COLOR_ID, colorId);
@@ -1059,7 +1059,7 @@
 
         mGridModel.set(TabProperties.TAB_GROUP_COLOR_ID, colorId1);
 
-        ImageView colorIconView = mTabListView.findViewById(R.id.icon);
+        ImageView colorIconView = mTabListView.findViewById(R.id.before_title_icon);
         assertEquals(colorIconView.getVisibility(), View.VISIBLE);
         assertNotNull(colorIconView.getBackground());
 
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
index ddf89a8..8a6a654c 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -77,8 +77,9 @@
 import org.mockito.InOrder;
 import org.mockito.Mock;
 import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
 import org.mockito.invocation.InvocationOnMock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
 import org.mockito.stubbing.Answer;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
@@ -201,7 +202,7 @@
 @LooperMode(LooperMode.Mode.LEGACY)
 @DisableFeatures(ChromeFeatureList.DATA_SHARING)
 public class TabListMediatorUnitTest {
-
+    @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
     @Rule public JniMocker mMocker = new JniMocker();
 
     private static final String TAB1_TITLE = "Tab1";
@@ -362,7 +363,6 @@
 
     @Before
     public void setUp() {
-        MockitoAnnotations.initMocks(this);
         mMocker.mock(UrlUtilitiesJni.TEST_HOOKS, mUrlUtilitiesJniMock);
         mMocker.mock(
                 OptimizationGuideBridgeFactoryJni.TEST_HOOKS,
@@ -655,7 +655,7 @@
     }
 
     @Test
-    public void updatesFaviconFetcher_SingleTab_GTS() {
+    public void updatesFaviconFetcher_SingleTab_Gts() {
         mModel.get(0).model.set(TabProperties.FAVICON_FETCHER, null);
         assertNull(mModel.get(0).model.get(TabProperties.FAVICON_FETCHER));
 
@@ -676,7 +676,7 @@
 
     @Test
     @DisableFeatures(ChromeFeatureList.TAB_GROUP_PARITY_ANDROID)
-    public void updatesFaviconFetcher_SingleTabGroup_GTS() {
+    public void updatesFaviconFetcher_SingleTabGroup_Gts() {
         mModel.get(0).model.set(TabProperties.FAVICON_FETCHER, null);
         assertNull(mModel.get(0).model.get(TabProperties.FAVICON_FETCHER));
 
@@ -691,7 +691,7 @@
     }
 
     @Test
-    public void updatesFaviconFetcher_SingleTab_NonGTS() {
+    public void updatesFaviconFetcher_SingleTab_NonGts() {
         mModel.get(0).model.set(TabProperties.FAVICON_FETCHER, null);
         assertNull(mModel.get(0).model.get(TabProperties.FAVICON_FETCHER));
 
@@ -712,7 +712,7 @@
 
     @Test
     @DisableFeatures(ChromeFeatureList.TAB_GROUP_PARITY_ANDROID)
-    public void updatesFaviconFetcher_TabGroup_GTS() {
+    public void updatesFaviconFetcher_TabGroup_Gts() {
         assertNotNull(mModel.get(0).model.get(TabProperties.FAVICON_FETCHER));
         mModel.get(0).model.set(TabProperties.FAVICON_FETCHER, null);
         // Assert that tab1 is in a group.
@@ -730,7 +730,7 @@
     }
 
     @Test
-    public void updatesFaviconFetcher_TabGroup_ListGTS() {
+    public void updatesFaviconFetcher_TabGroup_ListGts() {
         setUpTabListMediator(TabListMediatorType.TAB_SWITCHER, TabListMode.LIST);
 
         assertNotNull(mModel.get(0).model.get(TabProperties.FAVICON_FETCHER));
@@ -748,7 +748,7 @@
     }
 
     @Test
-    public void updatesFaviconFetcher_TabGroup_ListGTS_SingleTab() {
+    public void updatesFaviconFetcher_TabGroup_ListGts_SingleTab() {
         setUpTabListMediator(TabListMediatorType.TAB_SWITCHER, TabListMode.LIST);
 
         assertNotNull(mModel.get(0).model.get(TabProperties.FAVICON_FETCHER));
@@ -1208,7 +1208,7 @@
     }
 
     @Test
-    public void tabAddition_GTS() {
+    public void tabAddition_Gts() {
         Tab newTab = prepareTab(TAB3_ID, TAB3_TITLE, TAB3_URL);
         doReturn(mTab1).when(mTabGroupModelFilter).getTabAt(0);
         doReturn(mTab2).when(mTabGroupModelFilter).getTabAt(1);
@@ -1231,7 +1231,7 @@
     }
 
     @Test
-    public void tabAddition_GTS_delayAdd() {
+    public void tabAddition_Gts_delayAdd() {
         mMediator.setComponentNameForTesting(TabSwitcherPaneCoordinator.COMPONENT_NAME);
         initAndAssertAllProperties();
 
@@ -1285,7 +1285,7 @@
     }
 
     @Test
-    public void tabAddition_GTS_delayAdd_WithUnexpectedUpdate() {
+    public void tabAddition_Gts_delayAdd_WithUnexpectedUpdate() {
         mMediator.setComponentNameForTesting(TabSwitcherPaneCoordinator.COMPONENT_NAME);
         initAndAssertAllProperties();
 
@@ -1345,7 +1345,7 @@
     }
 
     @Test
-    public void tabAddition_GTS_Skip() {
+    public void tabAddition_Gts_Skip() {
         // Add a new tab to the group with mTab2.
         Tab newTab = prepareTab(TAB3_ID, TAB3_TITLE, TAB3_URL);
         doReturn(mTab1).when(mTabGroupModelFilter).getTabAt(0);
@@ -1368,7 +1368,7 @@
     }
 
     @Test
-    public void tabAddition_GTS_Middle() {
+    public void tabAddition_Gts_Middle() {
         Tab newTab = prepareTab(TAB3_ID, TAB3_TITLE, TAB3_URL);
         doReturn(mTab1).when(mTabGroupModelFilter).getTabAt(0);
         doReturn(newTab).when(mTabGroupModelFilter).getTabAt(1);
@@ -1758,7 +1758,7 @@
     }
 
     @Test
-    public void tabMoveOutOfGroup_GTS_Moved_Tab_Selected() {
+    public void tabMoveOutOfGroup_Gts_Moved_Tab_Selected() {
         // Assume that two tabs are in the same group before ungroup.
         List<Tab> tabs = new ArrayList<>(Arrays.asList(mTab2));
         mMediator.resetWithListOfTabs(tabs, false);
@@ -1787,7 +1787,7 @@
     }
 
     @Test
-    public void tabMoveOutOfGroup_GTS_Origin_Tab_Selected() {
+    public void tabMoveOutOfGroup_Gts_Origin_Tab_Selected() {
         // Assume that two tabs are in the same group before ungroup.
         List<Tab> tabs = new ArrayList<>(Arrays.asList(mTab1));
         mMediator.resetWithListOfTabs(tabs, false);
@@ -1813,7 +1813,7 @@
     }
 
     @Test
-    public void tabMoveOutOfGroup_GTS_LastTab() {
+    public void tabMoveOutOfGroup_Gts_LastTab() {
         // Assume that tab1 is a single tab group that became a single tab.
         List<Tab> tabs = new ArrayList<>(Arrays.asList(mTab1));
         mMediator.resetWithListOfTabs(tabs, false);
@@ -1835,7 +1835,7 @@
     }
 
     @Test
-    public void tabMoveOutOfGroup_GTS_TabAdditionWithSameId() {
+    public void tabMoveOutOfGroup_Gts_TabAdditionWithSameId() {
         // Assume that two tabs are in the same group before ungroup.
         List<Tab> tabs = new ArrayList<>(Arrays.asList(mTab1));
         mMediator.resetWithListOfTabs(tabs, false);
@@ -2566,7 +2566,7 @@
     }
 
     @Test
-    public void getLatestTitle_NotGTS() {
+    public void getLatestTitle_NotGts() {
         setUpTabListMediator(TabListMediatorType.TAB_GRID_DIALOG, TabListMode.GRID);
 
         // Mock that we have a stored title stored with reference to root ID of tab1.
@@ -2585,7 +2585,7 @@
     }
 
     @Test
-    public void getLatestTitle_SingleTabGroupSupported_GTS() {
+    public void getLatestTitle_SingleTabGroupSupported_Gts() {
         // Mock that we have a stored title stored with reference to root ID of tab1.
         mTabGroupModelFilter.setTabGroupTitle(mTab1.getRootId(), CUSTOMIZED_DIALOG_TITLE1);
         assertThat(
@@ -2603,7 +2603,7 @@
     }
 
     @Test
-    public void getLatestTitle_SingleTabGroupNotSupported_GTS() {
+    public void getLatestTitle_SingleTabGroupNotSupported_Gts() {
         // Mock that we have a stored title stored with reference to root ID of tab1.
         mTabGroupModelFilter.setTabGroupTitle(mTab1.getRootId(), CUSTOMIZED_DIALOG_TITLE1);
         assertThat(
@@ -2621,7 +2621,7 @@
     }
 
     @Test
-    public void getLatestTitle_Stored_GTS() {
+    public void getLatestTitle_Stored_Gts() {
         // Mock that we have a stored title stored with reference to root ID of tab1.
         mTabGroupModelFilter.setTabGroupTitle(mTab1.getRootId(), CUSTOMIZED_DIALOG_TITLE1);
         assertThat(
@@ -2638,7 +2638,7 @@
     }
 
     @Test
-    public void getLatestTitle_Default_GTS() {
+    public void getLatestTitle_Default_Gts() {
         // Mock that tab1 and tab2 are in the same group and group root id is TAB1_ID.
         List<Tab> tabs = new ArrayList<>(Arrays.asList(mTab1, mTab2));
         createTabGroup(tabs, TAB1_ID, TAB_GROUP_ID);
@@ -2648,7 +2648,7 @@
     }
 
     @Test
-    public void getLatestTitle_NoDefault_GTS() {
+    public void getLatestTitle_NoDefault_Gts() {
         // Mock that tab1 and tab2 are in the same group and group root id is TAB1_ID.
         List<Tab> tabs = new ArrayList<>(Arrays.asList(mTab1, mTab2));
         createTabGroup(tabs, TAB1_ID, TAB_GROUP_ID);
@@ -2658,7 +2658,7 @@
 
     @Test
     @DisableFeatures(ChromeFeatureList.TAB_GROUP_PARITY_ANDROID)
-    public void updateTabGroupTitle_GTS() {
+    public void updateTabGroupTitle_Gts() {
         setUpTabGroupCardDescriptionString();
         String targetString = "Expand tab group with 2 tabs.";
         assertThat(mModel.get(POSITION1).model.get(TabProperties.TITLE), equalTo(TAB1_TITLE));
@@ -2682,7 +2682,7 @@
 
     @Test
     @DisableFeatures(ChromeFeatureList.TAB_GROUP_PARITY_ANDROID)
-    public void updateTabGroupTitle_SingleTab_GTS() {
+    public void updateTabGroupTitle_SingleTab_Gts() {
         setUpTabGroupCardDescriptionString();
         String targetString = "Expand tab group with 1 tab.";
         assertThat(mModel.get(POSITION1).model.get(TabProperties.TITLE), equalTo(TAB1_TITLE));
@@ -2821,7 +2821,7 @@
     }
 
     @Test
-    public void testUrlUpdated_forSingleTab_GTS() {
+    public void testUrlUpdated_forSingleTab_Gts() {
         assertNotEquals(mNewDomain, mModel.get(POSITION1).model.get(TabProperties.URL_DOMAIN));
 
         doReturn(mNewDomain)
@@ -2836,7 +2836,7 @@
     }
 
     @Test
-    public void testUrlUpdated_forGroup_GTS() {
+    public void testUrlUpdated_forGroup_Gts() {
         List<Tab> tabs = new ArrayList<>(Arrays.asList(mTab1, mTab2));
         createTabGroup(tabs, TAB1_ID, TAB_GROUP_ID);
         doReturn(POSITION1).when(mTabGroupModelFilter).indexOf(mTab1);
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
index 8835864..10aca33a 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
@@ -550,8 +550,7 @@
         mSigninManager.getIdentityManager().addObserver(this);
 
         mSectionHeaderModel.set(SectionHeaderListProperties.MENU_MODEL_LIST_KEY, mFeedMenuModel);
-        mSectionHeaderModel.set(
-                SectionHeaderListProperties.MENU_DELEGATE_KEY, this::onItemSelected);
+        mSectionHeaderModel.set(SectionHeaderListProperties.MENU_DELEGATE_KEY, this);
 
         setUpWebFeedTab();
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index f2c63db..7e914be 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -2209,11 +2209,7 @@
                 };
 
         mUndoBarPopupController =
-                new UndoBarController(
-                        this,
-                        mTabModelSelector,
-                        this::getSnackbarManager,
-                        dialogVisibilitySupplier);
+                new UndoBarController(this, mTabModelSelector, this, dialogVisibilitySupplier);
 
         if (ChromeFeatureList.sTabGroupParityAndroid.isEnabled()) {
             TabModelUtils.runOnTabStateInitialized(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillCreditCardEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillCreditCardEditor.java
index 89a389b..8b5fe2f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillCreditCardEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillCreditCardEditor.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.autofill.settings;
 
-import android.os.Build;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
@@ -46,14 +45,6 @@
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         View v = super.onCreateView(inflater, container, savedInstanceState);
 
-        // Do not use autofill for the fields.
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            getActivity()
-                    .getWindow()
-                    .getDecorView()
-                    .setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);
-        }
-
         // Populate the billing address dropdown.
         ArrayAdapter<AutofillProfile> profilesAdapter =
                 new ArrayAdapter<AutofillProfile>(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillLocalIbanEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillLocalIbanEditor.java
index 87c478f..5d36f48 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillLocalIbanEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillLocalIbanEditor.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.autofill.settings;
 
-import android.os.Build;
 import android.os.Bundle;
 import android.text.Editable;
 import android.view.LayoutInflater;
@@ -60,14 +59,6 @@
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         View v = super.onCreateView(inflater, container, savedInstanceState);
 
-        // Do not use autofill for the fields.
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            getActivity()
-                    .getWindow()
-                    .getDecorView()
-                    .setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);
-        }
-
         PersonalDataManager personalDataManager =
                 PersonalDataManagerFactory.getForProfile(getProfile());
         mIban = personalDataManager.getIban(mGUID);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
index d03a16c..b1b7572 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -32,7 +32,6 @@
 import androidx.core.view.ViewCompat;
 import androidx.core.view.WindowCompat;
 import androidx.core.view.WindowInsetsCompat;
-import androidx.core.view.accessibility.AccessibilityEventCompat;
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
 import androidx.customview.widget.ExploreByTouchHelper;
 
@@ -1632,12 +1631,7 @@
 
     @Override
     public void invalidateAccessibilityProvider() {
-        if (mNodeProvider != null) {
-            mNodeProvider.sendEventForVirtualView(
-                    mNodeProvider.getAccessibilityFocusedVirtualViewId(),
-                    AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED);
-            mNodeProvider.invalidateRoot();
-        }
+        if (mNodeProvider != null) mNodeProvider.invalidateRoot();
     }
 
     // ChromeAccessibilityUtil.Observer
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java
index 45a2635a..2e19bcce 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java
@@ -280,7 +280,7 @@
 
     @Override
     public void getVirtualViews(List<VirtualView> views) {
-        if (isCollapsed()) return;
+        if (isCollapsed() || mIsDying) return;
         super.getVirtualViews(views);
         if (mShowingCloseButton) mCloseButton.getVirtualViews(views);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabGroupContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabGroupContextMenuCoordinator.java
index 30e7ed70..9ee571a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabGroupContextMenuCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabGroupContextMenuCoordinator.java
@@ -31,7 +31,6 @@
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.tab_group_sync.TabGroupSyncFeatures;
 import org.chromium.chrome.browser.tab_group_sync.TabGroupSyncServiceFactory;
-import org.chromium.chrome.browser.tab_group_sync.TabGroupSyncUtils;
 import org.chromium.chrome.browser.tabmodel.TabCreator;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter;
@@ -49,7 +48,6 @@
 import org.chromium.components.data_sharing.DataSharingService;
 import org.chromium.components.data_sharing.DataSharingService.GroupDataOrFailureOutcome;
 import org.chromium.components.signin.identitymanager.IdentityManager;
-import org.chromium.components.tab_group_sync.LocalTabGroupId;
 import org.chromium.components.tab_group_sync.TabGroupSyncService;
 import org.chromium.components.tab_groups.TabGroupColorId;
 import org.chromium.ui.KeyboardVisibilityDelegate;
@@ -224,9 +222,6 @@
                         tabGroupModelFilter, tabCreator, tabId, TabLaunchType.FROM_TAB_GROUP_UI);
                 recordUserAction("NewTabInGroup");
             } else if (menuId == org.chromium.chrome.R.id.share_group) {
-                LocalTabGroupId localTabGroupId =
-                        TabGroupSyncUtils.getLocalTabGroupId(tabGroupModelFilter, tabId);
-
                 // Get user assigned group title or the default title "N tabs" if no title is
                 // assigned.
                 String tabGroupDisplayName =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProvider.java
index b74b580..b045a0d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProvider.java
@@ -80,6 +80,8 @@
         GURL redirectUrl = new GURL(UrlConstants.HTTPS_URL_PREFIX + host + path);
         mRedirectHost = redirectUrl.getHost();
         mRedirectPath = redirectUrl.getPath();
+
+        logFeatureUsage();
     }
 
     @Override
@@ -166,4 +168,25 @@
     public String getAuthRedirectScheme() {
         return mRedirectScheme;
     }
+
+    /**
+     * Logs the usage of Auth Tab features to a large enum histogram in order to track usage by
+     * apps.
+     */
+    private void logFeatureUsage() {
+        if (!CustomTabsFeatureUsage.isEnabled()) return;
+        CustomTabsFeatureUsage featureUsage = new CustomTabsFeatureUsage();
+
+        // Ordering: Log all the features ordered by enum, when they apply.
+        featureUsage.log(CustomTabsFeatureUsage.CustomTabsFeature.EXTRA_LAUNCH_AUTH_TAB);
+        if (mRedirectScheme != null) {
+            featureUsage.log(CustomTabsFeatureUsage.CustomTabsFeature.EXTRA_REDIRECT_SCHEME);
+        }
+        if (mRedirectHost != null) {
+            featureUsage.log(CustomTabsFeatureUsage.CustomTabsFeature.EXTRA_HTTPS_REDIRECT_HOST);
+        }
+        if (mRedirectPath != null) {
+            featureUsage.log(CustomTabsFeatureUsage.CustomTabsFeature.EXTRA_HTTPS_REDIRECT_PATH);
+        }
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsFeatureUsage.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsFeatureUsage.java
index fbf1ae5..11e24b1f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsFeatureUsage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsFeatureUsage.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.customtabs;
 
 import androidx.annotation.IntDef;
+import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
@@ -15,6 +16,9 @@
 
 /** Records a histogram that tracks usage of all the CCT features of interest. */
 public class CustomTabsFeatureUsage {
+    @VisibleForTesting
+    public static final String CUSTOM_TABS_FEATURE_USAGE_HISTOGRAM = "CustomTabs.FeatureUsage";
+
     // NOTE: This must be kept in sync with the definition |CustomTabsFeatureUsed|
     // in tools/metrics/histograms/enums.xml.
     @IntDef({
@@ -76,6 +80,10 @@
         CustomTabsFeature.EXTRA_ENABLE_GOOGLE_BOTTOM_BAR,
         CustomTabsFeature.EXTRA_GOOGLE_BOTTOM_BAR_BUTTONS,
         CustomTabsFeature.EXTRA_NETWORK,
+        CustomTabsFeature.EXTRA_LAUNCH_AUTH_TAB,
+        CustomTabsFeature.EXTRA_REDIRECT_SCHEME,
+        CustomTabsFeature.EXTRA_HTTPS_REDIRECT_HOST,
+        CustomTabsFeature.EXTRA_HTTPS_REDIRECT_PATH,
         CustomTabsFeature.COUNT
     })
     @Retention(RetentionPolicy.SOURCE)
@@ -140,9 +148,13 @@
         int EXTRA_ENABLE_GOOGLE_BOTTOM_BAR = 56;
         int EXTRA_GOOGLE_BOTTOM_BAR_BUTTONS = 57;
         int EXTRA_NETWORK = 58;
+        int EXTRA_LAUNCH_AUTH_TAB = 59;
+        int EXTRA_REDIRECT_SCHEME = 60;
+        int EXTRA_HTTPS_REDIRECT_HOST = 61;
+        int EXTRA_HTTPS_REDIRECT_PATH = 62;
 
         /** Total count of entries. */
-        int COUNT = 59;
+        int COUNT = 63;
     }
 
     // Whether flag-enabled or not.
@@ -178,6 +190,6 @@
 
         mUsed.set(feature);
         RecordHistogram.recordEnumeratedHistogram(
-                "CustomTabs.FeatureUsage", feature, CustomTabsFeature.COUNT);
+                CUSTOM_TABS_FEATURE_USAGE_HISTOGRAM, feature, CustomTabsFeature.COUNT);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java
index 00dac51..642383f0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java
@@ -82,7 +82,6 @@
                         .getDimensionPixelSize(R.dimen.history_item_remove_button_lateral_padding),
                 getPaddingBottom());
 
-        findViewById(R.id.chip_description).setVisibility(View.VISIBLE);
         mChipView = findViewById(R.id.chip);
         mChipView.getPrimaryTextView().setEllipsize(TextUtils.TruncateAt.END);
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarTest.java
index 509e56a..f1601b3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarTest.java
@@ -247,7 +247,6 @@
         for (int menuId : applicableMenuIds) {
             boolean isVisible = !hiddenIdSet.contains(menuId);
             MenuItem menuItem = mBookmarkToolbar.getMenu().findItem(menuId);
-            assertNotNull(menuId);
             assertEquals(
                     "Mismatched visibility for menu item " + menuItem,
                     isVisible,
@@ -259,7 +258,6 @@
         for (int menuId : applicableMenuIds) {
             boolean isEnabled = !disabledIds.contains(menuId);
             MenuItem menuItem = mBookmarkToolbar.getMenu().findItem(menuId);
-            assertNotNull(menuId);
             assertEquals(
                     "Mismatched enabled state for menu item " + menuItem,
                     isEnabled,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/digitalgoods/DigitalGoodsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/digitalgoods/DigitalGoodsTest.java
index dea9caa16..489cbae9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/digitalgoods/DigitalGoodsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/digitalgoods/DigitalGoodsTest.java
@@ -198,7 +198,7 @@
                     try {
                         Assert.assertNotEquals("null", exec(variable));
                     } catch (TimeoutException e) {
-                        Assert.fail();
+                        throw new RuntimeException(e);
                     }
                 });
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/IncognitoCustomTabActivityTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/IncognitoCustomTabActivityTestRule.java
index 44be8db..7997a83 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/IncognitoCustomTabActivityTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/IncognitoCustomTabActivityTestRule.java
@@ -69,7 +69,7 @@
             try {
                 createNewCustomTabSessionForIntent(intent);
             } catch (TimeoutException e) {
-                Assert.fail();
+                throw new RuntimeException(e);
             }
         }
         super.startCustomTabActivityWithIntent(intent);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java
index 0ccebe21..77118cb 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java
@@ -8,6 +8,9 @@
 
 import android.graphics.Bitmap;
 import android.graphics.Color;
+import android.os.Build;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
 
 import androidx.activity.BackEventCompat;
 import androidx.test.core.app.ApplicationProvider;
@@ -33,6 +36,7 @@
 import org.chromium.base.test.util.CriteriaNotSatisfiedException;
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.Features.EnableFeatures;
+import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.browser.ViewportTestUtils;
 import org.chromium.chrome.browser.back_press.BackPressManager;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
@@ -50,9 +54,13 @@
 import org.chromium.net.test.EmbeddedTestServer;
 import org.chromium.ui.base.BackGestureEventSwipeEdge;
 import org.chromium.ui.base.UiAndroidFeatures;
+import org.chromium.ui.modaldialog.ModalDialogManager;
+import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
+import org.chromium.ui.modelutil.PropertyModel;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -67,6 +75,7 @@
 @CommandLineFlags.Add({
     ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
     "enable-features=BackForwardTransitions,BackGestureRefactorAndroid",
+    "force-prefers-no-reduced-motion",
     // Resampling can make scroll offsets non-deterministic so turn it off.
     "disable-features=ResamplingScrollEvents",
     "hide-scrollbars"
@@ -225,7 +234,6 @@
                 () -> {
                     invokeNavigateGesture(edge);
                 });
-        waitForTransitionFinished();
     }
 
     private void waitForTransitionFinished() {
@@ -244,6 +252,50 @@
                 CriteriaHelper.DEFAULT_POLLING_INTERVAL);
     }
 
+    private void waitForModalDialogShown() {
+        CriteriaHelper.pollUiThread(
+                () -> {
+                    try {
+                        Criteria.checkThat(getDialogManager().isShowing(), Matchers.is(true));
+                    } catch (Throwable e) {
+                        throw new CriteriaNotSatisfiedException(e);
+                    }
+                },
+                TEST_TIMEOUT,
+                CriteriaHelper.DEFAULT_POLLING_INTERVAL);
+    }
+
+    private void runJavaScriptOnTab(String script) {
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    getWebContents().evaluateJavaScriptForTests(script, null);
+                });
+    }
+
+    private ModalDialogManager getDialogManager() {
+        return mActivityTestRule.getActivity().getWindowAndroid().getModalDialogManager();
+    }
+
+    private int numSuspendedDialogs(@ModalDialogType int dialogType) {
+        var dialogs = getDialogManager().getPendingDialogsForTest(dialogType);
+        if (dialogs == null) return 0;
+        return dialogs.size();
+    }
+
+    private void waitForNumSuspendedDialogs(@ModalDialogType int dialogType, int numSuspended) {
+        CriteriaHelper.pollUiThread(
+                () -> {
+                    try {
+                        Criteria.checkThat(
+                                numSuspendedDialogs(dialogType), Matchers.is(numSuspended));
+                    } catch (Throwable e) {
+                        throw new CriteriaNotSatisfiedException(e);
+                    }
+                },
+                TEST_TIMEOUT,
+                CriteriaHelper.DEFAULT_POLLING_INTERVAL);
+    }
+
     /**
      * Basic smoke test of transition back navigation.
      *
@@ -253,6 +305,9 @@
     @Test
     @MediumTest
     public void smokeTest() throws Throwable {
+        if (mTestNavigationMode == NAVIGATION_MODE_GESTURAL
+                && VERSION.SDK_INT < VERSION_CODES.UPSIDE_DOWN_CAKE) return;
+
         // Put "blue.html" and then "green.html" in the session history.
         String url1 = mTestServer.getURL("/chrome/test/data/android/blue.html");
         String url2 = mTestServer.getURL("/chrome/test/data/android/green.html");
@@ -265,6 +320,7 @@
 
         // Perform a back gesture transition from the left edge.
         performNavigationTransition(url2, BackEventCompat.EDGE_LEFT);
+        waitForTransitionFinished();
 
         Assert.assertEquals(url2, getCurrentUrl());
 
@@ -272,9 +328,11 @@
         // button mode this goes forward, in gestural mode this goes back.
         if (mTestNavigationMode == NAVIGATION_MODE_THREE_BUTTON) {
             performNavigationTransition(url3, BackEventCompat.EDGE_RIGHT);
+            waitForTransitionFinished();
             Assert.assertEquals(url3, getCurrentUrl());
         } else {
             performNavigationTransition(url1, BackEventCompat.EDGE_RIGHT);
+            waitForTransitionFinished();
             Assert.assertEquals(url1, getCurrentUrl());
         }
     }
@@ -288,6 +346,9 @@
     @Test
     @MediumTest
     public void testInputAfterBackTransition() throws Throwable {
+        if (mTestNavigationMode == NAVIGATION_MODE_GESTURAL
+                && VERSION.SDK_INT < VERSION_CODES.UPSIDE_DOWN_CAKE) return;
+
         // Put "blue.html" and then "green.html" in the session history.
         String url1 = mTestServer.getURL("/chrome/test/data/android/blue.html");
         String url2 = mTestServer.getURL("/chrome/test/data/android/green.html");
@@ -296,6 +357,7 @@
 
         WebContentsUtils.waitForCopyableViewInWebContents(getWebContents());
         performNavigationTransition(url1, BackEventCompat.EDGE_LEFT);
+        waitForTransitionFinished();
 
         JavaScriptUtils.executeJavaScriptAndWaitForResult(
                 getWebContents(),
@@ -326,6 +388,9 @@
     @MediumTest
     @EnableFeatures({UiAndroidFeatures.MIRROR_BACK_FORWARD_GESTURES_IN_RTL})
     public void testBackNavInRTL() throws Throwable {
+        if (mTestNavigationMode == NAVIGATION_MODE_GESTURAL
+                && VERSION.SDK_INT < VERSION_CODES.UPSIDE_DOWN_CAKE) return;
+
         setRtlForTesting(true);
 
         // Put "blue.html" and then "green.html" in the session history.
@@ -338,6 +403,7 @@
 
         WebContentsUtils.waitForCopyableViewInWebContents(getWebContents());
         performNavigationTransition(url2, BackEventCompat.EDGE_RIGHT);
+        waitForTransitionFinished();
         Assert.assertEquals(url2, getCurrentUrl());
 
         // Perform an edge gesture transition from the left edge (semantically
@@ -345,9 +411,11 @@
         // forward, in gestural mode this goes back (without a transition).
         if (mTestNavigationMode == NAVIGATION_MODE_THREE_BUTTON) {
             performNavigationTransition(url3, BackEventCompat.EDGE_LEFT);
+            waitForTransitionFinished();
             Assert.assertEquals(url3, getCurrentUrl());
         } else {
             performNavigationTransition(url1, BackEventCompat.EDGE_LEFT);
+            waitForTransitionFinished();
             Assert.assertEquals(url1, getCurrentUrl());
         }
     }
@@ -360,6 +428,9 @@
     @Test
     @MediumTest
     public void startBackNavWithTopControlHidden() throws Throwable {
+        if (mTestNavigationMode == NAVIGATION_MODE_GESTURAL
+                && VERSION.SDK_INT < VERSION_CODES.UPSIDE_DOWN_CAKE) return;
+
         // The top control's offset is -top_controls_height when controls are fully hidden, 0 when
         // fully shown.
         final AtomicInteger topControlOffsetDuringGesture = new AtomicInteger(Integer.MAX_VALUE);
@@ -399,6 +470,7 @@
         // Perform a back gesture transition.
         mViewportTestUtils.hideBrowserControls();
         performNavigationTransition(url1, BackEventCompat.EDGE_LEFT);
+        waitForTransitionFinished();
 
         Assert.assertEquals(url1, getCurrentUrl());
 
@@ -406,4 +478,123 @@
                 topControlOffsetDuringGesture.get() > -mViewportTestUtils.getTopControlsHeightPx());
         mViewportTestUtils.waitForBrowserControlsState(/* shown= */ true);
     }
+
+    /**
+     * Test that the modal dialogs are suspended during the transition but resumed after the
+     * transition.
+     */
+    @Test
+    @MediumTest
+    @MinAndroidSdkLevel(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+    public void alertSuspendedDuringTransition() throws Throwable {
+        // Skip for three button mode because `TouchCommon.performWallClockDrag` blocks (it sleeps
+        // between each touch event). It's okay to skip because the dialog suspension is navigation
+        // mode agnostic.
+        if (mTestNavigationMode == NAVIGATION_MODE_THREE_BUTTON) return;
+
+        // Put "blue.html" and then "green.html" in the session history.
+        String url1 = mTestServer.getURL("/chrome/test/data/android/blue.html");
+        String url2 = mTestServer.getURL("/chrome/test/data/android/green.html");
+        mActivityTestRule.loadUrl(url1);
+        mActivityTestRule.loadUrl(url2);
+
+        WebContentsUtils.waitForCopyableViewInWebContents(getWebContents());
+
+        final AtomicBoolean dialogQueuedToShow = new AtomicBoolean(false);
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    getDialogManager()
+                            .addObserver(
+                                    new ModalDialogManager.ModalDialogManagerObserver() {
+                                        @Override
+                                        public void onDialogAdded(PropertyModel model) {
+                                            dialogQueuedToShow.set(true);
+                                        }
+                                    });
+                });
+
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    BackPressManager manager =
+                            mActivityTestRule.getActivity().getBackPressManagerForTesting();
+                    var backEvent = new BackEventCompat(0, 0, 0, BackEventCompat.EDGE_LEFT);
+                    manager.getCallback().handleOnBackStarted(backEvent);
+                });
+        runJavaScriptOnTab("window.alert('during transition');");
+        waitForNumSuspendedDialogs(ModalDialogType.TAB, 1);
+        Assert.assertFalse(dialogQueuedToShow.get());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    BackPressManager manager =
+                            mActivityTestRule.getActivity().getBackPressManagerForTesting();
+                    var backEvent = new BackEventCompat(1, 0, 0.8f, BackEventCompat.EDGE_LEFT);
+                    manager.getCallback().handleOnBackProgressed(backEvent);
+                    manager.getCallback().handleOnBackPressed();
+                });
+
+        waitForTransitionFinished();
+        Assert.assertEquals(0, numSuspendedDialogs(ModalDialogType.TAB));
+        Assert.assertFalse(dialogQueuedToShow.get());
+
+        // After the transition, dialogs are resumed.
+        runJavaScriptOnTab("window.alert('after transition');");
+        waitForModalDialogShown();
+        Assert.assertTrue(dialogQueuedToShow.get());
+    }
+
+    /**
+     * Test that the modal dialogs are suspended during the transition but resumed after the
+     * transition is cancelled.
+     */
+    @Test
+    @MediumTest
+    @MinAndroidSdkLevel(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+    public void alertResumedAfterGestureCancelled() throws Throwable {
+        // TouchCommon.java doesn't have a "cancel gesture".
+        if (mTestNavigationMode == NAVIGATION_MODE_THREE_BUTTON) return;
+
+        // Put "blue.html" and then "green.html" in the session history.
+        String url1 = mTestServer.getURL("/chrome/test/data/android/blue.html");
+        String url2 = mTestServer.getURL("/chrome/test/data/android/green.html");
+        mActivityTestRule.loadUrl(url1);
+        mActivityTestRule.loadUrl(url2);
+
+        final AtomicBoolean dialogQueuedToShow = new AtomicBoolean(false);
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    getDialogManager()
+                            .addObserver(
+                                    new ModalDialogManager.ModalDialogManagerObserver() {
+                                        @Override
+                                        public void onDialogAdded(PropertyModel model) {
+                                            dialogQueuedToShow.set(true);
+                                        }
+                                    });
+                });
+
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    BackPressManager manager =
+                            mActivityTestRule.getActivity().getBackPressManagerForTesting();
+                    var backEvent = new BackEventCompat(0, 0, 0, BackEventCompat.EDGE_LEFT);
+                    manager.getCallback().handleOnBackStarted(backEvent);
+                });
+        runJavaScriptOnTab("window.alert('shown after transition');");
+        waitForNumSuspendedDialogs(ModalDialogType.TAB, 1);
+        Assert.assertFalse(dialogQueuedToShow.get());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    BackPressManager manager =
+                            mActivityTestRule.getActivity().getBackPressManagerForTesting();
+                    var backEvent = new BackEventCompat(1, 0, .8f, BackEventCompat.EDGE_LEFT);
+                    manager.getCallback().handleOnBackProgressed(backEvent);
+                    manager.getCallback().handleOnBackCancelled();
+                });
+        waitForTransitionFinished();
+        Assert.assertEquals(0, numSuspendedDialogs(ModalDialogType.TAB));
+
+        // After the transition is finished, the dialog is resumed.
+        waitForModalDialogShown();
+        Assert.assertTrue(dialogQueuedToShow.get());
+    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageNavigationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageNavigationTest.java
index 04fa7150..5cd87fe 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageNavigationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageNavigationTest.java
@@ -101,7 +101,7 @@
         Assert.assertEquals(UrlConstants.NTP_URL, url);
 
         // Check that the NTP is actually displayed.
-        Assert.assertNotNull(tab.getNativePage() instanceof NewTabPage);
+        Assert.assertTrue(tab.getNativePage() instanceof NewTabPage);
     }
 
     /** Tests navigating to the tab switcher from the NTP. */
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillDeletePaymentMethodConfirmationDialogTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillDeletePaymentMethodConfirmationDialogTest.java
index c92b8fbf..9d56955 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillDeletePaymentMethodConfirmationDialogTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillDeletePaymentMethodConfirmationDialogTest.java
@@ -2,6 +2,8 @@
 // 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.mockito.Mockito.verify;
@@ -24,7 +26,6 @@
 import org.chromium.base.Callback;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.autofill.settings.AutofillDeletePaymentMethodConfirmationDialog;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
 import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
index 1eae022e..39d58b6 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
@@ -852,7 +852,6 @@
         assertEquals(mBookmarkItem21.getTitle(), model.get(ImprovedBookmarkRowProperties.TITLE));
         assertEquals(EXAMPLE_URL_FORMATTED, model.get(ImprovedBookmarkRowProperties.DESCRIPTION));
         assertNotNull(model.get(ImprovedBookmarkRowProperties.START_ICON_DRAWABLE));
-        assertNotNull(model.get(ImprovedBookmarkRowProperties.START_AREA_BACKGROUND_COLOR));
         assertNull(model.get(ImprovedBookmarkRowProperties.START_ICON_TINT));
         assertNotNull(model.get(ImprovedBookmarkRowProperties.POPUP_LISTENER));
         assertEquals(false, model.get(ImprovedBookmarkRowProperties.SELECTION_ACTIVE));
@@ -927,7 +926,6 @@
         assertEquals(mBookmarkItem21.getTitle(), model.get(ImprovedBookmarkRowProperties.TITLE));
         assertEquals(EXAMPLE_URL_FORMATTED, model.get(ImprovedBookmarkRowProperties.DESCRIPTION));
         assertNotNull(model.get(ImprovedBookmarkRowProperties.START_ICON_DRAWABLE));
-        assertNotNull(model.get(ImprovedBookmarkRowProperties.START_AREA_BACKGROUND_COLOR));
         assertNull(model.get(ImprovedBookmarkRowProperties.START_ICON_TINT));
         assertNotNull(model.get(ImprovedBookmarkRowProperties.START_ICON_DRAWABLE));
         assertNotNull(model.get(ImprovedBookmarkRowProperties.POPUP_LISTENER));
@@ -1013,7 +1011,6 @@
                 ImageVisibility.DRAWABLE,
                 model.get(ImprovedBookmarkRowProperties.START_IMAGE_VISIBILITY));
         assertNotNull(model.get(ImprovedBookmarkRowProperties.START_ICON_DRAWABLE));
-        assertNotNull(model.get(ImprovedBookmarkRowProperties.START_AREA_BACKGROUND_COLOR));
         assertNotNull(model.get(ImprovedBookmarkRowProperties.START_ICON_TINT));
         assertNotNull(model.get(ImprovedBookmarkRowProperties.POPUP_LISTENER));
         assertEquals(false, model.get(ImprovedBookmarkRowProperties.SELECTION_ACTIVE));
@@ -1075,7 +1072,6 @@
         assertEquals(
                 mFolderItem2.getTitle() + " (1)", model.get(ImprovedBookmarkRowProperties.TITLE));
         assertNotNull(model.get(ImprovedBookmarkRowProperties.START_ICON_DRAWABLE));
-        assertNotNull(model.get(ImprovedBookmarkRowProperties.START_AREA_BACKGROUND_COLOR));
         assertNotNull(model.get(ImprovedBookmarkRowProperties.START_ICON_TINT));
         assertNotNull(model.get(ImprovedBookmarkRowProperties.POPUP_LISTENER));
         assertEquals(false, model.get(ImprovedBookmarkRowProperties.SELECTION_ACTIVE));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinatorTest.java
index 359653a..b3ef4a52 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowCoordinatorTest.java
@@ -269,7 +269,6 @@
         PropertyModel model = mCoordinator.createBasePropertyModel(READING_LIST_BOOKMARK_ID);
         assertFalse(mCoordinator.shouldShowImagesForFolder(READING_LIST_BOOKMARK_ID));
 
-        assertNotNull(model.get(ImprovedBookmarkRowProperties.FOLDER_START_AREA_BACKGROUND_COLOR));
         assertNotNull(model.get(ImprovedBookmarkRowProperties.FOLDER_START_ICON_TINT));
         assertNotNull(model.get(ImprovedBookmarkRowProperties.FOLDER_START_ICON_DRAWABLE));
         assertEquals(0, model.get(ImprovedBookmarkRowProperties.FOLDER_CHILD_COUNT));
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 3625b04..2b3122f 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
@@ -45,7 +45,8 @@
 import org.mockito.InOrder;
 import org.mockito.Mock;
 import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
 
@@ -105,6 +106,7 @@
 @DisableFeatures(ChromeFeatureList.TAB_STRIP_INCOGNITO_MIGRATION)
 public class StripLayoutHelperManagerTest {
     @Rule public JniMocker mJniMocker = new JniMocker();
+    @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
     @Mock private TabStripSceneLayer.Natives mTabStripSceneMock;
     @Mock private TabStripSceneLayer mTabStripTreeProvider;
     @Mock private LayoutManagerHost mManagerHost;
@@ -150,17 +152,16 @@
 
     @Before
     public void beforeTest() {
-        MockitoAnnotations.initMocks(this);
         mJniMocker.mock(TabStripSceneLayerJni.TEST_HOOKS, mTabStripSceneMock);
         mActivity = Robolectric.buildActivity(Activity.class).setup().get();
         mActivity.setTheme(R.style.Theme_BrowserUI_DayNight);
-        when(mToolbarContainerView.getContext()).thenReturn(mActivity);
-        when(mToolbarManager.getStatusBarColorController()).thenReturn(mStatusBarColorController);
-
         TabStripSceneLayer.setTestFlag(true);
 
+        when(mToolbarContainerView.getContext()).thenReturn(mActivity);
+        when(mToolbarManager.getStatusBarColorController()).thenReturn(mStatusBarColorController);
         when(mDesktopWindowStateProvider.isInUnfocusedDesktopWindow()).thenReturn(false);
         when(mWindowAndroid.getActivity()).thenReturn(new WeakReference<>(mActivity));
+
         initializeTest();
     }
 
@@ -347,7 +348,7 @@
 
     @Test
     @DisableFeatures(ChromeFeatureList.TAB_STRIP_LAYOUT_OPTIMIZATION)
-    public void testModelSelectorButtonXPosition() {
+    public void testModelSelectorButtonDrawX() {
         // Set model selector button position.
         mStripLayoutHelperManager.setModelSelectorButtonVisibleForTesting(true);
         mStripLayoutHelperManager.onSizeChanged(
@@ -364,7 +365,7 @@
 
     @Test
     @DisableFeatures(ChromeFeatureList.TAB_STRIP_LAYOUT_OPTIMIZATION)
-    public void testModelSelectorButtonXPosition_RTL() {
+    public void testModelSelectorButtonDrawX_Rtl() {
         // Set model selector button position.
         LocalizationUtils.setRtlForTesting(true);
         mStripLayoutHelperManager.setModelSelectorButtonVisibleForTesting(true);
@@ -380,7 +381,7 @@
     }
 
     @Test
-    public void testModelSelectorButtonYPosition() {
+    public void testModelSelectorButtonDrawY() {
         // Set model selector button position.
         mStripLayoutHelperManager.onSizeChanged(
                 SCREEN_WIDTH, SCREEN_HEIGHT, VISIBLE_VIEWPORT_Y, ORIENTATION);
@@ -540,7 +541,7 @@
     }
 
     @Test
-    public void testFadeDrawable_Left_RTL_ModelSelectorButtonVisible() {
+    public void testFadeDrawable_Left_Rtl_ModelSelectorButtonVisible() {
         // setup
         mStripLayoutHelperManager.setModelSelectorButtonVisibleForTesting(true);
         LocalizationUtils.setRtlForTesting(true);
@@ -553,7 +554,7 @@
     }
 
     @Test
-    public void testFadeDrawable_Left_RTL() {
+    public void testFadeDrawable_Left_Rtl() {
         // setup
         LocalizationUtils.setRtlForTesting(true);
 
@@ -565,7 +566,7 @@
     }
 
     @Test
-    public void testFadeDrawable_Right_RTL() {
+    public void testFadeDrawable_Right_Rtl() {
         // setup
         mStripLayoutHelperManager.setModelSelectorButtonVisibleForTesting(true);
         LocalizationUtils.setRtlForTesting(true);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java
index f743e90..d79b371 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java
@@ -3924,13 +3924,16 @@
         // Verify.
         StripLayoutTab[] tabs = mStripLayoutHelper.getStripLayoutTabsForTesting();
         assertTrue("Should be in reorder mode.", mStripLayoutHelper.getInReorderModeForTesting());
-        assertNotEquals("Should be tab margin after tab 0.", 0, tabs[0].getTrailingMargin());
+        assertEquals(
+                "Should not be tab margin after tab 0.", 0, tabs[0].getTrailingMargin(), EPSILON);
         assertEquals(
                 "Should not be tab margin after tab 1.", 0, tabs[1].getTrailingMargin(), EPSILON);
-        assertNotEquals("Should be tab margin after tab 2.", 0, tabs[2].getTrailingMargin());
+        assertEquals(
+                "Should not be tab margin after tab 2.", 0, tabs[2].getTrailingMargin(), EPSILON);
         assertEquals(
                 "Should not be tab margin after tab 3.", 0, tabs[3].getTrailingMargin(), EPSILON);
-        assertNotEquals("Should be tab margin after tab 4.", 0, tabs[4].getTrailingMargin());
+        assertNotEquals(
+                "Should be tab margin after tab 4.", 0, tabs[4].getTrailingMargin(), EPSILON);
 
         assertEquals(
                 "TouchableRect does not match. Touch size should match the strip during drag.",
@@ -3962,22 +3965,26 @@
         StripLayoutTab[] tabs = mStripLayoutHelper.getStripLayoutTabsForTesting();
         assertEquals(
                 "Should not be tab margin after tab 0.", 0, tabs[0].getTrailingMargin(), EPSILON);
-        assertNotEquals("Should be tab margin after tab 1.", 0, tabs[1].getTrailingMargin());
+        assertEquals(
+                "Should not be tab margin after tab 1.", 0, tabs[1].getTrailingMargin(), EPSILON);
         assertEquals(
                 "Should not be tab margin after tab 2.", 0, tabs[2].getTrailingMargin(), EPSILON);
-        assertNotEquals("Should be tab margin after tab 3.", 0, tabs[3].getTrailingMargin());
+        assertNotEquals(
+                "Should be tab margin after tab 3.", 0, tabs[3].getTrailingMargin(), EPSILON);
 
         // Now hover between 1st and 2nd tab:
         // tabWidth(265) - overlapWidth(28) = 237
         mStripLayoutHelper.updateReorderPositionForTabDrop(237.f);
 
         // Verify.
-        assertNotEquals("Should be tab margin after tab 0.", 0, tabs[0].getTrailingMargin());
+        assertEquals(
+                "Should not be tab margin after tab 0.", 0, tabs[0].getTrailingMargin(), EPSILON);
         assertEquals(
                 "Should not be tab margin after tab 1.", 0, tabs[1].getTrailingMargin(), EPSILON);
         assertEquals(
                 "Should not be tab margin after tab 2.", 0, tabs[2].getTrailingMargin(), EPSILON);
-        assertNotEquals("Should be tab margin after tab 3.", 0, tabs[3].getTrailingMargin());
+        assertNotEquals(
+                "Should be tab margin after tab 3.", 0, tabs[3].getTrailingMargin(), EPSILON);
     }
 
     @Test
@@ -4007,7 +4014,8 @@
                 "Should not be tab margin after tab 0.", 0, tabs[0].getTrailingMargin(), EPSILON);
         assertEquals(
                 "Should not be tab margin after tab 1.", 0, tabs[1].getTrailingMargin(), EPSILON);
-        assertNotEquals("Should be tab margin after tab 2.", 0, tabs[2].getTrailingMargin());
+        assertNotEquals(
+                "Should be tab margin after tab 2.", 0, tabs[2].getTrailingMargin(), EPSILON);
 
         // Hover in end gap:
         mStripLayoutHelper.updateReorderPositionForTabDrop(1100);
@@ -4017,7 +4025,8 @@
                 "Should not be tab margin after tab 0.", 0, tabs[0].getTrailingMargin(), EPSILON);
         assertEquals(
                 "Should not be tab margin after tab 1.", 0, tabs[1].getTrailingMargin(), EPSILON);
-        assertNotEquals("Should be tab margin after tab 2.", 0, tabs[2].getTrailingMargin());
+        assertNotEquals(
+                "Should be tab margin after tab 2.", 0, tabs[2].getTrailingMargin(), EPSILON);
     }
 
     @Test
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProviderUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProviderUnitTest.java
index 044f65a..6ecfc95 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProviderUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/AuthTabIntentDataProviderUnitTest.java
@@ -8,6 +8,11 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import static org.chromium.chrome.browser.customtabs.AuthTabIntentDataProvider.EXTRA_HTTPS_REDIRECT_HOST;
+import static org.chromium.chrome.browser.customtabs.AuthTabIntentDataProvider.EXTRA_HTTPS_REDIRECT_PATH;
+import static org.chromium.chrome.browser.customtabs.CustomTabsFeatureUsage.CUSTOM_TABS_FEATURE_USAGE_HISTOGRAM;
+import static org.chromium.chrome.browser.flags.ChromeFeatureList.CCT_FEATURE_USAGE;
+
 import android.app.Activity;
 import android.content.Intent;
 import android.net.Uri;
@@ -25,6 +30,8 @@
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Batch;
+import org.chromium.base.test.util.Features;
+import org.chromium.base.test.util.HistogramWatcher;
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.CustomTabsUiType;
 import org.chromium.chrome.browser.flags.ActivityType;
@@ -33,6 +40,7 @@
 @RunWith(BaseRobolectricTestRunner.class)
 @Batch(Batch.UNIT_TESTS)
 @Config(manifest = Config.NONE)
+@Features.EnableFeatures(CCT_FEATURE_USAGE)
 public class AuthTabIntentDataProviderUnitTest {
     @Rule
     public ActivityScenarioRule<TestActivity> mActivityScenario =
@@ -41,6 +49,8 @@
     private static final String PACKAGE = "com.example.package.app";
     private static final String URL = "https://www.google.com";
     private static final String SCHEME = "myscheme";
+    private static final String HOST = "www.host.com";
+    private static final String PATH = "/path/auth";
 
     private Activity mActivity;
     private Intent mIntent;
@@ -52,16 +62,15 @@
         mIntent = new Intent(Intent.ACTION_VIEW);
         mIntent.setData(Uri.parse(URL));
         mIntent.putExtra(AuthTabIntent.EXTRA_LAUNCH_AUTH_TAB, true);
-        mIntent.putExtra(AuthTabIntent.EXTRA_REDIRECT_SCHEME, SCHEME);
         mIntent.putExtra(IntentHandler.EXTRA_CALLING_ACTIVITY_PACKAGE, PACKAGE);
         Bundle bundle = new Bundle();
         bundle.putBinder(CustomTabsIntent.EXTRA_SESSION, null);
         mIntent.putExtras(bundle);
-        mIntentDataProvider = new AuthTabIntentDataProvider(mIntent, mActivity);
     }
 
     @Test
     public void testOverriddenDefaults() {
+        mIntentDataProvider = new AuthTabIntentDataProvider(mIntent, mActivity);
         assertEquals(
                 "ActivityType should be AUTH_TAB.",
                 ActivityType.AUTH_TAB,
@@ -86,9 +95,53 @@
 
     @Test
     public void testIntentData() {
+        var histogramWatcher =
+                HistogramWatcher.newBuilder()
+                        .expectIntRecord(
+                                CUSTOM_TABS_FEATURE_USAGE_HISTOGRAM,
+                                CustomTabsFeatureUsage.CustomTabsFeature.EXTRA_LAUNCH_AUTH_TAB)
+                        .allowExtraRecordsForHistogramsAbove()
+                        .build();
+        mIntentDataProvider = new AuthTabIntentDataProvider(mIntent, mActivity);
+
         assertEquals("Intent doesn't match expectation.", mIntent, mIntentDataProvider.getIntent());
         assertEquals("Wrong package name", PACKAGE, mIntentDataProvider.getClientPackageName());
         assertEquals("Wrong URL", URL, mIntentDataProvider.getUrlToLoad());
+        histogramWatcher.assertExpected();
+    }
+
+    @Test
+    public void testIntentData_customScheme() {
+        var histogramWatcher =
+                HistogramWatcher.newBuilder()
+                        .expectIntRecord(
+                                CUSTOM_TABS_FEATURE_USAGE_HISTOGRAM,
+                                CustomTabsFeatureUsage.CustomTabsFeature.EXTRA_REDIRECT_SCHEME)
+                        .allowExtraRecordsForHistogramsAbove()
+                        .build();
+        mIntent.putExtra(AuthTabIntent.EXTRA_REDIRECT_SCHEME, SCHEME);
+        mIntentDataProvider = new AuthTabIntentDataProvider(mIntent, mActivity);
+
         assertEquals("Wrong redirect scheme.", SCHEME, mIntentDataProvider.getAuthRedirectScheme());
+        histogramWatcher.assertExpected();
+    }
+
+    @Test
+    public void testIntentData_https() {
+        var histogramWatcher =
+                HistogramWatcher.newBuilder()
+                        .expectIntRecords(
+                                CUSTOM_TABS_FEATURE_USAGE_HISTOGRAM,
+                                CustomTabsFeatureUsage.CustomTabsFeature.EXTRA_HTTPS_REDIRECT_HOST,
+                                CustomTabsFeatureUsage.CustomTabsFeature.EXTRA_HTTPS_REDIRECT_PATH)
+                        .allowExtraRecordsForHistogramsAbove()
+                        .build();
+        mIntent.putExtra(EXTRA_HTTPS_REDIRECT_HOST, HOST);
+        mIntent.putExtra(EXTRA_HTTPS_REDIRECT_PATH, PATH);
+        mIntentDataProvider = new AuthTabIntentDataProvider(mIntent, mActivity);
+
+        assertEquals("Wrong https redirect host.", HOST, mIntentDataProvider.getAuthRedirectHost());
+        assertEquals("Wrong https redirect path.", PATH, mIntentDataProvider.getAuthRedirectPath());
+        histogramWatcher.assertExpected();
     }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationUnitTest.java
index e54fece..89ce823 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationUnitTest.java
@@ -98,7 +98,7 @@
             activityClass =
                     (Class<? extends Activity>) Class.forName(intent.getComponent().getClassName());
         } catch (ClassNotFoundException e) {
-            Assert.fail();
+            throw new RuntimeException(e);
         }
         createActivity(activityClass, intent);
     }
diff --git a/chrome/android/webapk/libs/runtime_library/javatests/src/org/chromium/webapk/lib/runtime_library/WebApkServiceImplTest.java b/chrome/android/webapk/libs/runtime_library/javatests/src/org/chromium/webapk/lib/runtime_library/WebApkServiceImplTest.java
index ac7c904..475d1ba5 100644
--- a/chrome/android/webapk/libs/runtime_library/javatests/src/org/chromium/webapk/lib/runtime_library/WebApkServiceImplTest.java
+++ b/chrome/android/webapk/libs/runtime_library/javatests/src/org/chromium/webapk/lib/runtime_library/WebApkServiceImplTest.java
@@ -103,9 +103,8 @@
                             context.getPackageName(), PackageManager.GET_META_DATA);
             return appInfo.uid;
         } catch (Exception e) {
-            Assert.fail();
+            throw new RuntimeException(e);
         }
-        return -1;
     }
 
     /**
diff --git a/chrome/android/webapk/shell_apk/javatests/src/org/chromium/webapk/shell_apk/h2o/SplashUtilsTest.java b/chrome/android/webapk/shell_apk/javatests/src/org/chromium/webapk/shell_apk/h2o/SplashUtilsTest.java
index 9b9d27b..f5f16543 100644
--- a/chrome/android/webapk/shell_apk/javatests/src/org/chromium/webapk/shell_apk/h2o/SplashUtilsTest.java
+++ b/chrome/android/webapk/shell_apk/javatests/src/org/chromium/webapk/shell_apk/h2o/SplashUtilsTest.java
@@ -51,7 +51,7 @@
         try {
             bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
         } catch (Exception e) {
-            Assert.fail();
+            throw new RuntimeException(e);
         }
         int firstColor = pixels[0];
         for (int i = 1; i < pixels.length; ++i) {
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserClassLoaderTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserClassLoaderTest.java
index 288fa26c..40259bc 100644
--- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserClassLoaderTest.java
+++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserClassLoaderTest.java
@@ -23,6 +23,7 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
+import java.io.IOException;
 import java.io.InputStream;
 
 /** Tests HostBrowserClassLoader. */
@@ -47,7 +48,7 @@
     private DexLoader mMockDexLoader;
 
     @Before
-    public void setUp() {
+    public void setUp() throws Exception {
         mContext = RuntimeEnvironment.application;
         mPackageManager = mContext.getPackageManager();
         setRemoteVersionCode(REMOTE_VERSION_CODE);
@@ -65,7 +66,7 @@
 
     /** Test upgrading to a new runtime dex version. */
     @Test
-    public void testNewRuntimeDexVersion() {
+    public void testNewRuntimeDexVersion() throws Exception {
         HostBrowserClassLoader.createClassLoader(mContext, mRemoteContext, mMockDexLoader, null);
 
         String expectedDexName = WebApkCommonUtils.getRuntimeDexName(REMOTE_DEX_VERSION);
@@ -139,13 +140,9 @@
      * Sets the version of the current runtime library dex stored in the remote host browser's
      * assets.
      */
-    public void setRemoteDexVersion(int dexVersion) {
-        try {
-            Mockito.when(mRemoteAssetManager.open("webapk_dex_version.txt"))
-                    .thenReturn(createIntInputStream(dexVersion));
-        } catch (Exception e) {
-            Assert.fail();
-        }
+    public void setRemoteDexVersion(int dexVersion) throws IOException {
+        Mockito.when(mRemoteAssetManager.open("webapk_dex_version.txt"))
+                .thenReturn(createIntInputStream(dexVersion));
     }
 
     /**
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java
index 220bbf4..af35406 100644
--- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java
+++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java
@@ -791,7 +791,7 @@
                         (Class<? extends Activity>)
                                 Class.forName(startedActivityIntent.getComponent().getClassName());
             } catch (ClassNotFoundException e) {
-                Assert.fail();
+                throw new RuntimeException(e);
             }
             buildActivityFully(startedActivityClass, startedActivityIntent);
         }
diff --git a/chrome/app/password_manager_ui_strings.grdp b/chrome/app/password_manager_ui_strings.grdp
index cecc390..472b4689 100644
--- a/chrome/app/password_manager_ui_strings.grdp
+++ b/chrome/app/password_manager_ui_strings.grdp
@@ -3,6 +3,9 @@
   <message name="IDS_PASSWORD_MANAGER_UI_TITLE" desc="Title of the Password Manager page">
     Password Manager
   </message>
+  <message name="IDS_PASSWORD_MANAGER_UI_DESCRIPTION" desc="A description of the application.">
+    Keep track of your passwords and manage them in one place.
+  </message>
   <message name="IDS_PASSWORD_MANAGER_UI_SEARCH_PROMPT" desc="Placeholder in the search field.">
     Search passwords
   </message>
diff --git a/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_DESCRIPTION.png.sha1 b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_DESCRIPTION.png.sha1
new file mode 100644
index 0000000..fea542d1
--- /dev/null
+++ b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_DESCRIPTION.png.sha1
@@ -0,0 +1 @@
+2cf2992540345256c40454c85504ea2c3e6bd17c
\ No newline at end of file
diff --git a/chrome/browser/ash/accessibility/service/automation_client_impl.cc b/chrome/browser/ash/accessibility/service/automation_client_impl.cc
index cd8d8fe..f6db723aa 100644
--- a/chrome/browser/ash/accessibility/service/automation_client_impl.cc
+++ b/chrome/browser/ash/accessibility/service/automation_client_impl.cc
@@ -3,10 +3,12 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/ash/accessibility/service/automation_client_impl.h"
+
 #include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h"
 #include "extensions/browser/api/automation_internal/automation_event_router.h"
 #include "extensions/browser/api/automation_internal/automation_internal_api.h"
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 
 namespace ash {
 
@@ -55,8 +57,8 @@
 }
 
 void AutomationClientImpl::DispatchAccessibilityLocationChange(
-    const ui::AXLocationChanges& details) {
-  ui::AXTreeID tree_id = details.ax_tree_id;
+    const ui::AXTreeID& tree_id,
+    const ui::AXLocationChange& details) {
   if (tree_id == ui::AXTreeIDUnknown())
     return;
   for (auto& remote : automation_remotes_) {
diff --git a/chrome/browser/ash/accessibility/service/automation_client_impl.h b/chrome/browser/ash/accessibility/service/automation_client_impl.h
index 3588d42..74f4b104 100644
--- a/chrome/browser/ash/accessibility/service/automation_client_impl.h
+++ b/chrome/browser/ash/accessibility/service/automation_client_impl.h
@@ -11,6 +11,7 @@
 #include "mojo/public/cpp/bindings/remote_set.h"
 #include "services/accessibility/public/mojom/automation.mojom.h"
 #include "services/accessibility/public/mojom/automation_client.mojom.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 
 namespace ash {
 
@@ -51,7 +52,8 @@
       const gfx::Point& mouse_location,
       const std::vector<ui::AXEvent>& events) override;
   void DispatchAccessibilityLocationChange(
-      const ui::AXLocationChanges& details) override;
+      const ui::AXTreeID& tree_id,
+      const ui::AXLocationChange& details) override;
   void DispatchTreeDestroyedEvent(ui::AXTreeID tree_id) override;
   void DispatchActionResult(const ui::AXActionData& data,
                             bool result,
diff --git a/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc b/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc
index 733b30a..871e611 100644
--- a/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc
+++ b/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc
@@ -62,7 +62,8 @@
       const std::vector<ui::AXEvent>& events) override {}
 
   void DispatchAccessibilityLocationChange(
-      const ui::AXLocationChanges& details) override {}
+      const ui::AXTreeID& tree_id,
+      const ui::AXLocationChange& details) override {}
 
   void DispatchTreeDestroyedEvent(ui::AXTreeID tree_id) override {}
 
diff --git a/chrome/browser/ash/crosapi/automation_ash.cc b/chrome/browser/ash/crosapi/automation_ash.cc
index 65711581..e1b9ac39 100644
--- a/chrome/browser/ash/crosapi/automation_ash.cc
+++ b/chrome/browser/ash/crosapi/automation_ash.cc
@@ -4,6 +4,9 @@
 
 #include "chrome/browser/ash/crosapi/automation_ash.h"
 
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
+#include "ui/accessibility/ax_tree_id.h"
+
 namespace crosapi {
 
 AutomationAsh::AutomationAsh() {
@@ -63,12 +66,12 @@
     const base::UnguessableToken& tree_id,
     int32_t node_id,
     const ui::AXRelativeBounds& bounds) {
-  ui::AXLocationChanges details;
-  details.ax_tree_id = ui::AXTreeID::FromToken(tree_id);
+  ui::AXLocationChange details;
   details.id = node_id;
   details.new_location = bounds;
+  ui::AXTreeID ui_tree_id = ui::AXTreeID::FromToken(tree_id);
   extensions::AutomationEventRouter::GetInstance()
-      ->DispatchAccessibilityLocationChange(details);
+      ->DispatchAccessibilityLocationChange(ui_tree_id, details);
 }
 
 void AutomationAsh::DispatchTreeDestroyedEvent(
diff --git a/chrome/browser/ash/crostini/crostini_export_import.cc b/chrome/browser/ash/crostini/crostini_export_import.cc
index 45d6cd8..962f33e 100644
--- a/chrome/browser/ash/crostini/crostini_export_import.cc
+++ b/chrome/browser/ash/crostini/crostini_export_import.cc
@@ -367,7 +367,12 @@
                          std::move(callback)));
       break;
     case ExportImportType::IMPORT_DISK_IMAGE:
-      LOG(ERROR) << "Importing disk images is currently unimplemented";
+      crostini::CrostiniManager::GetForProfile(profile_)->StopVm(
+          operation_data->container_id.vm_name,
+          base::BindOnce(&CrostiniExportImport::ImportDiskImage,
+                         weak_ptr_factory_.GetWeakPtr(),
+                         operation_data->container_id, path,
+                         std::move(callback)));
       break;
   }
 }
@@ -399,12 +404,44 @@
 
   CrostiniManager::GetForProfile(profile_)->ExportDiskImage(
       container_id, user->username_hash(), path, /*force=*/false,
-      base::BindOnce(&CrostiniExportImport::AfterExportDiskImage,
+      base::BindOnce(&CrostiniExportImport::AfterDiskImageOperation,
                      weak_ptr_factory_.GetWeakPtr(), container_id,
                      std::move(callback)));
 }
 
-void CrostiniExportImport::AfterExportDiskImage(
+void CrostiniExportImport::ImportDiskImage(
+    const guest_os::GuestId& container_id,
+    const base::FilePath& path,
+    CrostiniManager::CrostiniResultCallback callback,
+    CrostiniResult result) {
+  if (result == CrostiniResult::VM_STOP_FAILED) {
+    LOG(ERROR) << "Unable to stop VM, cannot import disk image";
+    std::move(callback).Run(CrostiniResult::DISK_IMAGE_FAILED);
+    return;
+  }
+
+  ash::ProfileHelper* profile_helper = ash::ProfileHelper::Get();
+  if (!profile_helper) {
+    LOG(ERROR) << "Unable to get profile helper";
+    std::move(callback).Run(CrostiniResult::DISK_IMAGE_FAILED);
+    return;
+  }
+  user_manager::User* user = profile_helper->GetUserByProfile(profile_);
+
+  if (!user) {
+    LOG(ERROR) << "Unable to get user";
+    std::move(callback).Run(CrostiniResult::DISK_IMAGE_FAILED);
+    return;
+  }
+
+  CrostiniManager::GetForProfile(profile_)->ImportDiskImage(
+      container_id, user->username_hash(), path,
+      base::BindOnce(&CrostiniExportImport::AfterDiskImageOperation,
+                     weak_ptr_factory_.GetWeakPtr(), container_id,
+                     std::move(callback)));
+}
+
+void CrostiniExportImport::AfterDiskImageOperation(
     const guest_os::GuestId& container_id,
     CrostiniManager::CrostiniResultCallback callback,
     CrostiniResult result) {
@@ -858,6 +895,7 @@
       manager.CancelImportLxdContainer(std::move(container_id));
       return;
     case ExportImportType::EXPORT_DISK_IMAGE:
+    case ExportImportType::IMPORT_DISK_IMAGE:
       manager.CancelDiskImageOp(std::move(container_id));
       return;
     default:
diff --git a/chrome/browser/ash/crostini/crostini_export_import.h b/chrome/browser/ash/crostini/crostini_export_import.h
index e30a963..be22348 100644
--- a/chrome/browser/ash/crostini/crostini_export_import.h
+++ b/chrome/browser/ash/crostini/crostini_export_import.h
@@ -202,6 +202,11 @@
   FRIEND_TEST_ALL_PREFIXES(CrostiniExportImportTest, TestExportDiskImageFail);
   FRIEND_TEST_ALL_PREFIXES(CrostiniExportImportTest,
                            TestExportDiskImageCancelled);
+  FRIEND_TEST_ALL_PREFIXES(CrostiniExportImportTest,
+                           TestImportDiskImageSuccess);
+  FRIEND_TEST_ALL_PREFIXES(CrostiniExportImportTest, TestImportDiskImageFail);
+  FRIEND_TEST_ALL_PREFIXES(CrostiniExportImportTest,
+                           TestImportDiskImageCancelled);
 
   void FillOperationData(ExportImportType type,
                          guest_os::GuestId id,
@@ -255,9 +260,14 @@
                        CrostiniManager::CrostiniResultCallback callback,
                        CrostiniResult result);
 
-  void AfterExportDiskImage(const guest_os::GuestId& container_id,
-                            CrostiniManager::CrostiniResultCallback callback,
-                            CrostiniResult result);
+  void ImportDiskImage(const guest_os::GuestId& container_id,
+                       const base::FilePath& path,
+                       CrostiniManager::CrostiniResultCallback callback,
+                       CrostiniResult result);
+
+  void AfterDiskImageOperation(const guest_os::GuestId& container_id,
+                               CrostiniManager::CrostiniResultCallback callback,
+                               CrostiniResult result);
 
   void ExportAfterSharing(const guest_os::GuestId& container_id,
                           const base::FilePath& path,
diff --git a/chrome/browser/ash/crostini/crostini_export_import_status_tracker.cc b/chrome/browser/ash/crostini/crostini_export_import_status_tracker.cc
index 9685a77..e300ae7 100644
--- a/chrome/browser/ash/crostini/crostini_export_import_status_tracker.cc
+++ b/chrome/browser/ash/crostini/crostini_export_import_status_tracker.cc
@@ -18,7 +18,8 @@
     base::FilePath path)
     : type_(type), path_(path) {
   DCHECK(type == ExportImportType::EXPORT || type == ExportImportType::IMPORT ||
-         type == ExportImportType::EXPORT_DISK_IMAGE);
+         type == ExportImportType::EXPORT_DISK_IMAGE ||
+         type == ExportImportType::IMPORT_DISK_IMAGE);
 }
 
 CrostiniExportImportStatusTracker::~CrostiniExportImportStatusTracker() =
diff --git a/chrome/browser/ash/crostini/crostini_export_import_unittest.cc b/chrome/browser/ash/crostini/crostini_export_import_unittest.cc
index 550f9329..e65b5a3 100644
--- a/chrome/browser/ash/crostini/crostini_export_import_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_export_import_unittest.cc
@@ -28,6 +28,7 @@
 #include "chromeos/ash/components/dbus/seneschal/fake_seneschal_client.h"
 #include "chromeos/ash/components/dbus/seneschal/seneschal_client.h"
 #include "chromeos/ash/components/dbus/seneschal/seneschal_service.pb.h"
+#include "chromeos/ash/components/dbus/vm_concierge/concierge_service.pb.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/test/browser_task_environment.h"
 #include "storage/browser/file_system/external_mount_points.h"
@@ -120,6 +121,12 @@
     ash::FakeConciergeClient::Get()->NotifyDiskImageProgress(signal);
   }
 
+  void SetImportResponse() {
+    vm_tools::concierge::ImportDiskImageResponse response;
+    response.set_status(vm_tools::concierge::DISK_STATUS_IN_PROGRESS);
+    ash::FakeConciergeClient::Get()->set_import_disk_image_response(response);
+  }
+
   void SendImportProgress(
       const guest_os::GuestId& container_id,
       vm_tools::cicerone::ImportLxdContainerProgressSignal_Status status,
@@ -398,6 +405,176 @@
   }
 }
 
+TEST_F(CrostiniExportImportTest, TestImportDiskImageSuccess) {
+  SetImportResponse();
+  crostini_export_import_->FillOperationData(
+      ExportImportType::IMPORT_DISK_IMAGE);
+  base::ScopedTempFile zipfile;
+  EXPECT_TRUE(zipfile.Create());
+  crostini_export_import_->FileSelected(ui::SelectedFileInfo(zipfile.path()),
+                                        0);
+  task_environment_.RunUntilIdle();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController(default_container_id_);
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::RUNNING);
+
+  std::string notification_id;
+  {
+    const message_center::Notification& notification =
+        GetNotification(default_container_id_);
+    notification_id = notification.id();
+    EXPECT_EQ(notification.progress(), 0);
+    EXPECT_TRUE(notification.pinned());
+  }
+
+  // 50% done.
+  SendDiskImageProgress(default_container_id_,
+                        vm_tools::concierge::DISK_STATUS_IN_PROGRESS, 50);
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::RUNNING);
+  {
+    const message_center::Notification& notification =
+        GetNotification(default_container_id_);
+    EXPECT_EQ(notification.id(), notification_id);
+    EXPECT_EQ(notification.progress(), 50);
+    EXPECT_TRUE(notification.pinned());
+  }
+
+  // Close notification and update progress. Should not update notification.
+  controller->get_delegate()->Close(false);
+  SendDiskImageProgress(default_container_id_,
+                        vm_tools::concierge::DISK_STATUS_IN_PROGRESS, 60);
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::RUNNING);
+  {
+    const message_center::Notification& notification =
+        GetNotification(default_container_id_);
+    EXPECT_EQ(notification.id(), notification_id);
+    EXPECT_EQ(notification.progress(), 50);
+    EXPECT_TRUE(notification.pinned());
+  }
+
+  // Done.
+  SendDiskImageProgress(default_container_id_,
+                        vm_tools::concierge::DISK_STATUS_CREATED, 100);
+  EXPECT_EQ(GetController(default_container_id_), nullptr);
+  EXPECT_EQ(controller, nullptr);
+  {
+    const std::optional<message_center::Notification> ui_notification =
+        notification_display_service_->GetNotification(notification_id);
+    ASSERT_NE(ui_notification, std::nullopt);
+    EXPECT_FALSE(ui_notification->pinned());
+    std::string msg("Linux apps & files have been successfully replaced");
+    EXPECT_EQ(ui_notification->message(), base::UTF8ToUTF16(msg));
+  }
+}
+
+TEST_F(CrostiniExportImportTest, TestImportDiskImageFail) {
+  SetImportResponse();
+  crostini_export_import_->FillOperationData(
+      ExportImportType::IMPORT_DISK_IMAGE);
+  base::ScopedTempFile zipfile;
+  EXPECT_TRUE(zipfile.Create());
+  crostini_export_import_->FileSelected(ui::SelectedFileInfo(zipfile.path()),
+                                        0);
+  task_environment_.RunUntilIdle();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController(default_container_id_);
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::RUNNING);
+
+  std::string notification_id;
+  {
+    const message_center::Notification& notification =
+        GetNotification(default_container_id_);
+    notification_id = notification.id();
+    EXPECT_EQ(notification.progress(), 0);
+    EXPECT_TRUE(notification.pinned());
+  }
+
+  // Fails.
+  SendDiskImageProgress(default_container_id_,
+                        vm_tools::concierge::DISK_STATUS_FAILED, 0);
+  EXPECT_EQ(GetController(default_container_id_), nullptr);
+  EXPECT_EQ(controller, nullptr);
+  {
+    const std::optional<message_center::Notification> ui_notification =
+        notification_display_service_->GetNotification(notification_id);
+    ASSERT_NE(ui_notification, std::nullopt);
+    EXPECT_FALSE(ui_notification->pinned());
+    std::string msg("Restoring couldn't be completed due to an error");
+    EXPECT_EQ(ui_notification->message(), base::UTF8ToUTF16(msg));
+  }
+}
+
+TEST_F(CrostiniExportImportTest, TestImportDiskImageCancelled) {
+  SetImportResponse();
+  base::ScopedTempFile zipfile;
+  EXPECT_TRUE(zipfile.Create());
+  crostini_export_import_->FillOperationData(
+      ExportImportType::IMPORT_DISK_IMAGE, custom_container_id_);
+  crostini_export_import_->FileSelected(ui::SelectedFileInfo(zipfile.path()),
+                                        0);
+  task_environment_.RunUntilIdle();
+  base::WeakPtr<CrostiniExportImportNotificationController> controller =
+      GetController(custom_container_id_);
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::RUNNING);
+
+  std::string notification_id;
+  {
+    const message_center::Notification& notification =
+        GetNotification(custom_container_id_);
+    notification_id = notification.id();
+    EXPECT_EQ(notification.progress(), 0);
+    EXPECT_TRUE(notification.pinned());
+  }
+
+  // CANCEL:
+  crostini_export_import_->CancelOperation(ExportImportType::IMPORT_DISK_IMAGE,
+                                           custom_container_id_);
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::CANCELLING);
+  {
+    const message_center::Notification& notification =
+        GetNotification(custom_container_id_);
+    EXPECT_EQ(notification.id(), notification_id);
+    EXPECT_EQ(notification.progress(), -1);
+    EXPECT_FALSE(notification.pinned());
+  }
+
+  // Should not be displayed as cancel is in progress
+  SendDiskImageProgress(default_container_id_,
+                        vm_tools::concierge::DISK_STATUS_IN_PROGRESS, 7);
+  ASSERT_NE(controller, nullptr);
+  EXPECT_EQ(controller->status(),
+            CrostiniExportImportStatusTracker::Status::CANCELLING);
+  {
+    const message_center::Notification& notification =
+        GetNotification(custom_container_id_);
+    EXPECT_EQ(notification.id(), notification_id);
+    EXPECT_EQ(notification.progress(), -1);
+    EXPECT_FALSE(notification.pinned());
+  }
+
+  // CANCELLED:
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(GetController(custom_container_id_), nullptr);
+  EXPECT_EQ(controller, nullptr);
+  {
+    const std::optional<message_center::Notification> ui_notification =
+        notification_display_service_->GetNotification(notification_id);
+    EXPECT_EQ(ui_notification, std::nullopt);
+  }
+}
+
 TEST_F(CrostiniExportImportTest, TestExportSuccess) {
   crostini_export_import_->FillOperationData(ExportImportType::EXPORT);
   crostini_export_import_->FileSelected(ui::SelectedFileInfo(tarball_), 0);
diff --git a/chrome/browser/ash/crostini/crostini_manager.cc b/chrome/browser/ash/crostini/crostini_manager.cc
index c3257e6c..8b237708 100644
--- a/chrome/browser/ash/crostini/crostini_manager.cc
+++ b/chrome/browser/ash/crostini/crostini_manager.cc
@@ -1867,13 +1867,13 @@
     return;
   }
   if (user_id_hash.empty()) {
-    LOG(ERROR) << "vm_name is required";
+    LOG(ERROR) << "user_id_hash is required";
     std::move(callback).Run(CrostiniResult::CLIENT_ERROR);
     return;
   }
 
   if (disk_image_callbacks_.find(vm_id) != disk_image_callbacks_.end()) {
-    LOG(ERROR) << "Disk image export currently running for " << vm_id;
+    LOG(ERROR) << "Disk image operation currently running for " << vm_id;
     std::move(callback).Run(CrostiniResult::DISK_IMAGE_FAILED);
   }
   disk_image_callbacks_.emplace(vm_id, std::move(callback));
@@ -1930,6 +1930,76 @@
   disk_image_uuid_to_guest_id_.emplace(response->command_uuid(), vm_id);
 }
 
+void CrostiniManager::ImportDiskImage(guest_os::GuestId vm_id,
+                                      std::string user_id_hash,
+                                      base::FilePath import_path,
+                                      CrostiniResultCallback callback) {
+  if (vm_id.vm_name.empty()) {
+    LOG(ERROR) << "vm_name is required";
+    std::move(callback).Run(CrostiniResult::CLIENT_ERROR);
+    return;
+  }
+  if (user_id_hash.empty()) {
+    LOG(ERROR) << "user_id_hash is required";
+    std::move(callback).Run(CrostiniResult::CLIENT_ERROR);
+    return;
+  }
+
+  if (disk_image_callbacks_.find(vm_id) != disk_image_callbacks_.end()) {
+    LOG(ERROR) << "Disk image operation currently running for " << vm_id;
+    std::move(callback).Run(CrostiniResult::DISK_IMAGE_FAILED);
+  }
+  disk_image_callbacks_.emplace(vm_id, std::move(callback));
+
+  base::File file(import_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
+  if (!file.IsValid()) {
+    LOG(ERROR) << "Failed to open " << import_path;
+    return;
+  }
+
+  vm_tools::concierge::ImportDiskImageRequest request;
+  request.set_vm_name(vm_id.vm_name);
+  request.set_cryptohome_id(user_id_hash);
+  // All vm's are stored in root except pluginvm, which is not supported in this
+  // flow.
+  request.set_storage_location(vm_tools::concierge::STORAGE_CRYPTOHOME_ROOT);
+  request.set_source_size(file.GetLength());
+
+  GetConciergeClient()->ImportDiskImage(
+      base::ScopedFD(file.TakePlatformFile()), std::move(request),
+      base::BindOnce(&CrostiniManager::OnImportDiskImage,
+                     weak_ptr_factory_.GetWeakPtr(), vm_id));
+}
+
+void CrostiniManager::OnImportDiskImage(
+    guest_os::GuestId vm_id,
+    std::optional<vm_tools::concierge::ImportDiskImageResponse> response) {
+  auto it = disk_image_callbacks_.find(vm_id);
+  if (it == disk_image_callbacks_.end()) {
+    LOG(ERROR) << "No import callback for " << vm_id;
+    return;
+  }
+
+  if (!response) {
+    LOG(ERROR) << "Failed to import disk image. Empty response.";
+    std::move(it->second).Run(CrostiniResult::DISK_IMAGE_FAILED);
+    disk_image_callbacks_.erase(it);
+    return;
+  }
+
+  // If import has started, the callback will be invoked when the
+  // DiskImageProgressSignal signal indicates that import is
+  // complete, otherwise this is an error.
+  if (response->status() != vm_tools::concierge::DISK_STATUS_IN_PROGRESS) {
+    LOG(ERROR) << "Failed to import image: status=" << response->status()
+               << ", failure_reason=" << response->failure_reason();
+    std::move(it->second).Run(CrostiniResult::DISK_IMAGE_FAILED);
+    disk_image_callbacks_.erase(it);
+  }
+
+  disk_image_uuid_to_guest_id_.emplace(response->command_uuid(), vm_id);
+}
+
 void CrostiniManager::OnDiskImageProgress(
     const vm_tools::concierge::DiskImageStatusResponse& signal) {
   bool call_observers = false;
diff --git a/chrome/browser/ash/crostini/crostini_manager.h b/chrome/browser/ash/crostini/crostini_manager.h
index 01807b75..b7aaa86 100644
--- a/chrome/browser/ash/crostini/crostini_manager.h
+++ b/chrome/browser/ash/crostini/crostini_manager.h
@@ -335,6 +335,15 @@
                        bool force,
                        CrostiniResultCallback callback);
 
+  // Checks the arguments for exporting a vm disk image via
+  // ConciergeClient::ImportDiskImage. |callback| is called immedaitely if the
+  // arguments are bad, or after the method call finishes.
+  // using DiskImageCallback = base::OnceCallback<void(CrostiniResult result)>;
+  void ImportDiskImage(guest_os::GuestId vm_id,
+                       std::string user_id_hash,
+                       base::FilePath import_path,
+                       CrostiniResultCallback callback);
+
   // Checks the arguments for exporting an Lxd container via
   // CiceroneClient::ExportLxdContainer. |callback| is called immediately if the
   // arguments are bad, or after the method call finishes.
@@ -704,6 +713,12 @@
       guest_os::GuestId vm_id,
       std::optional<vm_tools::concierge::ExportDiskImageResponse> response);
 
+  // Callback for ConciergeClient::ImportDiskImage. Called after the Concierge
+  // service method finishes.
+  void OnImportDiskImage(
+      guest_os::GuestId vm_id,
+      std::optional<vm_tools::concierge::ImportDiskImageResponse> response);
+
   // Callback for CiceroneClient::CreateLxdContainer. May indicate the container
   // is still being created, in which case we will wait for an
   // OnLxdContainerCreated event.
diff --git a/chrome/browser/ash/crostini/crostini_manager_unittest.cc b/chrome/browser/ash/crostini/crostini_manager_unittest.cc
index e7ce53a..336de0eb 100644
--- a/chrome/browser/ash/crostini/crostini_manager_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_manager_unittest.cc
@@ -2067,6 +2067,80 @@
   EXPECT_EQ(result_future.Get<0>(), CrostiniResult::SUCCESS);
 }
 
+TEST_F(CrostiniManagerTest, ImportDiskImageFailure) {
+  base::ScopedTempFile import_path;
+  EXPECT_TRUE(import_path.Create());
+  TestFuture<CrostiniResult> result_future;
+  EXPECT_EQ(fake_concierge_client_->import_disk_image_call_count(), 0);
+
+  vm_tools::concierge::ImportDiskImageResponse failure_response;
+  failure_response.set_status(vm_tools::concierge::DISK_STATUS_FAILED);
+  fake_concierge_client_->set_import_disk_image_response(failure_response);
+
+  crostini_manager()->ImportDiskImage(container_id(), "my_cool_user_id_hash",
+                                      import_path.path(),
+                                      result_future.GetCallback());
+
+  EXPECT_EQ(fake_concierge_client_->import_disk_image_call_count(), 1);
+  EXPECT_EQ(result_future.Get<0>(), CrostiniResult::DISK_IMAGE_FAILED);
+}
+
+TEST_F(CrostiniManagerTest, ImportDiskImageNoSpaceFailure) {
+  base::ScopedTempFile import_path;
+  EXPECT_TRUE(import_path.Create());
+  TestFuture<CrostiniResult> result_future;
+  EXPECT_EQ(fake_concierge_client_->import_disk_image_call_count(), 0);
+
+  vm_tools::concierge::DiskImageStatusResponse progress_signal;
+  progress_signal.set_status(vm_tools::concierge::DISK_STATUS_IN_PROGRESS);
+  progress_signal.set_progress(50);
+  vm_tools::concierge::DiskImageStatusResponse no_space_signal;
+  no_space_signal.set_status(vm_tools::concierge::DISK_STATUS_NOT_ENOUGH_SPACE);
+  std::vector<vm_tools::concierge::DiskImageStatusResponse> signals;
+  signals.emplace_back(progress_signal);
+  signals.emplace_back(no_space_signal);
+  fake_concierge_client_->set_disk_image_status_signals(signals);
+
+  vm_tools::concierge::ImportDiskImageResponse response;
+  response.set_status(vm_tools::concierge::DISK_STATUS_IN_PROGRESS);
+  ash::FakeConciergeClient::Get()->set_import_disk_image_response(response);
+
+  crostini_manager()->ImportDiskImage(container_id(), "my_cool_user_id_hash",
+                                      import_path.path(),
+                                      result_future.GetCallback());
+
+  EXPECT_EQ(fake_concierge_client_->import_disk_image_call_count(), 1);
+  EXPECT_EQ(result_future.Get<0>(), CrostiniResult::DISK_IMAGE_FAILED_NO_SPACE);
+}
+
+TEST_F(CrostiniManagerTest, ImportDiskImageSuccess) {
+  base::ScopedTempFile import_path;
+  EXPECT_TRUE(import_path.Create());
+  TestFuture<CrostiniResult> result_future;
+  EXPECT_EQ(fake_concierge_client_->import_disk_image_call_count(), 0);
+
+  vm_tools::concierge::DiskImageStatusResponse progress_signal;
+  progress_signal.set_status(vm_tools::concierge::DISK_STATUS_IN_PROGRESS);
+  progress_signal.set_progress(50);
+  vm_tools::concierge::DiskImageStatusResponse done_signal;
+  done_signal.set_status(vm_tools::concierge::DISK_STATUS_CREATED);
+  std::vector<vm_tools::concierge::DiskImageStatusResponse> signals;
+  signals.emplace_back(progress_signal);
+  signals.emplace_back(done_signal);
+  fake_concierge_client_->set_disk_image_status_signals(signals);
+
+  vm_tools::concierge::ImportDiskImageResponse response;
+  response.set_status(vm_tools::concierge::DISK_STATUS_IN_PROGRESS);
+  ash::FakeConciergeClient::Get()->set_import_disk_image_response(response);
+
+  crostini_manager()->ImportDiskImage(container_id(), "my_cool_user_id_hash",
+                                      import_path.path(),
+                                      result_future.GetCallback());
+
+  EXPECT_EQ(fake_concierge_client_->import_disk_image_call_count(), 1);
+  EXPECT_EQ(result_future.Get<0>(), CrostiniResult::SUCCESS);
+}
+
 TEST_F(CrostiniManagerTest, ExportContainerSuccess) {
   uint64_t container_size = 123;
   uint64_t exported_size = 456;
diff --git a/chrome/browser/autofill/android/BUILD.gn b/chrome/browser/autofill/android/BUILD.gn
index d558bd2..144a0ae 100644
--- a/chrome/browser/autofill/android/BUILD.gn
+++ b/chrome/browser/autofill/android/BUILD.gn
@@ -29,6 +29,7 @@
     "java/src/org/chromium/chrome/browser/autofill/editors/AddressEditorMediator.java",
     "java/src/org/chromium/chrome/browser/autofill/editors/DropdownFieldAdapter.java",
     "java/src/org/chromium/chrome/browser/autofill/editors/DropdownFieldView.java",
+    "java/src/org/chromium/chrome/browser/autofill/editors/EditTextNoAutofillView.java",
     "java/src/org/chromium/chrome/browser/autofill/editors/EditorBase.java",
     "java/src/org/chromium/chrome/browser/autofill/editors/EditorDialogToolbar.java",
     "java/src/org/chromium/chrome/browser/autofill/editors/EditorDialogView.java",
diff --git a/chrome/browser/autofill/android/java/res/layout/autofill_local_card_editor.xml b/chrome/browser/autofill/android/java/res/layout/autofill_local_card_editor.xml
index 32f9774..cf09bbd 100644
--- a/chrome/browser/autofill/android/java/res/layout/autofill_local_card_editor.xml
+++ b/chrome/browser/autofill/android/java/res/layout/autofill_local_card_editor.xml
@@ -21,7 +21,7 @@
         app:errorTextAppearance="@style/TextAppearance.ErrorCaption">
 
         <!-- TODO(crbug.com/40600572): Fix and remove lint ignore -->
-        <EditText
+        <org.chromium.chrome.browser.autofill.editors.EditTextNoAutofillView
             tools:ignore="Autofill,LabelFor"
             android:id="@+id/credit_card_number_edit"
             android:layout_width="match_parent"
@@ -115,7 +115,7 @@
                 android:textAppearance="@style/TextAppearance.TextSmall.Secondary"
                 android:text="@string/autofill_credit_card_editor_expiration_date" />
 
-            <EditText
+            <org.chromium.chrome.browser.autofill.editors.EditTextNoAutofillView
                 android:id="@+id/expiration_month_and_year"
                 android:width="@dimen/local_card_expiration_date_editor_width"
                 android:layout_width="match_parent"
@@ -149,7 +149,7 @@
                 android:textAppearance="@style/TextAppearance.TextSmall.Secondary"
                 android:text="@string/autofill_credit_card_editor_security_code" />
 
-            <EditText
+            <org.chromium.chrome.browser.autofill.editors.EditTextNoAutofillView
                 android:id="@+id/cvc"
                 android:width="@dimen/local_card_cvc_editor_width"
                 android:layout_width="match_parent"
@@ -186,7 +186,7 @@
         android:layout_marginBottom="@dimen/pref_autofill_field_bottom_margin">
 
         <!-- TODO(crbug.com/40600572): Fix and remove lint ignore -->
-        <EditText
+        <org.chromium.chrome.browser.autofill.editors.EditTextNoAutofillView
             tools:ignore="Autofill,LabelFor"
             android:id="@+id/credit_card_name_edit"
             android:layout_width="match_parent"
@@ -211,7 +211,7 @@
         android:layout_marginTop="@dimen/pref_autofill_field_extra_large_top_margin"
         android:layout_marginBottom="@dimen/pref_autofill_field_bottom_margin">
 
-        <EditText
+        <org.chromium.chrome.browser.autofill.editors.EditTextNoAutofillView
             tools:ignore="Autofill,LabelFor"
             android:id="@+id/credit_card_nickname_edit"
             android:maxLength="25"
diff --git a/chrome/browser/autofill/android/java/res/layout/autofill_local_iban_editor.xml b/chrome/browser/autofill/android/java/res/layout/autofill_local_iban_editor.xml
index 0585be1e..508b1627 100644
--- a/chrome/browser/autofill/android/java/res/layout/autofill_local_iban_editor.xml
+++ b/chrome/browser/autofill/android/java/res/layout/autofill_local_iban_editor.xml
@@ -20,7 +20,7 @@
         android:layout_marginBottom="@dimen/pref_autofill_field_bottom_margin"
         app:errorTextAppearance="@style/TextAppearance.ErrorCaption">
 
-        <EditText
+        <org.chromium.chrome.browser.autofill.editors.EditTextNoAutofillView
             tools:ignore="Autofill,LabelFor"
             android:id="@+id/iban_value_edit"
             android:layout_width="match_parent"
@@ -44,7 +44,7 @@
         android:layout_marginTop="@dimen/pref_autofill_field_extra_large_top_margin"
         android:layout_marginBottom="@dimen/pref_autofill_field_bottom_margin">
 
-        <EditText
+        <org.chromium.chrome.browser.autofill.editors.EditTextNoAutofillView
             tools:ignore="Autofill,LabelFor"
             android:id="@+id/iban_nickname_edit"
             android:maxLength="25"
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 d4e7338..e124550 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
@@ -829,26 +829,7 @@
 
     public static String getBasicCardIssuerNetwork(String cardNumber, boolean emptyIfInvalid) {
         ThreadUtils.assertOnUiThread();
-        return PersonalDataManagerJni.get()
-                .getBasicCardIssuerNetwork(
-                        cardNumber,
-                        emptyIfInvalid);
-    }
-
-    public void addServerCreditCardForTest(CreditCard card) {
-        ThreadUtils.assertOnUiThread();
-        assert !card.getIsLocal();
-        PersonalDataManagerJni.get()
-                .addServerCreditCardForTest(mPersonalDataManagerAndroid, card); // IN-TEST
-    }
-
-    public void addServerCreditCardForTestWithAdditionalFields(
-            CreditCard card, String nickname, int cardIssuer) {
-        ThreadUtils.assertOnUiThread();
-        assert !card.getIsLocal();
-        PersonalDataManagerJni.get()
-                .addServerCreditCardForTestWithAdditionalFields(
-                        mPersonalDataManagerAndroid, card, nickname, cardIssuer);
+        return PersonalDataManagerJni.get().getBasicCardIssuerNetwork(cardNumber, emptyIfInvalid);
     }
 
     public void deleteCreditCard(String guid) {
@@ -920,12 +901,6 @@
         return PersonalDataManagerJni.get().getMaskedBankAccounts(mPersonalDataManagerAndroid);
     }
 
-    public void addMaskedBankAccountForTest(BankAccount bankAccount) {
-        ThreadUtils.assertOnUiThread();
-        PersonalDataManagerJni.get()
-                .addMaskedBankAccountForTest(mPersonalDataManagerAndroid, bankAccount);
-    }
-
     /**
      * Records the use of the profile associated with the specified {@code guid}. Effectively
      * increments the use count of the profile and sets its use date to the current time. Also logs
@@ -938,25 +913,6 @@
         PersonalDataManagerJni.get().recordAndLogProfileUse(mPersonalDataManagerAndroid, guid);
     }
 
-    protected void setProfileUseStatsForTesting(String guid, int count, int daysSinceLastUsed) {
-        ThreadUtils.assertOnUiThread();
-        PersonalDataManagerJni.get()
-                .setProfileUseStatsForTesting(
-                        mPersonalDataManagerAndroid, guid, count, daysSinceLastUsed);
-    }
-
-    int getProfileUseCountForTesting(String guid) {
-        ThreadUtils.assertOnUiThread();
-        return PersonalDataManagerJni.get()
-                .getProfileUseCountForTesting(mPersonalDataManagerAndroid, guid); // IN-TEST
-    }
-
-    long getProfileUseDateForTesting(String guid) {
-        ThreadUtils.assertOnUiThread();
-        return PersonalDataManagerJni.get()
-                .getProfileUseDateForTesting(mPersonalDataManagerAndroid, guid); // IN-TEST
-    }
-
     /**
      * Records the use of the credit card associated with the specified {@code guid}. Effectively
      * increments the use count of the credit card and set its use date to the current time. Also
@@ -969,44 +925,6 @@
         PersonalDataManagerJni.get().recordAndLogCreditCardUse(mPersonalDataManagerAndroid, guid);
     }
 
-    protected void setCreditCardUseStatsForTesting(String guid, int count, int daysSinceLastUsed) {
-        ThreadUtils.assertOnUiThread();
-        PersonalDataManagerJni.get()
-                .setCreditCardUseStatsForTesting(
-                        mPersonalDataManagerAndroid, guid, count, daysSinceLastUsed);
-    }
-
-    int getCreditCardUseCountForTesting(String guid) {
-        ThreadUtils.assertOnUiThread();
-        return PersonalDataManagerJni.get()
-                .getCreditCardUseCountForTesting(mPersonalDataManagerAndroid, guid); // IN-TEST
-    }
-
-    long getCreditCardUseDateForTesting(String guid) {
-        ThreadUtils.assertOnUiThread();
-        return PersonalDataManagerJni.get()
-                .getCreditCardUseDateForTesting(mPersonalDataManagerAndroid, guid); // IN-TEST
-    }
-
-    long getCurrentDateForTesting() {
-        ThreadUtils.assertOnUiThread();
-        return PersonalDataManagerJni.get()
-                .getCurrentDateForTesting(mPersonalDataManagerAndroid); // IN-TEST
-    }
-
-    long getDateNDaysAgoForTesting(int days) {
-        ThreadUtils.assertOnUiThread();
-        return PersonalDataManagerJni.get()
-                .getDateNDaysAgoForTesting( // IN-TEST
-                        mPersonalDataManagerAndroid, days);
-    }
-
-    protected void clearServerDataForTesting() {
-        ThreadUtils.assertOnUiThread();
-        PersonalDataManagerJni.get()
-                .clearServerDataForTesting(mPersonalDataManagerAndroid); // IN-TEST
-    }
-
     protected void clearImageDataForTesting() {
         if (mImageFetcher == null) {
             return;
@@ -1189,10 +1107,6 @@
                 .isAutofillCreditCardManaged(mPersonalDataManagerAndroid);
     }
 
-    public void setSyncServiceForTesting() {
-        PersonalDataManagerJni.get().setSyncServiceForTesting(mPersonalDataManagerAndroid);
-    }
-
     private void fetchCreditCardArtImages() {
         mImageFetcher.prefetchImages(
                 getCreditCardsToSuggest().stream()
@@ -1291,55 +1205,16 @@
 
         String setCreditCard(long nativePersonalDataManagerAndroid, CreditCard card);
 
-        long getDateNDaysAgoForTesting(long nativePersonalDataManagerAndroid, int days); // IN-TEST
-
         void updateServerCardBillingAddress(long nativePersonalDataManagerAndroid, CreditCard card);
 
         String getBasicCardIssuerNetwork(String cardNumber, boolean emptyIfInvalid);
 
-        void addServerCreditCardForTest(
-                long nativePersonalDataManagerAndroid, CreditCard card); // IN-TEST
-
-        void addServerCreditCardForTestWithAdditionalFields(
-                long nativePersonalDataManagerAndroid,
-                CreditCard card,
-                String nickname,
-                int cardIssuer);
-
         void removeByGUID(long nativePersonalDataManagerAndroid, String guid);
 
         void recordAndLogProfileUse(long nativePersonalDataManagerAndroid, String guid);
 
-        void setProfileUseStatsForTesting(
-                long nativePersonalDataManagerAndroid,
-                String guid,
-                int count,
-                int daysSinceLastUsed);
-
-        int getProfileUseCountForTesting(
-                long nativePersonalDataManagerAndroid, String guid); // IN-TEST
-
-        long getProfileUseDateForTesting(
-                long nativePersonalDataManagerAndroid, String guid); // IN-TEST
-
         void recordAndLogCreditCardUse(long nativePersonalDataManagerAndroid, String guid);
 
-        void setCreditCardUseStatsForTesting(
-                long nativePersonalDataManagerAndroid,
-                String guid,
-                int count,
-                int daysSinceLastUsed);
-
-        int getCreditCardUseCountForTesting(
-                long nativePersonalDataManagerAndroid, String guid); // IN-TEST
-
-        long getCreditCardUseDateForTesting(
-                long nativePersonalDataManagerAndroid, String guid); // IN-TEST
-
-        long getCurrentDateForTesting(long nativePersonalDataManagerAndroid); // IN-TEST
-
-        void clearServerDataForTesting(long nativePersonalDataManagerAndroid); // IN-TEST
-
         boolean hasProfiles(long nativePersonalDataManagerAndroid);
 
         boolean hasCreditCards(long nativePersonalDataManagerAndroid);
@@ -1354,8 +1229,6 @@
 
         String toCountryCode(String countryName);
 
-        void setSyncServiceForTesting(long nativePersonalDataManagerAndroid);
-
         AutofillImageFetcher getOrCreateJavaImageFetcher(long nativePersonalDataManagerAndroid);
 
         void addServerIbanForTest(long nativePersonalDataManagerAndroid, Iban iban); // IN-TEST
@@ -1369,8 +1242,5 @@
         boolean isValidIban(long nativePersonalDataManagerAndroid, String ibanValue);
 
         BankAccount[] getMaskedBankAccounts(long nativePersonalDataManagerAndroid);
-
-        void addMaskedBankAccountForTest(
-                long nativePersonalDataManagerAndroid, BankAccount bankAccount); // IN-TEST
     }
 }
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/EditTextNoAutofillView.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/EditTextNoAutofillView.java
new file mode 100644
index 0000000..4ff47d7
--- /dev/null
+++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/EditTextNoAutofillView.java
@@ -0,0 +1,24 @@
+// 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.
+
+package org.chromium.chrome.browser.autofill.editors;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.ViewStructure;
+import android.widget.EditText;
+
+/**
+ * A wrapper class around {@link EditText} to stop Android Autofill from suggesting cards. This is
+ * achieved by overriding the {@code onProvideAutofillStructure} method.
+ */
+public class EditTextNoAutofillView extends EditText {
+
+    public EditTextNoAutofillView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    public void onProvideAutofillStructure(ViewStructure structure, int flags) {}
+}
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.cc b/chrome/browser/autofill/android/personal_data_manager_android.cc
index ccbfda9..bb391bf 100644
--- a/chrome/browser/autofill/android/personal_data_manager_android.cc
+++ b/chrome/browser/autofill/android/personal_data_manager_android.cc
@@ -390,32 +390,6 @@
       {card});
 }
 
-void PersonalDataManagerAndroid::AddServerCreditCardForTest(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& jcard) {
-  std::unique_ptr<CreditCard> card = std::make_unique<CreditCard>();
-  PopulateNativeCreditCardFromJava(jcard, env, card.get());
-  card->set_record_type(CreditCard::RecordType::kMaskedServerCard);
-  personal_data_manager_->payments_data_manager().AddServerCreditCardForTest(
-      std::move(card));
-  personal_data_manager_->NotifyPersonalDataObserver();
-}
-
-void PersonalDataManagerAndroid::AddServerCreditCardForTestWithAdditionalFields(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& jcard,
-    const base::android::JavaParamRef<jstring>& jnickname,
-    jint jcard_issuer) {
-  std::unique_ptr<CreditCard> card = std::make_unique<CreditCard>();
-  PopulateNativeCreditCardFromJava(jcard, env, card.get());
-  card->set_record_type(CreditCard::RecordType::kMaskedServerCard);
-  card->SetNickname(ConvertJavaStringToUTF16(jnickname));
-  card->set_card_issuer(static_cast<CreditCard::Issuer>(jcard_issuer));
-  personal_data_manager_->payments_data_manager().AddServerCreditCardForTest(
-      std::move(card));
-  personal_data_manager_->NotifyPersonalDataObserver();
-}
-
 void PersonalDataManagerAndroid::RemoveByGUID(
     JNIEnv* env,
     const JavaParamRef<jstring>& jguid) {
@@ -446,39 +420,6 @@
   }
 }
 
-void PersonalDataManagerAndroid::SetProfileUseStatsForTesting(
-    JNIEnv* env,
-    const JavaParamRef<jstring>& jguid,
-    jint count,
-    jint days_since_last_used) {
-  DCHECK(count >= 0 && days_since_last_used >= 0);
-
-  AutofillProfile profile =
-      *personal_data_manager_->address_data_manager().GetProfileByGUID(
-          ConvertJavaStringToUTF8(env, jguid));
-  profile.set_use_count(static_cast<size_t>(count));
-  profile.set_use_date(AutofillClock::Now() - base::Days(days_since_last_used));
-  personal_data_manager_->address_data_manager().UpdateProfile(profile);
-}
-
-jint PersonalDataManagerAndroid::GetProfileUseCountForTesting(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jstring>& jguid) {
-  const AutofillProfile* profile =
-      personal_data_manager_->address_data_manager().GetProfileByGUID(
-          ConvertJavaStringToUTF8(env, jguid));
-  return profile->use_count();
-}
-
-jlong PersonalDataManagerAndroid::GetProfileUseDateForTesting(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jstring>& jguid) {
-  const AutofillProfile* profile =
-      personal_data_manager_->address_data_manager().GetProfileByGUID(
-          ConvertJavaStringToUTF8(env, jguid));
-  return profile->use_date().ToTimeT();
-}
-
 void PersonalDataManagerAndroid::RecordAndLogCreditCardUse(
     JNIEnv* env,
     const JavaParamRef<jstring>& jguid) {
@@ -490,57 +431,6 @@
   }
 }
 
-void PersonalDataManagerAndroid::SetCreditCardUseStatsForTesting(
-    JNIEnv* env,
-    const JavaParamRef<jstring>& jguid,
-    jint count,
-    jint days_since_last_used) {
-  DCHECK(count >= 0 && days_since_last_used >= 0);
-
-  CreditCard* card =
-      personal_data_manager_->payments_data_manager().GetCreditCardByGUID(
-          ConvertJavaStringToUTF8(env, jguid));
-  card->set_use_count(static_cast<size_t>(count));
-  card->set_use_date(AutofillClock::Now() - base::Days(days_since_last_used));
-
-  personal_data_manager_->NotifyPersonalDataObserver();
-}
-
-jint PersonalDataManagerAndroid::GetCreditCardUseCountForTesting(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jstring>& jguid) {
-  const CreditCard* card =
-      personal_data_manager_->payments_data_manager().GetCreditCardByGUID(
-          ConvertJavaStringToUTF8(env, jguid));
-  return card->use_count();
-}
-
-jlong PersonalDataManagerAndroid::GetCreditCardUseDateForTesting(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jstring>& jguid) {
-  const CreditCard* card =
-      personal_data_manager_->payments_data_manager().GetCreditCardByGUID(
-          ConvertJavaStringToUTF8(env, jguid));
-  return card->use_date().ToTimeT();
-}
-
-// TODO(crbug.com/40477114): Use a mock clock for testing.
-jlong PersonalDataManagerAndroid::GetCurrentDateForTesting(JNIEnv* env) {
-  return base::Time::Now().ToTimeT();
-}
-
-jlong PersonalDataManagerAndroid::GetDateNDaysAgoForTesting(
-    JNIEnv* env,
-    jint days) {
-  return (AutofillClock::Now() - base::Days(days)).ToTimeT();
-}
-
-void PersonalDataManagerAndroid::ClearServerDataForTesting(JNIEnv* env) {
-  personal_data_manager_->payments_data_manager()
-      .ClearAllServerDataForTesting();  // IN-TEST
-  personal_data_manager_->NotifyPersonalDataObserver();
-}
-
 jboolean PersonalDataManagerAndroid::HasProfiles(JNIEnv* env) {
   return !personal_data_manager_->address_data_manager().GetProfiles().empty();
 }
@@ -562,11 +452,6 @@
   return IsCreditCardFidoAuthenticationEnabled();
 }
 
-void PersonalDataManagerAndroid::SetSyncServiceForTesting(JNIEnv* env) {
-  personal_data_manager_->payments_data_manager().SetSyncingForTest(
-      true);  // IN-TEST
-}
-
 base::android::ScopedJavaLocalRef<jobject>
 PersonalDataManagerAndroid::GetOrCreateJavaImageFetcher(JNIEnv* env) {
   return static_cast<AutofillImageFetcherImpl*>(
@@ -851,16 +736,6 @@
                                                   type.obj());
 }
 
-void PersonalDataManagerAndroid::AddMaskedBankAccountForTest(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jbank_account) {
-  BankAccount bank_account =
-      CreateNativeBankAccountFromJava(env, jbank_account);
-  personal_data_manager_->payments_data_manager().AddMaskedBankAccountForTest(
-      bank_account);  // IN-TEST
-  personal_data_manager_->NotifyPersonalDataObserver();
-}
-
 jboolean PersonalDataManagerAndroid::IsAutofillManaged(JNIEnv* env) {
   return prefs::IsAutofillManaged(prefs_);
 }
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.h b/chrome/browser/autofill/android/personal_data_manager_android.h
index 7d61499..10b744c 100644
--- a/chrome/browser/autofill/android/personal_data_manager_android.h
+++ b/chrome/browser/autofill/android/personal_data_manager_android.h
@@ -160,19 +160,6 @@
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& jcard);
 
-  // Adds a server credit card. Used only in tests.
-  void AddServerCreditCardForTest(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& jcard);
-
-  // Adds a server credit card and sets the additional fields, for example,
-  // card_issuer, nickname. Used only in tests.
-  void AddServerCreditCardForTestWithAdditionalFields(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& jcard,
-      const base::android::JavaParamRef<jstring>& jnickname,
-      jint jcard_issuer);
-
   // Removes the profile or credit card represented by |jguid|.
   void RemoveByGUID(JNIEnv* env,
                     const base::android::JavaParamRef<jstring>& jguid);
@@ -193,29 +180,6 @@
       JNIEnv* env,
       const base::android::JavaParamRef<jstring>& jguid);
 
-  // Sets the use count and number of days since last use of the profile
-  // associated to the `jguid`. Both `count` and `days_since_last_used` should
-  // be non-negative. `days_since_last_used` represents the numbers of days
-  // since the profile was last used.
-  void SetProfileUseStatsForTesting(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jstring>& jguid,
-      jint count,
-      jint days_since_last_used);
-
-  // Returns the use count of the profile associated to the |jguid|.
-  jint GetProfileUseCountForTesting(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jstring>& jguid);
-
-  // Returns the use date of the profile associated to the |jguid|. It
-  // represents an absolute point in coordinated universal time (UTC)
-  // represented as microseconds since the Windows epoch. For more details see
-  // the comment header in time.h.
-  jlong GetProfileUseDateForTesting(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jstring>& jguid);
-
   // Records the use and log usage metrics for the credit card associated with
   // the |jguid|. Increments the use count of the credit card and sets its use
   // date to the current time.
@@ -223,44 +187,6 @@
       JNIEnv* env,
       const base::android::JavaParamRef<jstring>& jguid);
 
-  // Sets the use count and number of days since last use of the credit card
-  // associated to the`jguid`. Both `count` and `days_since_last_used` should be
-  // non-negative. `days_since_last_used` represents the numbers of days since
-  // the card was last used.
-  void SetCreditCardUseStatsForTesting(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jstring>& jguid,
-      jint count,
-      jint days_since_last_used);
-
-  // Returns the use count of the credit card associated to the |jguid|.
-  jint GetCreditCardUseCountForTesting(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jstring>& jguid);
-
-  // Returns the use date of the credit card associated to the |jguid|. It
-  // represents an absolute point in coordinated universal time (UTC)
-  // represented as microseconds since the Windows epoch. For more details see
-  // the comment header in time.h.
-  jlong GetCreditCardUseDateForTesting(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jstring>& jguid);
-
-  // Returns the current date represented as an absolute point in coordinated
-  // universal time (UTC) represented as microseconds since the Unix epoch. For
-  // more details see the comment header in time.h
-  jlong GetCurrentDateForTesting(JNIEnv* env);
-
-  // Calculates a point in time `days` days ago from the current
-  // time. Returns the result as an absolute point in coordinated universal time
-  // (UTC) represented as microseconds since the Windows epoch.
-  jlong GetDateNDaysAgoForTesting(
-      JNIEnv* env,
-      jint days);
-
-  // Clears server profiles and cards, to be used in tests only.
-  void ClearServerDataForTesting(JNIEnv* env);
-
   // Checks whether the Autofill PersonalDataManager has profiles.
   jboolean HasProfiles(JNIEnv* env);
 
@@ -270,8 +196,6 @@
   // Checks whether FIDO authentication is available.
   jboolean IsFidoAuthenticationAvailable(JNIEnv* env);
 
-  void SetSyncServiceForTesting(JNIEnv* env);
-
   // Get Java AutofillImageFetcher.
   base::android::ScopedJavaLocalRef<jobject> GetOrCreateJavaImageFetcher(
       JNIEnv* env);
@@ -325,24 +249,18 @@
   base::android::ScopedJavaLocalRef<jobjectArray> GetMaskedBankAccounts(
       JNIEnv* env);
 
-  // Add a BankAccount object to the existing list of BankAccounts stored in
-  // PersonalDataManager.
-  void AddMaskedBankAccountForTest(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& jbank_account);
-
   // Create an object of Java BankAccount from native BankAccount.
   static base::android::ScopedJavaLocalRef<jobject>
   CreateJavaBankAccountFromNative(JNIEnv* env, const BankAccount& bank_account);
 
- private:
-  ~PersonalDataManagerAndroid() override;
-
   // Create an object of native BankAccount from Java BankAccount.
   static BankAccount CreateNativeBankAccountFromJava(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& jbank_account);
 
+ private:
+  ~PersonalDataManagerAndroid() override;
+
   // Returns the GUIDs of the |profiles| passed as parameter.
   base::android::ScopedJavaLocalRef<jobjectArray> GetProfileGUIDs(
       JNIEnv* env,
diff --git a/chrome/browser/autofill/test/BUILD.gn b/chrome/browser/autofill/test/BUILD.gn
index f01aee0..b3f7b40 100644
--- a/chrome/browser/autofill/test/BUILD.gn
+++ b/chrome/browser/autofill/test/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//build/config/android/rules.gni")
+import("//third_party/jni_zero/jni_zero.gni")
 
 android_library("test_java") {
   testonly = true
@@ -44,6 +45,7 @@
     "//content/public/android:content_java",
     "//third_party/android_deps:espresso_java",
     "//third_party/hamcrest:hamcrest_java",
+    "//third_party/jni_zero:jni_zero_java",
     "//url:gurl_java",
   ]
 
@@ -53,4 +55,24 @@
     "//components/autofill/android:main_autofill_java",
     "//content/public/test/android:content_java_test_support",
   ]
+
+  srcjar_deps = [ ":jni_headers" ]
+}
+
+generate_jni("jni_headers") {
+  testonly = true
+  visibility = [ ":*" ]
+  sources = [ "android/java/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java" ]
+}
+
+static_library("test_support") {
+  testonly = true
+  sources = [ "android/autofill_test_helper_android.cc" ]
+  deps = [
+    ":jni_headers",
+    "//base",
+    "//chrome/browser",
+    "//chrome/browser/autofill",
+    "//components/autofill/core/browser",
+  ]
 }
diff --git a/chrome/browser/autofill/test/android/autofill_test_helper_android.cc b/chrome/browser/autofill/test/android/autofill_test_helper_android.cc
new file mode 100644
index 0000000..89ea118
--- /dev/null
+++ b/chrome/browser/autofill/test/android/autofill_test_helper_android.cc
@@ -0,0 +1,192 @@
+// 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 <jni.h>
+
+#include <memory>
+
+#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
+#include "chrome/browser/autofill/android/personal_data_manager_android.h"
+#include "chrome/browser/autofill/personal_data_manager_factory.h"
+#include "chrome/browser/autofill/test/jni_headers/AutofillTestHelper_jni.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "components/autofill/core/browser/data_model/bank_account.h"
+#include "components/autofill/core/browser/data_model/credit_card.h"
+#include "components/autofill/core/browser/personal_data_manager.h"
+#include "components/autofill/core/common/autofill_clock.h"
+
+namespace autofill {
+namespace {
+
+using ::base::android::ConvertJavaStringToUTF16;
+using ::base::android::ConvertJavaStringToUTF8;
+using ::base::android::JavaParamRef;
+
+PersonalDataManager* GetPersonalDataManagerForLastUsedProfile() {
+  return PersonalDataManagerFactory::GetForBrowserContext(
+      ProfileManager::GetLastUsedProfile());
+}
+
+}  // anonymous namespace
+
+// static
+jlong JNI_AutofillTestHelper_GetDateNDaysAgo(JNIEnv* env, jint days) {
+  return (AutofillClock::Now() - base::Days(days)).ToTimeT();
+}
+
+// static
+void JNI_AutofillTestHelper_AddServerCreditCard(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcard) {
+  std::unique_ptr<CreditCard> card = std::make_unique<CreditCard>();
+  PersonalDataManagerAndroid::PopulateNativeCreditCardFromJava(jcard, env,
+                                                               card.get());
+  card->set_record_type(CreditCard::RecordType::kMaskedServerCard);
+  PersonalDataManager* personal_data_manager =
+      GetPersonalDataManagerForLastUsedProfile();
+  personal_data_manager->payments_data_manager().AddServerCreditCardForTest(
+      std::move(card));
+  personal_data_manager->NotifyPersonalDataObserver();
+}
+
+// static
+void JNI_AutofillTestHelper_AddServerCreditCardWithAdditionalFields(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcard,
+    const base::android::JavaParamRef<jstring>& jnickname,
+    jint jcard_issuer) {
+  std::unique_ptr<CreditCard> card = std::make_unique<CreditCard>();
+  PersonalDataManagerAndroid::PopulateNativeCreditCardFromJava(jcard, env,
+                                                               card.get());
+  card->set_record_type(CreditCard::RecordType::kMaskedServerCard);
+  card->SetNickname(ConvertJavaStringToUTF16(jnickname));
+  card->set_card_issuer(static_cast<CreditCard::Issuer>(jcard_issuer));
+  PersonalDataManager* personal_data_manager =
+      GetPersonalDataManagerForLastUsedProfile();
+  personal_data_manager->payments_data_manager().AddServerCreditCardForTest(
+      std::move(card));
+  personal_data_manager->NotifyPersonalDataObserver();
+}
+
+// static
+void JNI_AutofillTestHelper_SetProfileUseStats(
+    JNIEnv* env,
+    const JavaParamRef<jstring>& jguid,
+    jint count,
+    jint days_since_last_used) {
+  DCHECK(count >= 0 && days_since_last_used >= 0);
+
+  PersonalDataManager* personal_data_manager =
+      GetPersonalDataManagerForLastUsedProfile();
+  AutofillProfile profile =
+      *personal_data_manager->address_data_manager().GetProfileByGUID(
+          ConvertJavaStringToUTF8(env, jguid));
+  profile.set_use_count(static_cast<size_t>(count));
+  profile.set_use_date(AutofillClock::Now() - base::Days(days_since_last_used));
+  personal_data_manager->address_data_manager().UpdateProfile(profile);
+}
+
+// static
+jint JNI_AutofillTestHelper_GetProfileUseCount(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jstring>& jguid) {
+  PersonalDataManager* personal_data_manager =
+      GetPersonalDataManagerForLastUsedProfile();
+  const AutofillProfile* profile =
+      personal_data_manager->address_data_manager().GetProfileByGUID(
+          ConvertJavaStringToUTF8(env, jguid));
+  return profile->use_count();
+}
+
+// static
+jlong JNI_AutofillTestHelper_GetProfileUseDate(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jstring>& jguid) {
+  PersonalDataManager* personal_data_manager =
+      GetPersonalDataManagerForLastUsedProfile();
+  const AutofillProfile* profile =
+      personal_data_manager->address_data_manager().GetProfileByGUID(
+          ConvertJavaStringToUTF8(env, jguid));
+  return profile->use_date().ToTimeT();
+}
+
+// static
+void JNI_AutofillTestHelper_SetCreditCardUseStats(
+    JNIEnv* env,
+    const JavaParamRef<jstring>& jguid,
+    jint count,
+    jint days_since_last_used) {
+  DCHECK(count >= 0 && days_since_last_used >= 0);
+
+  PersonalDataManager* personal_data_manager =
+      GetPersonalDataManagerForLastUsedProfile();
+  CreditCard* card =
+      personal_data_manager->payments_data_manager().GetCreditCardByGUID(
+          ConvertJavaStringToUTF8(env, jguid));
+  card->set_use_count(static_cast<size_t>(count));
+  card->set_use_date(AutofillClock::Now() - base::Days(days_since_last_used));
+
+  personal_data_manager->NotifyPersonalDataObserver();
+}
+
+// static
+jint JNI_AutofillTestHelper_GetCreditCardUseCount(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jstring>& jguid) {
+  PersonalDataManager* personal_data_manager =
+      GetPersonalDataManagerForLastUsedProfile();
+  const CreditCard* card =
+      personal_data_manager->payments_data_manager().GetCreditCardByGUID(
+          ConvertJavaStringToUTF8(env, jguid));
+  return card->use_count();
+}
+
+// static
+jlong JNI_AutofillTestHelper_GetCreditCardUseDate(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jstring>& jguid) {
+  PersonalDataManager* personal_data_manager =
+      GetPersonalDataManagerForLastUsedProfile();
+  const CreditCard* card =
+      personal_data_manager->payments_data_manager().GetCreditCardByGUID(
+          ConvertJavaStringToUTF8(env, jguid));
+  return card->use_date().ToTimeT();
+}
+
+// TODO(crbug.com/40477114): Use a mock clock for testing.
+jlong JNI_AutofillTestHelper_GetCurrentDate(JNIEnv* env) {
+  return base::Time::Now().ToTimeT();
+}
+
+// static
+void JNI_AutofillTestHelper_ClearServerData(JNIEnv* env) {
+  PersonalDataManager* personal_data_manager =
+      GetPersonalDataManagerForLastUsedProfile();
+  personal_data_manager->payments_data_manager().ClearAllServerDataForTesting();
+  personal_data_manager->NotifyPersonalDataObserver();
+}
+
+// static
+void JNI_AutofillTestHelper_SetSyncService(JNIEnv* env) {
+  GetPersonalDataManagerForLastUsedProfile()
+      ->payments_data_manager()
+      .SetSyncingForTest(true);
+}
+
+// static
+void JNI_AutofillTestHelper_AddMaskedBankAccount(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& jbank_account) {
+  BankAccount bank_account =
+      PersonalDataManagerAndroid::CreateNativeBankAccountFromJava(
+          env, jbank_account);
+  PersonalDataManager* personal_data_manager =
+      GetPersonalDataManagerForLastUsedProfile();
+  personal_data_manager->payments_data_manager().AddMaskedBankAccountForTest(
+      bank_account);
+  personal_data_manager->NotifyPersonalDataObserver();
+}
+
+}  // namespace autofill
diff --git a/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java b/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java
index 984725c3..1ab3dd6 100644
--- a/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java
+++ b/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java
@@ -19,6 +19,8 @@
 import androidx.test.espresso.util.HumanReadables;
 
 import org.hamcrest.Matcher;
+import org.jni_zero.JNINamespace;
+import org.jni_zero.NativeMethods;
 
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
@@ -39,6 +41,7 @@
 import java.util.concurrent.TimeoutException;
 
 /** Helper class for testing AutofillProfiles. */
+@JNINamespace("autofill")
 public class AutofillTestHelper {
     private final CallbackHelper mOnPersonalDataChangedHelper = new CallbackHelper();
 
@@ -68,8 +71,7 @@
     }
 
     void setSyncServiceForTesting() {
-        runOnUiThreadBlocking(
-                () -> getPersonalDataManagerForLastUsedProfile().setSyncServiceForTesting());
+        runOnUiThreadBlocking(() -> AutofillTestHelperJni.get().setSyncService());
     }
 
     AutofillProfile getProfile(final String guid) {
@@ -146,8 +148,7 @@
 
     public void addServerCreditCard(final CreditCard card) throws TimeoutException {
         int callCount = mOnPersonalDataChangedHelper.getCallCount();
-        runOnUiThreadBlocking(
-                () -> getPersonalDataManagerForLastUsedProfile().addServerCreditCardForTest(card));
+        runOnUiThreadBlocking(() -> AutofillTestHelperJni.get().addServerCreditCard(card));
         mOnPersonalDataChangedHelper.waitForCallback(callCount);
     }
 
@@ -156,8 +157,8 @@
         int callCount = mOnPersonalDataChangedHelper.getCallCount();
         runOnUiThreadBlocking(
                 () ->
-                        getPersonalDataManagerForLastUsedProfile()
-                                .addServerCreditCardForTestWithAdditionalFields(
+                        AutofillTestHelperJni.get()
+                                .addServerCreditCardWithAdditionalFields(
                                         card, nickname, cardIssuer));
         mOnPersonalDataChangedHelper.waitForCallback(callCount);
     }
@@ -197,8 +198,8 @@
         int callCount = mOnPersonalDataChangedHelper.getCallCount();
         runOnUiThreadBlocking(
                 () ->
-                        getPersonalDataManagerForLastUsedProfile()
-                                .setProfileUseStatsForTesting(guid, count, daysSinceLastUsed));
+                        AutofillTestHelperJni.get()
+                                .setProfileUseStats(guid, count, daysSinceLastUsed));
         mOnPersonalDataChangedHelper.waitForCallback(callCount);
     }
 
@@ -209,10 +210,7 @@
      * @return The non-negative use count of the profile.
      */
     public int getProfileUseCountForTesting(final String guid) {
-        return runOnUiThreadBlocking(
-                () ->
-                        getPersonalDataManagerForLastUsedProfile()
-                                .getProfileUseCountForTesting(guid));
+        return runOnUiThreadBlocking(() -> AutofillTestHelperJni.get().getProfileUseCount(guid));
     }
 
     /**
@@ -224,8 +222,7 @@
      *     Windows epoch. For more details see the comment header in time.h.
      */
     public long getProfileUseDateForTesting(final String guid) {
-        return runOnUiThreadBlocking(
-                () -> getPersonalDataManagerForLastUsedProfile().getProfileUseDateForTesting(guid));
+        return runOnUiThreadBlocking(() -> AutofillTestHelperJni.get().getProfileUseDate(guid));
     }
 
     /**
@@ -256,8 +253,8 @@
         int callCount = mOnPersonalDataChangedHelper.getCallCount();
         runOnUiThreadBlocking(
                 () ->
-                        getPersonalDataManagerForLastUsedProfile()
-                                .setCreditCardUseStatsForTesting(guid, count, daysSinceLastUsed));
+                        AutofillTestHelperJni.get()
+                                .setCreditCardUseStats(guid, count, daysSinceLastUsed));
         mOnPersonalDataChangedHelper.waitForCallback(callCount);
     }
 
@@ -268,10 +265,7 @@
      * @return The non-negative use count of the credit card.
      */
     public int getCreditCardUseCountForTesting(final String guid) {
-        return runOnUiThreadBlocking(
-                () ->
-                        getPersonalDataManagerForLastUsedProfile()
-                                .getCreditCardUseCountForTesting(guid));
+        return runOnUiThreadBlocking(() -> AutofillTestHelperJni.get().getCreditCardUseCount(guid));
     }
 
     /**
@@ -283,10 +277,7 @@
      *     the Windows epoch. For more details see the comment header in time.h.
      */
     public long getCreditCardUseDateForTesting(final String guid) {
-        return runOnUiThreadBlocking(
-                () ->
-                        getPersonalDataManagerForLastUsedProfile()
-                                .getCreditCardUseDateForTesting(guid));
+        return runOnUiThreadBlocking(() -> AutofillTestHelperJni.get().getCreditCardUseDate(guid));
     }
 
     /**
@@ -297,8 +288,7 @@
      *     more details see the comment header in time.h.
      */
     public long getCurrentDateForTesting() {
-        return runOnUiThreadBlocking(
-                () -> getPersonalDataManagerForLastUsedProfile().getCurrentDateForTesting());
+        return runOnUiThreadBlocking(() -> AutofillTestHelperJni.get().getCurrentDate());
     }
 
     /**
@@ -310,8 +300,7 @@
      *     For more details see the comment header in time.h.
      */
     public long getDateNDaysAgoForTesting(final int days) {
-        return runOnUiThreadBlocking(
-                () -> getPersonalDataManagerForLastUsedProfile().getDateNDaysAgoForTesting(days));
+        return runOnUiThreadBlocking(() -> AutofillTestHelperJni.get().getDateNDaysAgo(days));
     }
 
     public void addServerIban(final Iban iban) throws TimeoutException {
@@ -347,8 +336,7 @@
      * #addServerCreditCard(CreditCard)}}.
      */
     public void clearAllDataForTesting() throws TimeoutException {
-        runOnUiThreadBlocking(
-                () -> getPersonalDataManagerForLastUsedProfile().clearServerDataForTesting());
+        runOnUiThreadBlocking(() -> AutofillTestHelperJni.get().clearServerData());
         runOnUiThreadBlocking(
                 () -> getPersonalDataManagerForLastUsedProfile().clearImageDataForTesting());
         // Clear remaining local profiles and cards.
@@ -489,10 +477,7 @@
     }
 
     public static void addMaskedBankAccount(BankAccount bankAccount) {
-        runOnUiThreadBlocking(
-                () ->
-                        getPersonalDataManagerForLastUsedProfile()
-                                .addMaskedBankAccountForTest(bankAccount));
+        runOnUiThreadBlocking(() -> AutofillTestHelperJni.get().addMaskedBankAccount(bankAccount));
     }
 
     private void registerDataObserver() {
@@ -588,4 +573,34 @@
                 /* source= */ InputDevice.SOURCE_CLASS_POINTER,
                 /* flags= */ flags);
     }
+
+    @NativeMethods
+    interface Natives {
+        long getDateNDaysAgo(int days);
+
+        void addServerCreditCard(CreditCard card);
+
+        void addServerCreditCardWithAdditionalFields(
+                CreditCard card, String nickname, int cardIssuer);
+
+        void setProfileUseStats(String guid, int count, int daysSinceLastUsed);
+
+        int getProfileUseCount(String guid);
+
+        long getProfileUseDate(String guid);
+
+        void setCreditCardUseStats(String guid, int count, int daysSinceLastUsed);
+
+        int getCreditCardUseCount(String guid);
+
+        long getCreditCardUseDate(String guid);
+
+        long getCurrentDate();
+
+        void clearServerData();
+
+        void setSyncService();
+
+        void addMaskedBankAccount(BankAccount bankAccount);
+    }
 }
diff --git a/chrome/browser/commerce/coupons/android/BUILD.gn b/chrome/browser/commerce/coupons/android/BUILD.gn
index 816ac8c43..9c0efc7 100644
--- a/chrome/browser/commerce/coupons/android/BUILD.gn
+++ b/chrome/browser/commerce/coupons/android/BUILD.gn
@@ -36,8 +36,12 @@
 
 android_resources("java_resources") {
   sources = [
+    "java/res/drawable/discount_code_background.xml",
+    "java/res/drawable/discount_item_container_background.xml",
     "java/res/layout/discount_item_container.xml",
     "java/res/layout/discounts_content_container.xml",
+    "java/res/values/dimens.xml",
+    "java/res/values/styles.xml",
   ]
 
   deps = [
diff --git a/chrome/browser/commerce/coupons/android/java/res/drawable/discount_code_background.xml b/chrome/browser/commerce/coupons/android/java/res/drawable/discount_code_background.xml
new file mode 100644
index 0000000..1c412eb
--- /dev/null
+++ b/chrome/browser/commerce/coupons/android/java/res/drawable/discount_code_background.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2023 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="@dimen/discount_code_background_radius"/>
+    <solid android:color="@color/price_drop_annotation_bg_color"/>
+</shape>
\ No newline at end of file
diff --git a/chrome/browser/commerce/coupons/android/java/res/drawable/discount_item_container_background.xml b/chrome/browser/commerce/coupons/android/java/res/drawable/discount_item_container_background.xml
new file mode 100644
index 0000000..832b062
--- /dev/null
+++ b/chrome/browser/commerce/coupons/android/java/res/drawable/discount_item_container_background.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@macro/default_bg_color"/>
+    <corners android:radius="@dimen/discount_item_container_background_radius" />
+</shape>
\ No newline at end of file
diff --git a/chrome/browser/commerce/coupons/android/java/res/layout/discount_item_container.xml b/chrome/browser/commerce/coupons/android/java/res/layout/discount_item_container.xml
index f108f8cf..0a95350 100644
--- a/chrome/browser/commerce/coupons/android/java/res/layout/discount_item_container.xml
+++ b/chrome/browser/commerce/coupons/android/java/res/layout/discount_item_container.xml
@@ -9,7 +9,9 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height= "wrap_content"
-    android:orientation="horizontal">
+    android:orientation="horizontal"
+    android:padding="@dimen/discount_item_container_padding"
+    android:background="@drawable/discount_item_container_background">
 
     <!-- Discount content layout -->
     <LinearLayout
@@ -20,13 +22,20 @@
         <TextView
                 android:id="@+id/discount_code"
                 android:layout_width="wrap_content"
-                android:layout_height="wrap_content"/>
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="@dimen/discount_code_bottom_margin"
+                android:paddingHorizontal="@dimen/discount_code_horizontal_padding"
+                android:paddingVertical="@dimen/discount_code_vertical_padding"
+                android:textAppearance="@style/TextAppearance.DiscountCodeText"
+                android:background="@drawable/discount_code_background"/>
         <TextView
                 android:id="@+id/description_detail"
+                android:textAppearance="@style/TextAppearance.TextMedium.Primary"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"/>
         <TextView
                 android:id="@+id/expiry_time"
+                android:textAppearance="@style/TextAppearance.TextSmall.Secondary"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"/>
     </LinearLayout>
diff --git a/chrome/browser/commerce/coupons/android/java/res/values/dimens.xml b/chrome/browser/commerce/coupons/android/java/res/values/dimens.xml
new file mode 100644
index 0000000..cd95d1a4
--- /dev/null
+++ b/chrome/browser/commerce/coupons/android/java/res/values/dimens.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <dimen name="discount_item_container_background_radius">16dp</dimen>
+    <dimen name="discount_item_container_padding">12dp</dimen>
+    <dimen name="discount_code_background_radius">4dp</dimen>
+    <dimen name="discount_code_bottom_margin">4dp</dimen>
+    <dimen name="discount_code_horizontal_padding">8dp</dimen>
+    <dimen name="discount_code_vertical_padding">2dp</dimen>
+    <dimen name="discount_item_divider_height">2dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/chrome/browser/commerce/coupons/android/java/res/values/styles.xml b/chrome/browser/commerce/coupons/android/java/res/values/styles.xml
new file mode 100644
index 0000000..1cb3c64e
--- /dev/null
+++ b/chrome/browser/commerce/coupons/android/java/res/values/styles.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2014 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <style name="TextAppearance.DiscountCodeText" parent="TextAppearance.TextSmall.Primary">
+        <item name="android:textColor">@color/price_drop_annotation_text_green</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/chrome/browser/commerce/coupons/android/java/src/org/chromium/chrome/browser/commerce/coupons/DiscountsBottomSheetContentCoordinator.java b/chrome/browser/commerce/coupons/android/java/src/org/chromium/chrome/browser/commerce/coupons/DiscountsBottomSheetContentCoordinator.java
index fa6e826..46b65b0a 100644
--- a/chrome/browser/commerce/coupons/android/java/src/org/chromium/chrome/browser/commerce/coupons/DiscountsBottomSheetContentCoordinator.java
+++ b/chrome/browser/commerce/coupons/android/java/src/org/chromium/chrome/browser/commerce/coupons/DiscountsBottomSheetContentCoordinator.java
@@ -11,11 +11,14 @@
 import static org.chromium.chrome.browser.commerce.CommerceBottomSheetContentProperties.TYPE;
 
 import android.content.Context;
+import android.graphics.Rect;
 import android.view.LayoutInflater;
 import android.view.View;
 
 import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView.ItemDecoration;
+import androidx.recyclerview.widget.RecyclerView.State;
 
 import org.chromium.base.Callback;
 import org.chromium.base.supplier.Supplier;
@@ -51,6 +54,23 @@
         mContentRecyclerView =
                 mDiscountsContentContainer.findViewById(R.id.discounts_content_recycler_view);
         mContentRecyclerView.setAdapter(adapter);
+        mContentRecyclerView.addItemDecoration(
+                new ItemDecoration() {
+                    @Override
+                    public void getItemOffsets(
+                            @NonNull Rect outRect,
+                            @NonNull View view,
+                            @NonNull RecyclerView parent,
+                            @NonNull State state) {
+                        // Avoid adding top padding to the first item in the list.
+                        if (parent.getChildAdapterPosition(view) != 0) {
+                            outRect.top =
+                                    mContext.getResources()
+                                            .getDimensionPixelOffset(
+                                                    R.dimen.discount_item_divider_height);
+                        }
+                    }
+                });
 
         mMediator = new DiscountsBottomSheetContentMediator(context, tabSupplier, mModelList);
     }
diff --git a/chrome/browser/commerce/coupons/android/javatests/src/org/chromium/chrome/browser/commerce/coupons/DiscountsBottomSheetContentRenderTest.java b/chrome/browser/commerce/coupons/android/javatests/src/org/chromium/chrome/browser/commerce/coupons/DiscountsBottomSheetContentRenderTest.java
index 52d2e32f..45fc8d3 100644
--- a/chrome/browser/commerce/coupons/android/javatests/src/org/chromium/chrome/browser/commerce/coupons/DiscountsBottomSheetContentRenderTest.java
+++ b/chrome/browser/commerce/coupons/android/javatests/src/org/chromium/chrome/browser/commerce/coupons/DiscountsBottomSheetContentRenderTest.java
@@ -44,7 +44,10 @@
 public class DiscountsBottomSheetContentRenderTest extends BlankUiTestActivityTestCase {
     @Rule
     public RenderTestRule mRenderTestRule =
-            RenderTestRule.Builder.withPublicCorpus().setBugComponent(UI_BROWSER_SHOPPING).build();
+            RenderTestRule.Builder.withPublicCorpus()
+                    .setRevision(1)
+                    .setBugComponent(UI_BROWSER_SHOPPING)
+                    .build();
 
     @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
 
diff --git a/chrome/browser/download/android/download_controller.cc b/chrome/browser/download/android/download_controller.cc
index d4932162..ebeb740 100644
--- a/chrome/browser/download/android/download_controller.cc
+++ b/chrome/browser/download/android/download_controller.cc
@@ -24,7 +24,6 @@
 #include "chrome/browser/android/profile_key_startup_accessor.h"
 #include "chrome/browser/android/profile_key_util.h"
 #include "chrome/browser/android/tab_android.h"
-#include "chrome/browser/browser_process.h"
 #include "chrome/browser/download/android/dangerous_download_infobar_delegate.h"
 #include "chrome/browser/download/android/download_manager_service.h"
 #include "chrome/browser/download/android/download_utils.h"
@@ -37,7 +36,6 @@
 #include "chrome/browser/offline_pages/android/offline_page_bridge.h"
 #include "chrome/browser/permissions/permission_update_message_controller_android.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "chrome/browser/ui/android/tab_model/tab_model.h"
 #include "chrome/browser/ui/android/tab_model/tab_model_list.h"
 #include "chrome/common/pref_names.h"
@@ -49,9 +47,6 @@
 #include "components/pdf/common/constants.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
-#include "components/safe_browsing/android/safe_browsing_api_handler_bridge.h"
-#include "components/safe_browsing/core/browser/db/database_manager.h"
-#include "components/safe_browsing/core/browser/db/v4_protocol_manager_util.h"
 #include "components/safe_browsing/core/common/features.h"
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/browser_context.h"
@@ -190,64 +185,6 @@
          !item->IsMustDownload() && item->IsTransient();
 }
 
-class DownloadBlocklistChecker
-    : public safe_browsing::SafeBrowsingDatabaseManager::Client,
-      public base::RefCounted<DownloadBlocklistChecker> {
- public:
-  explicit DownloadBlocklistChecker(download::DownloadItem* item)
-      : url_chain_(item->GetUrlChain()) {}
-
-  void Start() {
-    scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> database_manager;
-    if (g_browser_process->safe_browsing_service()) {
-      database_manager =
-          g_browser_process->safe_browsing_service()->database_manager();
-    }
-
-    if (!database_manager ||
-        database_manager->CheckDownloadUrl(url_chain_, this)) {
-      Log(safe_browsing::SBThreatType::SB_THREAT_TYPE_SAFE);
-    } else {
-      // Add a reference to this object to prevent it from being destroyed
-      // before url checking result is returned.
-      AddRef();
-    }
-  }
-
- private:
-  friend class base::RefCounted<DownloadBlocklistChecker>;
-
-  ~DownloadBlocklistChecker() override = default;
-
-  void Log(safe_browsing::SBThreatType threat_type) {
-    base::UmaHistogramEnumeration(
-        "SafeBrowsing.AndroidTelemetry.DownloadUrlChainThreatType",
-        threat_type);
-  }
-
-  // SafeBrowsingDatabaseManager::Client:
-  void OnCheckDownloadUrlResult(
-      const std::vector<GURL>& url_chain,
-      safe_browsing::SBThreatType threat_type) override {
-    Log(threat_type);
-    Release();  // Balanced by AddRef in Start.
-  }
-
-  std::vector<GURL> url_chain_;
-};
-
-void RecordDownloadBlocklistState(download::DownloadItem* item) {
-  // Startup in Chrome minimal mode may start a download before
-  // initializing the UI thread.
-  if (!content::BrowserThread::IsThreadInitialized(
-          content::BrowserThread::UI)) {
-    return;
-  }
-
-  auto checker = base::MakeRefCounted<DownloadBlocklistChecker>(item);
-  checker->Start();
-}
-
 void CleanupAppVerificationTimestamps(download::DownloadItem* item) {
   Profile* profile = Profile::FromBrowserContext(
       content::DownloadItemUtils::GetBrowserContext(item));
@@ -505,8 +442,6 @@
 }
 
 void DownloadController::OnDownloadStarted(DownloadItem* download_item) {
-  RecordDownloadBlocklistState(download_item);
-
   // For dangerous downloads, we need to show the dangerous infobar before the
   // download can start.
   if (!download_item->IsDangerous() &&
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialProperties.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialProperties.java
index 0e24e53f..b09f4e7 100644
--- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialProperties.java
+++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialProperties.java
@@ -15,10 +15,14 @@
 import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey;
 
 /**
- * Extends the properties defined in {@link ListProperties} to facilitate the logic for an entire
- * UI containing a download ListItem.
+ * Extends the properties defined in {@link ListProperties} to facilitate the logic for an entire UI
+ * containing a download ListItem.
  */
 interface DownloadInterstitialProperties extends ListProperties {
+    /**
+     * Keeps track of the state of the DownloadInterstitial. This may be different to the state of
+     * the offline item displayed within the UI.
+     */
     @IntDef({
         State.UNKNOWN,
         State.IN_PROGRESS,
@@ -27,10 +31,6 @@
         State.PAUSED,
         State.PENDING
     })
-    /**
-     * Keeps track of the state of the DownloadInterstitial. This may be different to the state of
-     * the offline item displayed within the UI.
-     */
     @interface State {
         int UNKNOWN = 0;
         int IN_PROGRESS = 1;
diff --git a/chrome/browser/extensions/api/debugger/debugger_api.cc b/chrome/browser/extensions/api/debugger/debugger_api.cc
index 5266fa30..7c3f912 100644
--- a/chrome/browser/extensions/api/debugger/debugger_api.cc
+++ b/chrome/browser/extensions/api/debugger/debugger_api.cc
@@ -58,6 +58,7 @@
 #include "extensions/common/constants.h"
 #include "extensions/common/error_utils.h"
 #include "extensions/common/extension.h"
+#include "extensions/common/extension_features.h"
 #include "extensions/common/extension_id.h"
 #include "extensions/common/manifest_constants.h"
 #include "extensions/common/permissions/permissions_data.h"
@@ -472,6 +473,11 @@
     return true;
   }
 
+  if (base::FeatureList::IsEnabled(
+          extensions_features::kSilentDebuggerExtensionAPI)) {
+    return true;
+  }
+
   // We allow policy-installed extensions to circumvent the normal
   // infobar warning. See crbug.com/693621.
   if (Manifest::IsPolicyLocation(extension_->location()))
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java
index e38397e..489231d 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java
@@ -201,12 +201,8 @@
         assertTrue(intent.hasExtra(CreatorIntentConstants.CREATOR_URL));
         assertNotNull(intent.getExtras().getString(CreatorIntentConstants.CREATOR_URL));
         assertTrue(intent.hasExtra(CreatorIntentConstants.CREATOR_ENTRY_POINT));
-        assertNotNull(intent.getExtras().getInt(CreatorIntentConstants.CREATOR_ENTRY_POINT));
         assertTrue(intent.hasExtra(CreatorIntentConstants.CREATOR_FOLLOWING));
-        assertNotNull(
-                intent.getExtras().getBoolean(CreatorIntentConstants.CREATOR_FOLLOWING, false));
         assertTrue(intent.hasExtra(CreatorIntentConstants.CREATOR_TAB_ID));
-        assertNotNull(intent.getExtras().getInt(CreatorIntentConstants.CREATOR_TAB_ID));
     }
 
     @Test
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DrawableButtonDataUnitTest.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DrawableButtonDataUnitTest.java
index 919aae4a..56e50fb 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DrawableButtonDataUnitTest.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DrawableButtonDataUnitTest.java
@@ -60,7 +60,6 @@
         DisplayButtonData buttonData =
                 new DrawableButtonData(
                         R.string.button_new_tab, R.string.button_new_incognito_tab, drawable);
-        assertEquals(buttonData, buttonData);
         assertEquals(
                 buttonData,
                 new DrawableButtonData(
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ResourceButtonDataUnitTest.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ResourceButtonDataUnitTest.java
index f13cd58..739d7ad 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ResourceButtonDataUnitTest.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ResourceButtonDataUnitTest.java
@@ -61,7 +61,6 @@
                         R.string.button_new_tab,
                         R.string.button_new_incognito_tab,
                         R.drawable.ic_add);
-        assertEquals(buttonData, buttonData);
         assertEquals(
                 buttonData,
                 new ResourceButtonData(
diff --git a/chrome/browser/lacros/automation_manager_lacros.cc b/chrome/browser/lacros/automation_manager_lacros.cc
index 5bbbf2ff1..e109ce7 100644
--- a/chrome/browser/lacros/automation_manager_lacros.cc
+++ b/chrome/browser/lacros/automation_manager_lacros.cc
@@ -56,8 +56,8 @@
 }
 
 void AutomationManagerLacros::DispatchAccessibilityLocationChange(
-    const ui::AXLocationChanges& details) {
-  ui::AXTreeID tree_id = details.ax_tree_id;
+    const ui::AXTreeID& tree_id,
+    const ui::AXLocationChange& details) {
   if (!tree_id.token())
     return;
 
diff --git a/chrome/browser/lacros/automation_manager_lacros.h b/chrome/browser/lacros/automation_manager_lacros.h
index 5e2647da..fd8a010 100644
--- a/chrome/browser/lacros/automation_manager_lacros.h
+++ b/chrome/browser/lacros/automation_manager_lacros.h
@@ -31,7 +31,8 @@
       const gfx::Point& mouse_location,
       const std::vector<ui::AXEvent>& events) override;
   void DispatchAccessibilityLocationChange(
-      const ui::AXLocationChanges& details) override;
+      const ui::AXTreeID& tree_id,
+      const ui::AXLocationChange& details) override;
   void DispatchTreeDestroyedEvent(ui::AXTreeID tree_id) override;
   void DispatchActionResult(const ui::AXActionData& data,
                             bool result,
diff --git a/chrome/browser/lens/BUILD.gn b/chrome/browser/lens/BUILD.gn
index d606492..bd138dca 100644
--- a/chrome/browser/lens/BUILD.gn
+++ b/chrome/browser/lens/BUILD.gn
@@ -12,6 +12,7 @@
   deps = [
     ":java_resources",
     "//base:base_java",
+    "//base:service_loader_java",
     "//chrome/browser/contextmenu:java",
     "//chrome/browser/ui/android/strings:ui_strings_grd",
     "//components/embedder_support/android:context_menu_java",
@@ -30,7 +31,6 @@
 android_library("delegate_java") {
   sources = [
     "java/src/org/chromium/chrome/browser/lens/LensControllerDelegate.java",
-    "java/src/org/chromium/chrome/browser/lens/LensControllerDelegateImpl.java",
   ]
 
   deps = [
@@ -44,21 +44,6 @@
     "//ui/android:ui_java",
   ]
   resources_package = "org.chromium.chrome.browser.lens"
-
-  # Add the actual implementation where necessary so that downstream targets
-  # can provide their own implementations.
-  jar_excluded_patterns = [ "*/LensControllerDelegateImpl.class" ]
-}
-
-android_library("delegate_public_impl_java") {
-  sources = [
-    "java/src/org/chromium/chrome/browser/lens/LensControllerDelegateImpl.java",
-  ]
-
-  deps = [
-    ":delegate_java",
-    ":util_java",
-  ]
 }
 
 android_library("util_java") {
diff --git a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensController.java b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensController.java
index 51807fb..9572a6a 100644
--- a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensController.java
+++ b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensController.java
@@ -6,6 +6,7 @@
 import androidx.annotation.NonNull;
 
 import org.chromium.base.Callback;
+import org.chromium.base.ServiceLoaderUtil;
 import org.chromium.components.embedder_support.contextmenu.ChipRenderParams;
 import org.chromium.ui.base.WindowAndroid;
 
@@ -23,11 +24,17 @@
     }
 
     public LensController() {
-        mDelegate = new LensControllerDelegateImpl();
+        LensControllerDelegate delegate =
+                ServiceLoaderUtil.maybeCreate(LensControllerDelegate.class);
+        if (delegate == null) {
+            delegate = new LensControllerDelegate();
+        }
+        mDelegate = delegate;
     }
 
     /**
      * Whether the Lens SDK is available.
+     *
      * @return Whether the Lens SDK is available.
      */
     public boolean isSdkAvailable() {
diff --git a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensControllerDelegate.java b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensControllerDelegate.java
index c137bb4e..a47c838 100644
--- a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensControllerDelegate.java
+++ b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensControllerDelegate.java
@@ -18,8 +18,8 @@
 
 /**
  * Base class for defining methods where different behavior is required by downstream targets. The
- * correct version of {@link LensControllerDelegateImpl} will be determined at compile time via
- * build rules.
+ * correct implementation of {@link LensControllerDelegate} will be determined at compile time via
+ * {@link ServiceLoaderUtil}.
  */
 public class LensControllerDelegate {
     /**
diff --git a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensControllerDelegateImpl.java b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensControllerDelegateImpl.java
deleted file mode 100644
index d094456..0000000
--- a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensControllerDelegateImpl.java
+++ /dev/null
@@ -1,13 +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.chrome.browser.lens;
-
-/**
- * Instantiable version of {@link LensControllerDelegate}, don't add anything to this class.
- * Downstream targets may provide a different implementation. In GN, we specify that
- * {@link LensControllerDelegate} is compiled separately from its implementation; other
- * projects may specify a different LensControllerDelegate via GN.
- */
-class LensControllerDelegateImpl extends LensControllerDelegate {}
diff --git a/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinator.java b/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinator.java
index 072d70f..b8edb39 100644
--- a/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinator.java
+++ b/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinator.java
@@ -140,7 +140,7 @@
                         super.onViewRecycled(holder);
                     }
                 };
-        mModuleRegistry.registerAdapter(mAdapter, this::onViewCreated);
+        mModuleRegistry.registerAdapter(mAdapter, this);
         mRecyclerView.setAdapter(mAdapter);
     }
 
diff --git a/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc b/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc
index 5eb32fdf..1a84693e 100644
--- a/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc
+++ b/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc
@@ -626,10 +626,12 @@
 
     base::UmaHistogramCounts100(kTabDuplicateCountSingleWindowHistogramName,
                                 duplicate_data_single_window.duplicate_count);
-    base::UmaHistogramPercentage(
-        kTabDuplicatePercentageSingleWindowHistogramName,
-        duplicate_data_single_window.duplicate_count * 100 /
-            duplicate_data_single_window.tab_count);
+    if (duplicate_data_single_window.tab_count > 0) {
+      base::UmaHistogramPercentage(
+          kTabDuplicatePercentageSingleWindowHistogramName,
+          duplicate_data_single_window.duplicate_count * 100 /
+              duplicate_data_single_window.tab_count);
+    }
   }
   for (const auto& duplicate_data : duplicate_data_per_profile) {
     // Guest mode and incognito should not count for the per-profile metrics
@@ -641,10 +643,12 @@
     base::UmaHistogramCounts100(
         kTabDuplicateCountAllProfileWindowsHistogramName,
         duplicate_data.second.duplicate_count);
-    base::UmaHistogramPercentage(
-        kTabDuplicatePercentageAllProfileWindowsHistogramName,
-        duplicate_data.second.duplicate_count * 100 /
-            duplicate_data.second.tab_count);
+    if (duplicate_data.second.tab_count > 0) {
+      base::UmaHistogramPercentage(
+          kTabDuplicatePercentageAllProfileWindowsHistogramName,
+          duplicate_data.second.duplicate_count * 100 /
+              duplicate_data.second.tab_count);
+    }
   }
 }
 
diff --git a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.cc b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.cc
index 427c30c..37e88ee 100644
--- a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.cc
+++ b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.cc
@@ -49,9 +49,9 @@
 using Source = visited_url_ranking::URLVisit::Source;
 
 namespace {
-// Name of preference to track list of dismissed tabs.
-const char kDismissedTabsPrefName[] =
-    "NewTabPage.MostRelevantTabResumption.DismissedTabs";
+// Name of preference to track list of dismissed visits.
+const char kDismissedVisitsPrefName[] =
+    "NewTabPage.MostRelevantTabResumption.DismissedVisits";
 
 std::u16string FormatRelativeTime(const base::Time& time) {
   // Return a time like "1 hour ago", "2 days ago", etc.
@@ -249,17 +249,31 @@
 void MostRelevantTabResumptionPageHandler::DismissModule(
     const std::vector<ntp::most_relevant_tab_resumption::mojom::URLVisitPtr>
         url_visits) {
+  DismissURLVisits(url_visits);
+}
+
+void MostRelevantTabResumptionPageHandler::DismissURLVisit(
+    ntp::most_relevant_tab_resumption::mojom::URLVisitPtr url_visit) {
+  std::vector<ntp::most_relevant_tab_resumption::mojom::URLVisitPtr>
+      url_visits_mojom;
+  url_visits_mojom.push_back(std::move(url_visit));
+  DismissURLVisits(url_visits_mojom);
+}
+
+void MostRelevantTabResumptionPageHandler::DismissURLVisits(
+    const std::vector<ntp::most_relevant_tab_resumption::mojom::URLVisitPtr>&
+        url_visits) {
   RemoveOldDismissedTabs();
-  ScopedListPrefUpdate url_visit_list(profile_->GetPrefs(),
-                                      kDismissedTabsPrefName);
+  ScopedDictPrefUpdate url_visit_dict(profile_->GetPrefs(),
+                                      kDismissedVisitsPrefName);
   auto* visited_url_ranking_service =
       visited_url_ranking::VisitedURLRankingServiceFactory::GetForProfile(
           profile_);
   for (const auto& url_visit : url_visits) {
-    url_visit_list->Append(base::Value(
-        url_visit->url_key + ' ' +
-        base::NumberToString(url_visit->timestamp->ToDeltaSinceWindowsEpoch()
-                                 .InMicroseconds())));
+    url_visit_dict->Set(
+        url_visit->url_key,
+        static_cast<double>(
+            url_visit->timestamp->ToDeltaSinceWindowsEpoch().InMicroseconds()));
     visited_url_ranking_service->RecordAction(
         visited_url_ranking::ScoredURLUserAction::kDismissed,
         url_visit->url_key,
@@ -268,57 +282,40 @@
   }
 }
 
-void MostRelevantTabResumptionPageHandler::DismissURLVisit(
-    const ntp::most_relevant_tab_resumption::mojom::URLVisitPtr url_visit) {
-  RemoveOldDismissedTabs();
-  ScopedListPrefUpdate url_visit_list(profile_->GetPrefs(),
-                                      kDismissedTabsPrefName);
-  url_visit_list->Append(base::Value(
-      url_visit->url_key + ' ' +
-      base::NumberToString(
-          url_visit->timestamp->ToDeltaSinceWindowsEpoch().InMicroseconds())));
-  auto* visited_url_ranking_service =
-      visited_url_ranking::VisitedURLRankingServiceFactory::GetForProfile(
-          profile_);
-  visited_url_ranking_service->RecordAction(
-      visited_url_ranking::ScoredURLUserAction::kDismissed, url_visit->url_key,
-      segmentation_platform::TrainingRequestId(url_visit->training_request_id));
-}
-
 void MostRelevantTabResumptionPageHandler::RestoreModule(
     const std::vector<ntp::most_relevant_tab_resumption::mojom::URLVisitPtr>
         url_visits) {
-  ScopedListPrefUpdate url_visit_list(profile_->GetPrefs(),
-                                      kDismissedTabsPrefName);
-  auto* visited_url_ranking_service =
-      visited_url_ranking::VisitedURLRankingServiceFactory::GetForProfile(
-          profile_);
-  for (const auto& url_visit : url_visits) {
-    url_visit_list->EraseValue(base::Value(
-        url_visit->url_key + ' ' +
-        base::NumberToString(url_visit->timestamp->ToDeltaSinceWindowsEpoch()
-                                 .InMicroseconds())));
-    visited_url_ranking_service->RecordAction(
-        visited_url_ranking::ScoredURLUserAction::kSeen, url_visit->url_key,
-        segmentation_platform::TrainingRequestId(
-            url_visit->training_request_id));
-  }
+  RestoreURLVisits(std::move(url_visits));
 }
 
 void MostRelevantTabResumptionPageHandler::RestoreURLVisit(
     ntp::most_relevant_tab_resumption::mojom::URLVisitPtr url_visit) {
-  ScopedListPrefUpdate url_visit_list(profile_->GetPrefs(),
-                                      kDismissedTabsPrefName);
-  url_visit_list->EraseValue(base::Value(
-      url_visit->url_key + ' ' +
-      base::NumberToString(
-          url_visit->timestamp->ToDeltaSinceWindowsEpoch().InMicroseconds())));
+  std::vector<ntp::most_relevant_tab_resumption::mojom::URLVisitPtr>
+      url_visits_mojom;
+  url_visits_mojom.push_back(std::move(url_visit));
+  RestoreURLVisits(url_visits_mojom);
+}
+
+void MostRelevantTabResumptionPageHandler::RestoreURLVisits(
+    const std::vector<ntp::most_relevant_tab_resumption::mojom::URLVisitPtr>&
+        url_visits) {
+  ScopedDictPrefUpdate url_visit_dict(profile_->GetPrefs(),
+                                      kDismissedVisitsPrefName);
   auto* visited_url_ranking_service =
       visited_url_ranking::VisitedURLRankingServiceFactory::GetForProfile(
           profile_);
-  visited_url_ranking_service->RecordAction(
-      visited_url_ranking::ScoredURLUserAction::kSeen, url_visit->url_key,
-      segmentation_platform::TrainingRequestId(url_visit->training_request_id));
+  for (const auto& url_visit : url_visits) {
+    if (url_visit_dict->Find(url_visit->url_key) &&
+        static_cast<long>(
+            url_visit_dict->Find(url_visit->url_key)->GetDouble()) ==
+            url_visit->timestamp->ToDeltaSinceWindowsEpoch().InMicroseconds()) {
+      url_visit_dict->Remove(url_visit->url_key);
+      visited_url_ranking_service->RecordAction(
+          visited_url_ranking::ScoredURLUserAction::kSeen, url_visit->url_key,
+          segmentation_platform::TrainingRequestId(
+              url_visit->training_request_id));
+    }
+  }
 }
 
 void MostRelevantTabResumptionPageHandler::OnURLVisitAggregatesFetched(
@@ -473,40 +470,31 @@
 // static
 void MostRelevantTabResumptionPageHandler::RegisterProfilePrefs(
     PrefRegistrySimple* registry) {
-  registry->RegisterListPref(kDismissedTabsPrefName, base::Value::List());
+  registry->RegisterDictionaryPref(kDismissedVisitsPrefName,
+                                   base::Value::Dict());
 }
 
 bool MostRelevantTabResumptionPageHandler::IsNewURL(
     ntp::most_relevant_tab_resumption::mojom::URLVisitPtr& url_visit) {
-  const base::Value::List& cached_urls =
-      profile_->GetPrefs()->GetList(kDismissedTabsPrefName);
-  auto it = std::find_if(
-      cached_urls.begin(), cached_urls.end(),
-      [&url_visit](const base::Value& cached_url) {
-        return cached_url.GetString() ==
-               url_visit->url_key + ' ' +
-                   base::NumberToString(
-                       url_visit->timestamp->ToDeltaSinceWindowsEpoch()
-                           .InMicroseconds());
-      });
-  return it == cached_urls.end();
+  const base::Value::Dict& cached_urls =
+      profile_->GetPrefs()->GetDict(kDismissedVisitsPrefName);
+  if (cached_urls.Find(url_visit->url_key) == nullptr) {
+    return true;
+  } else {
+    return static_cast<long>(
+               cached_urls.Find(url_visit->url_key)->GetDouble()) !=
+           url_visit->timestamp->ToDeltaSinceWindowsEpoch().InMicroseconds();
+  }
 }
 
 void MostRelevantTabResumptionPageHandler::RemoveOldDismissedTabs() {
-  ScopedListPrefUpdate tab_list(profile_->GetPrefs(), kDismissedTabsPrefName);
-  for (const auto& entry : tab_list.Get().Clone()) {
-    const std::string dismissed_tab_string = entry.GetString();
-    size_t delimiter_pos = dismissed_tab_string.find(' ');
-    if (delimiter_pos != std::string::npos) {
-      int64_t timestamp_microseconds;
-      base::StringToInt64(dismissed_tab_string.substr(delimiter_pos),
-                          &timestamp_microseconds);
-      base::Time timestamp = base::Time::FromDeltaSinceWindowsEpoch(
-          base::Microseconds(timestamp_microseconds));
-      if (base::Time::Now() - timestamp >
-          base::Days(dismissal_duration_days_)) {
-        tab_list->EraseValue(entry);
-      }
+  ScopedDictPrefUpdate visit_dict(profile_->GetPrefs(),
+                                  kDismissedVisitsPrefName);
+  for (auto it = visit_dict->begin(); it != visit_dict->end(); ++it) {
+    base::Time timestamp = base::Time::FromDeltaSinceWindowsEpoch(
+        base::Microseconds(it->second.GetDouble()));
+    if (base::Time::Now() - timestamp > base::Days(dismissal_duration_days_)) {
+      visit_dict->Remove(it->first);
     }
   }
 }
diff --git a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.h b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.h
index 1ece78a5..e34ca4e 100644
--- a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.h
+++ b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.h
@@ -52,8 +52,7 @@
       const std::vector<ntp::most_relevant_tab_resumption::mojom::URLVisitPtr>
           url_visits) override;
   void DismissURLVisit(
-      const ntp::most_relevant_tab_resumption::mojom::URLVisitPtr url_visit)
-      override;
+      ntp::most_relevant_tab_resumption::mojom::URLVisitPtr url_visit) override;
   void RestoreModule(
       const std::vector<ntp::most_relevant_tab_resumption::mojom::URLVisitPtr>
           url_visits) override;
@@ -91,6 +90,13 @@
   bool IsNewURL(
       ntp::most_relevant_tab_resumption::mojom::URLVisitPtr& url_visit);
 
+  void DismissURLVisits(
+      const std::vector<ntp::most_relevant_tab_resumption::mojom::URLVisitPtr>&
+          url_visits);
+  void RestoreURLVisits(
+      const std::vector<ntp::most_relevant_tab_resumption::mojom::URLVisitPtr>&
+          url_visits);
+
   // Method to clear dismissed tabs that are older than a certain amount of
   // time.
   void RemoveOldDismissedTabs();
diff --git a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler_unittest.cc b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler_unittest.cc
index 533b568..b46b8dd 100644
--- a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler_unittest.cc
+++ b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler_unittest.cc
@@ -371,7 +371,9 @@
                     {Fetcher::kSession}));
             url_visit_aggregates.emplace_back(
                 visited_url_ranking::CreateSampleURLVisitAggregate(
-                    GURL(visited_url_ranking::kSampleSearchUrl), 1.0f,
+                    GURL(visited_url_ranking::kSampleSearchUrl +
+                         std::string("1")),
+                    1.0f,
                     base::Time::FromDeltaSinceWindowsEpoch(
                         base::Microseconds(123456)),
                     {Fetcher::kHistory}));
diff --git a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/url_visit_types.mojom b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/url_visit_types.mojom
index 75446f0..a459f9ba 100644
--- a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/url_visit_types.mojom
+++ b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/url_visit_types.mojom
@@ -22,6 +22,7 @@
 enum DecorationType {
   kVisitedXAgo,
   kMostRecent,
+  kFrequentlyVisited,
   kFrequentlyVisitedAtTime,
 };
 
diff --git a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuidePushNotificationManager.java b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuidePushNotificationManager.java
index db6768e..a00680c 100644
--- a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuidePushNotificationManager.java
+++ b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuidePushNotificationManager.java
@@ -200,7 +200,7 @@
     @VisibleForTesting
     public static String cacheKey(OptimizationType optimizationType) {
         return ChromePreferenceKeys.OPTIMIZATION_GUIDE_PUSH_NOTIFICATION_CACHE.createKey(
-                optimizationType.toString());
+                optimizationType.name());
     }
 
     public static void setNativeIsInitializedForTesting(Boolean nativeIsInitialized) {
diff --git a/chrome/browser/page_load_metrics/observers/third_party_cookie_deprecation_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/third_party_cookie_deprecation_metrics_observer_browsertest.cc
index cf02b08..0f8bf7ad 100644
--- a/chrome/browser/page_load_metrics/observers/third_party_cookie_deprecation_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/third_party_cookie_deprecation_metrics_observer_browsertest.cc
@@ -99,8 +99,6 @@
         .allow_by_global_setting = true,
         .expected_allow_mechanism_histogram_sample =
             ThirdPartyCookieAllowMechanism::kAllowByGlobalSetting,
-        .expected_web_feature_histogram_sample =
-            WebFeature::kThirdPartyCookieDeprecation_AllowByGlobalSetting,
     },
     {
         .allow_by_3pcd_1p_trial_token = true,
@@ -176,8 +174,6 @@
         .allow_by_explicit_setting = true,
         .expected_allow_mechanism_histogram_sample =
             ThirdPartyCookieAllowMechanism::kAllowByExplicitSetting,
-        .expected_web_feature_histogram_sample =
-            WebFeature::kThirdPartyCookieDeprecation_AllowByExplicitSetting,
     },
     // Precedence testing test cases:
     {
@@ -185,8 +181,6 @@
         .allow_by_3pcd_1p_trial_token = true,
         .expected_allow_mechanism_histogram_sample =
             ThirdPartyCookieAllowMechanism::kAllowByGlobalSetting,
-        .expected_web_feature_histogram_sample =
-            WebFeature::kThirdPartyCookieDeprecation_AllowByGlobalSetting,
     },
     {
         .allow_by_3pcd_1p_trial_token = true,
@@ -1280,11 +1274,9 @@
 
   histogram_tester.ExpectUniqueSample(kThirdPartyCookieAllowMechanismHistogram,
                                       /*kAllowByStorageAccess*/ 6, 2);
-  // Only record blink usage when tracking protection is onboard.
   histogram_tester.ExpectBucketCount(
       kWebFeatureHistogram,
-      WebFeature::kThirdPartyCookieDeprecation_AllowByStorageAccess,
-      GetParam() ? 1 : 0);
+      WebFeature::kThirdPartyCookieAccessBlockByExperiment, GetParam() ? 1 : 0);
 }
 
 class ThirdPartyCookieDeprecationObserverCookieReadBrowserTest
diff --git a/chrome/browser/page_load_metrics/observers/third_party_cookie_deprecation_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/third_party_cookie_deprecation_page_load_metrics_observer.cc
index 3fd5b36..6dbd91e 100644
--- a/chrome/browser/page_load_metrics/observers/third_party_cookie_deprecation_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/third_party_cookie_deprecation_page_load_metrics_observer.cc
@@ -173,16 +173,12 @@
         .Record(ukm::UkmRecorder::Get());
   }
 
-  if (!is_blocked_by_experiment) {
-    return;
-  }
-
-  // Record the following blink feature usage cookie metrics when the 3PCD
-  // experiment is actual block third party cookies, which means tracking
-  // protection is onboard.
+  // Record the following blink feature usage cookie metrics.
   std::vector<blink::mojom::WebFeature> third_party_cookie_features;
-  third_party_cookie_features.push_back(
-      blink::mojom::WebFeature::kThirdPartyCookieAccessBlockByExperiment);
+  if (is_blocked_by_experiment) {
+    third_party_cookie_features.push_back(
+        blink::mojom::WebFeature::kThirdPartyCookieAccessBlockByExperiment);
+  }
 
   switch (allow_mechanism) {
     case ThirdPartyCookieAllowMechanism::kAllowByExplicitSetting:
diff --git a/chrome/browser/partnercustomizations/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizationsRoboUnitTest.java b/chrome/browser/partnercustomizations/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizationsRoboUnitTest.java
index 0fa449b7..8666313 100644
--- a/chrome/browser/partnercustomizations/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizationsRoboUnitTest.java
+++ b/chrome/browser/partnercustomizations/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizationsRoboUnitTest.java
@@ -118,21 +118,21 @@
 
         public ShadowCustomizationProviderDelegate() {}
 
+        /** Returns the homepage string or null if none is available. */
         @Implementation
         @Nullable
-        /** Returns the homepage string or null if none is available. */
         protected String getHomepage() {
             return sHomepage;
         }
 
-        @Implementation
         /** Returns whether incognito mode is disabled. */
+        @Implementation
         protected boolean isIncognitoModeDisabled() {
             return false;
         }
 
-        @Implementation
         /** Returns whether bookmark editing is disabled. */
+        @Implementation
         protected boolean isBookmarksEditingDisabled() {
             return false;
         }
diff --git a/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/PasswordChangeType.java b/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/PasswordChangeType.java
index c5ba009..3feeef2 100644
--- a/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/PasswordChangeType.java
+++ b/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/PasswordChangeType.java
@@ -22,8 +22,6 @@
     /** A user opened a site to change a password manually. */
     int MANUAL_CHANGE = 1;
 
-    /**
-     * Deprecated as a part of APC removal (crbug.com/1386065).
-     * int AUTOMATED_CHANGE = 2;
-     */
+    // Deprecated as a part of APC removal (crbug.com/1386065).
+    // int AUTOMATED_CHANGE = 2;
 }
diff --git a/chrome/browser/password_manager/android/access_loss/java/src/org/chromium/chrome/browser/access_loss/PasswordAccessLossWarningHelper.java b/chrome/browser/password_manager/android/access_loss/java/src/org/chromium/chrome/browser/access_loss/PasswordAccessLossWarningHelper.java
index e749d77..6ba7228 100644
--- a/chrome/browser/password_manager/android/access_loss/java/src/org/chromium/chrome/browser/access_loss/PasswordAccessLossWarningHelper.java
+++ b/chrome/browser/password_manager/android/access_loss/java/src/org/chromium/chrome/browser/access_loss/PasswordAccessLossWarningHelper.java
@@ -70,8 +70,8 @@
         coordinator.showSheet(model);
     }
 
-    @Nullable
     /** Creates the model that has the text and functionality appropriate for the warning type. */
+    @Nullable
     PropertyModel getModelForWarningType(@PasswordAccessLossWarningType int warningType) {
         switch (warningType) {
             case PasswordAccessLossWarningType.NO_GMS_CORE:
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/GmsUpdateLauncher.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/GmsUpdateLauncher.java
index 0ae5fb2..67629b4 100644
--- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/GmsUpdateLauncher.java
+++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/GmsUpdateLauncher.java
@@ -32,6 +32,7 @@
         intent.setPackage("com.android.vending");
         intent.setData(Uri.parse(deepLinkUrl));
         intent.putExtra("callerId", context.getPackageName());
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
         // Request for overlay flow, Play Store will fallback to the default
         // behaviour if overlay is not available.
diff --git a/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/GmsUpdateLauncherTest.java b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/GmsUpdateLauncherTest.java
index ca5d4d5d..f1ce2e8 100644
--- a/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/GmsUpdateLauncherTest.java
+++ b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/GmsUpdateLauncherTest.java
@@ -36,6 +36,7 @@
         assertEquals(intent.getAction(), Intent.ACTION_VIEW);
         assertEquals(intent.getPackage(), "com.android.vending");
         assertEquals(intent.getStringExtra("callerId"), mockContext.getPackageName());
+        assertEquals(intent.getFlags(), Intent.FLAG_ACTIVITY_NEW_TASK);
         assertEquals(
                 intent.getData(),
                 Uri.parse(
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index bad98a8..8cbedb5 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -1096,6 +1096,12 @@
     "privacy_sandbox.activity_type.record";
 #endif  // BUILDFLAG(IS_ANDROID)
 
+// Deprecated 09/2024.
+#if !BUILDFLAG(IS_ANDROID)
+const char kTabResumeDismissedTabsPrefName[] =
+    "NewTabPage.MostRelevantTabResumption.DismissedTabs";
+#endif  // !BUILDFLAG(IS_ANDROID)
+
 // Register local state used only for migration (clearing or moving to a new
 // key).
 void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) {
@@ -1539,6 +1545,12 @@
 #if BUILDFLAG(IS_ANDROID)
   registry->RegisterListPref(kPrivacySandboxActivityTypeRecord);
 #endif  // BUILDFLAG(IS_ANDROID)
+
+// Deprecated 09/2024
+#if !BUILDFLAG(IS_ANDROID)
+  registry->RegisterListPref(kTabResumeDismissedTabsPrefName,
+                             base::Value::List());
+#endif  // !BUILDFLAG(IS_ANDROID)
 }
 
 void ClearSyncRequestedPrefAndMaybeMigrate(PrefService* profile_prefs) {
@@ -2873,6 +2885,11 @@
   profile_prefs->ClearPref(kPrivacySandboxActivityTypeRecord);
 #endif  // BUILDFLAG(IS_ANDROID)
 
+// Added 09/2024
+#if !BUILDFLAG(IS_ANDROID)
+  profile_prefs->ClearPref(kTabResumeDismissedTabsPrefName);
+#endif  // !BUILDFLAG(IS_ANDROID)
+
   // Please don't delete the following line. It is used by PRESUBMIT.py.
   // END_MIGRATE_OBSOLETE_PROFILE_PREFS
 
diff --git a/chrome/browser/resources/lens/overlay/translate_button.html b/chrome/browser/resources/lens/overlay/translate_button.html
index e08c911..5347f277 100644
--- a/chrome/browser/resources/lens/overlay/translate_button.html
+++ b/chrome/browser/resources/lens/overlay/translate_button.html
@@ -386,7 +386,8 @@
 </style>
 <div id="translateContainer">
   <cr-button id="translateEnableButton" class="button"
-  on-click="onTranslateButtonClick">
+    on-click="onTranslateButtonClick" aria-hidden="[[isTranslateModeEnabled]]"
+    tabindex$="[[getTabIndexForTranslateEntry(isTranslateModeEnabled)]]">
     <span id="translateEnableIcon" class="translate-icon" slot="prefix-icon">
     </span>
     <span id="translateButtonLabel" class="button-label">
@@ -395,7 +396,9 @@
   </cr-button>
   <div id="languagePicker">
     <cr-button id="sourceLanguageButton" class="button language-picker-button"
-        on-click="onSourceLanguageButtonClick">
+        on-click="onSourceLanguageButtonClick"
+        aria-hidden="[[!isTranslateModeEnabled]]"
+        tabindex$="[[getTabIndexForLanguagePicker(isTranslateModeEnabled)]]">
       <span id="starsIcon" slot="prefix-icon"></span>
       <span id="sourceLanguageLabel"
           class="button-label language-picker-label">
@@ -405,7 +408,9 @@
     </cr-button>
     <span id="arrowRightIcon"></span>
     <cr-button id="targetLanguageButton" class="button language-picker-button"
-        on-click="onTargetLanguageButtonClick">
+        on-click="onTargetLanguageButtonClick"
+        aria-hidden="[[!isTranslateModeEnabled]]"
+        tabindex$="[[getTabIndexForLanguagePicker(isTranslateModeEnabled)]]">
       <span id="targetLanguageLabel" class="button-label language-picker-label">
         [[getTargetLanguageDisplayName(targetLanguage)]]
       </span>
@@ -413,7 +418,9 @@
   </div>
   <div id="translateDisableButtonContainer">
     <cr-button id="translateDisableButton" class="button"
-    on-click="onTranslateButtonClick">
+      on-click="onTranslateButtonClick"
+      aria-hidden="[[!isTranslateModeEnabled]]"
+      tabindex$="[[getTabIndexForLanguagePicker(isTranslateModeEnabled)]]">
     </cr-button>
     <span id="translateDisableIcon" class="translate-icon"></span>
   </div>
diff --git a/chrome/browser/resources/lens/overlay/translate_button.ts b/chrome/browser/resources/lens/overlay/translate_button.ts
index 12ba638..248f8861 100644
--- a/chrome/browser/resources/lens/overlay/translate_button.ts
+++ b/chrome/browser/resources/lens/overlay/translate_button.ts
@@ -395,6 +395,14 @@
     return this.sourceLanguage === null;
   }
 
+  private getTabIndexForTranslateEntry(): number {
+    return this.isTranslateModeEnabled ? -1 : 0;
+  }
+
+  private getTabIndexForLanguagePicker(): number {
+    return this.isTranslateModeEnabled ? 0 : -1;
+  }
+
   private getAutoCheckedClass(
       sourceLanguage: chrome.languageSettingsPrivate.Language): string {
     return sourceLanguage === null ? 'selected' : '';
diff --git a/chrome/browser/resources/new_tab_page/modules/v2/most_relevant_tab_resumption/module.ts b/chrome/browser/resources/new_tab_page/modules/v2/most_relevant_tab_resumption/module.ts
index 1baed51f..f0b0ab4e 100644
--- a/chrome/browser/resources/new_tab_page/modules/v2/most_relevant_tab_resumption/module.ts
+++ b/chrome/browser/resources/new_tab_page/modules/v2/most_relevant_tab_resumption/module.ts
@@ -134,7 +134,8 @@
   }
 
   private onDismissButtonClick_(e: DomRepeatEvent<URLVisit>) {
-    e.preventDefault();
+    e.preventDefault();   // Stop navigation
+    e.stopPropagation();  // Stop firing of click handler
     const urlVisit = (e.target! as HTMLElement).parentElement!;
     const index = e.model.index;
     chrome.metricsPrivate.recordSmallCount(
diff --git a/chrome/browser/resources/password_manager/chrome_branded_manifest.webmanifest b/chrome/browser/resources/password_manager/chrome_branded_manifest.webmanifest
index cf0c669..6d8075f8 100644
--- a/chrome/browser/resources/password_manager/chrome_branded_manifest.webmanifest
+++ b/chrome/browser/resources/password_manager/chrome_branded_manifest.webmanifest
@@ -1,6 +1,6 @@
 {
-  "short_name": "Google Password Manager",
-  "name": "Google Password Manager",
+  "short_name": "$i18n{passwordManagerTitle}",
+  "name": "$i18n{passwordManagerTitle}",
   "icons": [
     {
       "src": "chrome://password-manager/images/password_manager_pwa_icon.svg",
@@ -8,6 +8,7 @@
       "sizes": "any"
     }
   ],
+  "description": "$i18n{passwordManagerDescription}",
   "start_url": "/?source=pwa",
   "id": "chrome://password-manager/",
   "display": "standalone",
diff --git a/chrome/browser/resources/password_manager/manifest.webmanifest b/chrome/browser/resources/password_manager/manifest.webmanifest
index 3a4278be..56bc0ea 100644
--- a/chrome/browser/resources/password_manager/manifest.webmanifest
+++ b/chrome/browser/resources/password_manager/manifest.webmanifest
@@ -1,6 +1,6 @@
 {
-  "short_name": "Password Manager",
-  "name": "Password Manager",
+  "short_name": "$i18n{passwordManagerTitle}",
+  "name": "$i18n{passwordManagerTitle}",
   "icons": [
     {
       "src": "chrome://password-manager/images/password_manager_logo.svg",
@@ -12,4 +12,4 @@
   "id": "chrome://password-manager/",
   "display": "standalone",
   "scope": "chrome://password-manager/"
-}
\ No newline at end of file
+}
diff --git a/chrome/browser/resources/search_engine_choice/OWNERS b/chrome/browser/resources/search_engine_choice/OWNERS
index a8ff91d..c7aa42b 100644
--- a/chrome/browser/resources/search_engine_choice/OWNERS
+++ b/chrome/browser/resources/search_engine_choice/OWNERS
@@ -1 +1 @@
-file://components/search_engines/search_engine_choice/OWNERS
+file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
diff --git a/chrome/browser/resources/side_panel/customize_chrome/categories.ts b/chrome/browser/resources/side_panel/customize_chrome/categories.ts
index ed95370..64ef3d0 100644
--- a/chrome/browser/resources/side_panel/customize_chrome/categories.ts
+++ b/chrome/browser/resources/side_panel/customize_chrome/categories.ts
@@ -23,7 +23,7 @@
 
 import {getCss} from './categories.css.js';
 import {getHtml} from './categories.html.js';
-import {CustomizeChromeAction, recordCustomizeChromeAction} from './common.js';
+import {CustomizeChromeAction, NtpImageType, recordCustomizeChromeAction, recordCustomizeChromeImageError} from './common.js';
 import type {BackgroundCollection, CustomizeChromePageHandlerInterface, Theme} from './customize_chrome.mojom-webui.js';
 import {CustomizeChromeApiProxy} from './customize_chrome_api_proxy.js';
 import {WindowProxy} from './window_proxy.js';
@@ -193,6 +193,7 @@
     if (!this.imageErrorDetectionEnabled_) {
       return;
     }
+    recordCustomizeChromeImageError(NtpImageType.COLLECTIONS);
     const index = Number((e.currentTarget as HTMLElement).dataset['index']);
     assert(this.collections_[index]);
     this.pageHandler_
diff --git a/chrome/browser/resources/side_panel/customize_chrome/common.ts b/chrome/browser/resources/side_panel/customize_chrome/common.ts
index 7309b00..6e0f4daf 100644
--- a/chrome/browser/resources/side_panel/customize_chrome/common.ts
+++ b/chrome/browser/resources/side_panel/customize_chrome/common.ts
@@ -62,3 +62,25 @@
       'NewTabPage.CustomizeChromeSidePanelImpression', action,
       CustomizeChromeImpression.MAX_VALUE + 1);
 }
+
+/**
+ * Types of images that are shown on the NTP (and therefore also appear in
+ * Customize Chrome). This enum must match the numbering for NtpImageType in
+ * enums.xml. These values are persisted to logs. Entries should not be
+ * renumbered, removed or reused.
+ *
+ * MAX_VALUE should always be at the end to help get the current number of
+ * buckets.
+ */
+export enum NtpImageType {
+  BACKGROUND_IMAGE,
+  COLLECTIONS,
+  COLLECTION_IMAGES,
+  MAX_VALUE = COLLECTION_IMAGES,
+}
+
+export function recordCustomizeChromeImageError(imageType: NtpImageType) {
+  chrome.metricsPrivate.recordEnumerationValue(
+      'NewTabPage.BackgroundService.Images.Headers.ErrorDetected', imageType,
+      NtpImageType.MAX_VALUE + 1);
+}
diff --git a/chrome/browser/resources/side_panel/customize_chrome/themes.html.ts b/chrome/browser/resources/side_panel/customize_chrome/themes.html.ts
index e09aa98..f2baec2 100644
--- a/chrome/browser/resources/side_panel/customize_chrome/themes.html.ts
+++ b/chrome/browser/resources/side_panel/customize_chrome/themes.html.ts
@@ -34,7 +34,8 @@
             <img is="cr-auto-img" data-index="${index}"
                 .autoSrc="${item.previewImageUrl.url}"
                 draggable="false"
-                @load="${this.onPreviewImageLoad_}">
+                @load="${this.onPreviewImageLoad_}"
+                @error="${this.onPreviewImageError_}">
             </img>
           </div>
         </customize-chrome-check-mark-wrapper>
diff --git a/chrome/browser/resources/side_panel/customize_chrome/themes.ts b/chrome/browser/resources/side_panel/customize_chrome/themes.ts
index ef1c292..47196caa 100644
--- a/chrome/browser/resources/side_panel/customize_chrome/themes.ts
+++ b/chrome/browser/resources/side_panel/customize_chrome/themes.ts
@@ -18,7 +18,7 @@
 import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js';
 import type {PropertyValues} from 'chrome://resources/lit/v3_0/lit.rollup.js';
 
-import {CustomizeChromeAction, recordCustomizeChromeAction} from './common.js';
+import {CustomizeChromeAction, NtpImageType, recordCustomizeChromeAction, recordCustomizeChromeImageError} from './common.js';
 import type {BackgroundCollection, CollectionImage, CustomizeChromePageCallbackRouter, CustomizeChromePageHandlerInterface, Theme} from './customize_chrome.mojom-webui.js';
 import {CustomizeChromeApiProxy} from './customize_chrome_api_proxy.js';
 import {getCss} from './themes.css.js';
@@ -170,6 +170,12 @@
             this.previewImageLoadStartEpoch_));
   }
 
+  protected onPreviewImageError_() {
+    if (this.imageErrorDetectionEnabled_) {
+      recordCustomizeChromeImageError(NtpImageType.BACKGROUND_IMAGE);
+    }
+  }
+
   private onCollectionChange_() {
     this.header_ = '';
     this.themes_ = [];
diff --git a/chrome/browser/search/background/ntp_background_service.cc b/chrome/browser/search/background/ntp_background_service.cc
index 17577bd..3984ab24 100644
--- a/chrome/browser/search/background/ntp_background_service.cc
+++ b/chrome/browser/search/background/ntp_background_service.cc
@@ -374,10 +374,6 @@
 void NtpBackgroundService::FetchReplacementCollectionPreviewImage(
     const std::string& collection_id,
     FetchReplacementImageCallback fetch_replacement_image_callback) {
-  // TODO(b:367702048) - Move metric to frontend, where the error was detected.
-  UMA_HISTOGRAM_ENUMERATION(
-      "NewTabPage.BackgroundService.Images.Headers.ErrorDetected",
-      NtpImageType::kCollections);
   FetchCollectionImageInfoInternal(
       collection_id,
       base::BindOnce(&NtpBackgroundService::
diff --git a/chrome/browser/search/background/ntp_background_service_unittest.cc b/chrome/browser/search/background/ntp_background_service_unittest.cc
index ba49c83..ddd2fb6 100644
--- a/chrome/browser/search/background/ntp_background_service_unittest.cc
+++ b/chrome/browser/search/background/ntp_background_service_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/run_loop.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/task_environment.h"
 #include "chrome/browser/browser_process.h"
@@ -45,17 +46,13 @@
 
 }  // namespace
 
-class NtpBackgroundServiceTest : public testing::Test,
-                                 public ::testing::WithParamInterface<bool> {
+class NtpBackgroundServiceTest : public testing::Test {
  public:
   NtpBackgroundServiceTest()
       : task_environment_(content::BrowserTaskEnvironment::IO_MAINLOOP),
         test_shared_loader_factory_(
             base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
                 &test_url_loader_factory_)) {
-    feature_list_.InitWithFeatureState(
-        std::move(ntp_features::kNtpBackgroundImageErrorDetection),
-        BackgroundImageErrorDetectionEnabled());
   }
 
   void TearDown() override {
@@ -95,10 +92,6 @@
     return &test_url_loader_factory_;
   }
 
-  // TODO(b:367699101) - Remove test parameters once image error
-  // detection logic is initiated solely in the frontend.
-  bool BackgroundImageErrorDetectionEnabled() const { return GetParam(); }
-
  protected:
   // Required to run tests from UI and threads.
   content::BrowserTaskEnvironment task_environment_;
@@ -111,14 +104,14 @@
   std::unique_ptr<NtpBackgroundService> service_;
 };
 
-INSTANTIATE_TEST_SUITE_P(All, NtpBackgroundServiceTest, ::testing::Bool());
-
-TEST_P(NtpBackgroundServiceTest, CollectionRequest) {
+TEST_F(NtpBackgroundServiceTest, CollectionRequest) {
   g_browser_process->SetApplicationLocale("foo");
-  service()->FetchCollectionInfo();
-  base::RunLoop().RunUntilIdle();
 
-  EXPECT_EQ(1u, test_url_loader_factory()->pending_requests()->size());
+  service()->FetchCollectionInfo();
+  EXPECT_TRUE(base::test::RunUntil([&]() {
+    return test_url_loader_factory()->pending_requests()->size() == 1u;
+  }));
+
   std::string request_body(test_url_loader_factory()
                                ->pending_requests()
                                ->at(0)
@@ -129,13 +122,7 @@
   ntp::background::GetCollectionsRequest collection_request;
   EXPECT_TRUE(collection_request.ParseFromString(request_body));
   EXPECT_EQ("foo", collection_request.language());
-  if (BackgroundImageErrorDetectionEnabled()) {
-    EXPECT_EQ(5, collection_request.filtering_label_size());
-    EXPECT_EQ("chrome_desktop_ntp.error_detection",
-              collection_request.filtering_label(4));
-  } else {
-    EXPECT_EQ(4, collection_request.filtering_label_size());
-  }
+  EXPECT_EQ(4, collection_request.filtering_label_size());
   EXPECT_EQ("chrome_desktop_ntp", collection_request.filtering_label(0));
   EXPECT_EQ("chrome_desktop_ntp.M" + version_info::GetMajorVersionNumber(),
             collection_request.filtering_label(1));
@@ -144,7 +131,39 @@
   EXPECT_EQ("chrome_desktop_ntp.gm3", collection_request.filtering_label(3));
 }
 
-TEST_P(NtpBackgroundServiceTest, CollectionInfoNetworkError) {
+TEST_F(NtpBackgroundServiceTest,
+       CollectionRequestWithImageErrorDetectionEnabled) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(
+      ntp_features::kNtpBackgroundImageErrorDetection);
+  g_browser_process->SetApplicationLocale("foo");
+
+  service()->FetchCollectionInfo();
+  EXPECT_TRUE(base::test::RunUntil([&]() {
+    return test_url_loader_factory()->pending_requests()->size() == 1u;
+  }));
+
+  std::string request_body(test_url_loader_factory()
+                               ->pending_requests()
+                               ->at(0)
+                               .request.request_body->elements()
+                               ->at(0)
+                               .As<network::DataElementBytes>()
+                               .AsStringPiece());
+  ntp::background::GetCollectionsRequest collection_request;
+  EXPECT_TRUE(collection_request.ParseFromString(request_body));
+  EXPECT_EQ("foo", collection_request.language());
+  EXPECT_EQ(5, collection_request.filtering_label_size());
+  EXPECT_EQ("chrome_desktop_ntp.error_detection",
+            collection_request.filtering_label(4));
+  EXPECT_EQ("chrome_desktop_ntp.M" + version_info::GetMajorVersionNumber(),
+            collection_request.filtering_label(1));
+  EXPECT_EQ("chrome_desktop_ntp.panorama",
+            collection_request.filtering_label(2));
+  EXPECT_EQ("chrome_desktop_ntp.gm3", collection_request.filtering_label(3));
+}
+
+TEST_F(NtpBackgroundServiceTest, CollectionInfoNetworkError) {
   SetUpResponseWithNetworkError(service()->GetCollectionsLoadURLForTesting());
 
   ASSERT_TRUE(service()->collection_info().empty());
@@ -158,7 +177,7 @@
             ErrorType::NET_ERROR);
 }
 
-TEST_P(NtpBackgroundServiceTest, BadCollectionsResponse) {
+TEST_F(NtpBackgroundServiceTest, BadCollectionsResponse) {
   SetUpResponseWithData(service()->GetCollectionsLoadURLForTesting(),
                         "bad serialized GetCollectionsResponse");
 
@@ -173,7 +192,7 @@
             ErrorType::SERVICE_ERROR);
 }
 
-TEST_P(NtpBackgroundServiceTest, GoodCollectionsResponse) {
+TEST_F(NtpBackgroundServiceTest, GoodCollectionsResponse) {
   ntp::background::Collection collection;
   collection.set_collection_id("shapes");
   collection.set_collection_name("Shapes");
@@ -203,7 +222,7 @@
   EXPECT_EQ(service()->collection_error_info().error_type, ErrorType::NONE);
 }
 
-TEST_P(NtpBackgroundServiceTest, BrokenCollectionPreviewImageHasNoReplacement) {
+TEST_F(NtpBackgroundServiceTest, BrokenCollectionPreviewImageHasNoReplacement) {
   ntp::background::Collection collection;
   collection.set_collection_id("shapes");
   collection.set_collection_name("Shapes");
@@ -231,15 +250,9 @@
   service()->FetchReplacementCollectionPreviewImage(
       collection.collection_id(), std::move(replacement_image_callback));
   run_loop.Run();
-
-  histogram_tester_.ExpectTotalCount(
-      "NewTabPage.BackgroundService.Images.Headers.ErrorDetected", 1);
-  ASSERT_EQ(1, histogram_tester_.GetBucketCount(
-                   "NewTabPage.BackgroundService.Images.Headers.ErrorDetected",
-                   NtpImageType::kCollections));
 }
 
-TEST_P(NtpBackgroundServiceTest, BrokenCollectionPreviewImageHasReplacement) {
+TEST_F(NtpBackgroundServiceTest, BrokenCollectionPreviewImageHasReplacement) {
   ntp::background::Collection collection;
   collection.set_collection_id("shapes");
   collection.set_collection_name("Shapes");
@@ -276,16 +289,9 @@
     service()->FetchReplacementCollectionPreviewImage(
         collection.collection_id(), std::move(replacement_image_callback));
     run_loop.Run();
-
-    histogram_tester_.ExpectTotalCount(
-        "NewTabPage.BackgroundService.Images.Headers.ErrorDetected", 1);
-    ASSERT_EQ(1,
-              histogram_tester_.GetBucketCount(
-                  "NewTabPage.BackgroundService.Images.Headers.ErrorDetected",
-                  NtpImageType::kCollections));
 }
 
-TEST_P(NtpBackgroundServiceTest, CollectionImagesNetworkError) {
+TEST_F(NtpBackgroundServiceTest, CollectionImagesNetworkError) {
   SetUpResponseWithNetworkError(service()->GetImagesURLForTesting());
 
   ASSERT_TRUE(service()->collection_images().empty());
@@ -294,16 +300,12 @@
   service()->FetchCollectionImageInfo("shapes");
   base::RunLoop().RunUntilIdle();
 
-  if (BackgroundImageErrorDetectionEnabled()) {
-    histogram_tester_.ExpectTotalCount(
-        "NewTabPage.BackgroundService.Images.Headers.ErrorDetected", 0);
-  }
   EXPECT_TRUE(service()->collection_images().empty());
   EXPECT_EQ(service()->collection_images_error_info().error_type,
             ErrorType::NET_ERROR);
 }
 
-TEST_P(NtpBackgroundServiceTest, BadCollectionImagesResponse) {
+TEST_F(NtpBackgroundServiceTest, BadCollectionImagesResponse) {
   SetUpResponseWithData(service()->GetImagesURLForTesting(),
                         "bad serialized GetImagesInCollectionResponse");
 
@@ -313,16 +315,12 @@
   service()->FetchCollectionImageInfo("shapes");
   base::RunLoop().RunUntilIdle();
 
-  if (BackgroundImageErrorDetectionEnabled()) {
-    histogram_tester_.ExpectTotalCount(
-        "NewTabPage.BackgroundService.Images.Headers.ErrorDetected", 0);
-  }
   EXPECT_TRUE(service()->collection_images().empty());
   EXPECT_EQ(service()->collection_images_error_info().error_type,
             ErrorType::SERVICE_ERROR);
 }
 
-TEST_P(NtpBackgroundServiceTest, ImageInCollectionHasNetworkError) {
+TEST_F(NtpBackgroundServiceTest, ImageInCollectionHasNetworkError) {
   ntp::background::Image image;
   image.set_asset_id(12345);
   image.set_image_url(kTestImageUrl);
@@ -357,7 +355,7 @@
               ErrorType::NONE);
 }
 
-TEST_P(NtpBackgroundServiceTest, GoodCollectionImagesResponse) {
+TEST_F(NtpBackgroundServiceTest, GoodCollectionImagesResponse) {
   ntp::background::Image image;
   image.set_asset_id(12345);
   image.set_image_url(kTestImageUrl);
@@ -386,17 +384,13 @@
   collection_image.attribution.push_back(image.attribution(0).text());
   collection_image.attribution_action_url = GURL(image.action_url());
 
-  if (BackgroundImageErrorDetectionEnabled()) {
-    histogram_tester_.ExpectTotalCount(
-        "NewTabPage.BackgroundService.Images.Headers.ErrorDetected", 0);
-  }
   EXPECT_FALSE(service()->collection_images().empty());
   EXPECT_THAT(service()->collection_images().at(0), Eq(collection_image));
   EXPECT_EQ(service()->collection_images_error_info().error_type,
             ErrorType::NONE);
 }
 
-TEST_P(NtpBackgroundServiceTest,
+TEST_F(NtpBackgroundServiceTest,
        CollectionImageInfoRequestsAreIgnoredIfAnotherIsInProgress) {
   ntp::background::Collection collection;
   collection.set_collection_id("shapes");
@@ -447,17 +441,13 @@
       GURL(image.image_url() + service()->GetImageOptionsForTesting());
   collection_image.attribution.push_back(image.attribution(0).text());
 
-  if (BackgroundImageErrorDetectionEnabled()) {
-    histogram_tester_.ExpectTotalCount(
-        "NewTabPage.BackgroundService.Images.Headers.ErrorDetected", 0);
-  }
   EXPECT_FALSE(service()->collection_info().empty());
   EXPECT_THAT(service()->collection_info().at(0), Eq(collection_info));
   EXPECT_FALSE(service()->collection_images().empty());
   EXPECT_THAT(service()->collection_images().at(0), Eq(collection_image));
 }
 
-TEST_P(NtpBackgroundServiceTest,
+TEST_F(NtpBackgroundServiceTest,
        CollectionImageInfoCanBeSuccessfullyFetchedMultipleTimes) {
   ntp::background::Image image;
   image.set_image_url(kTestImageUrl);
@@ -482,7 +472,7 @@
   EXPECT_THAT(service()->collection_images().at(0).collection_id, "colors");
 }
 
-TEST_P(NtpBackgroundServiceTest, NextImageNetworkError) {
+TEST_F(NtpBackgroundServiceTest, NextImageNetworkError) {
   SetUpResponseWithNetworkError(service()->GetNextImageURLForTesting());
 
   service()->FetchNextCollectionImage("shapes", std::nullopt);
@@ -492,7 +482,7 @@
               Eq(ErrorType::NET_ERROR));
 }
 
-TEST_P(NtpBackgroundServiceTest, BadNextImageResponse) {
+TEST_F(NtpBackgroundServiceTest, BadNextImageResponse) {
   SetUpResponseWithData(service()->GetNextImageURLForTesting(),
                         "bad serialized GetImageFromCollectionResponse");
 
@@ -503,7 +493,7 @@
               Eq(ErrorType::SERVICE_ERROR));
 }
 
-TEST_P(NtpBackgroundServiceTest, GoodNextImageResponse) {
+TEST_F(NtpBackgroundServiceTest, GoodNextImageResponse) {
   ntp::background::Image image;
   image.set_asset_id(12345);
   image.set_image_url(kTestImageUrl);
@@ -540,7 +530,7 @@
               Eq(ErrorType::NONE));
 }
 
-TEST_P(NtpBackgroundServiceTest, MultipleRequestsNextImage) {
+TEST_F(NtpBackgroundServiceTest, MultipleRequestsNextImage) {
   ntp::background::Image image;
   image.set_asset_id(12345);
   image.set_image_url(kTestImageUrl);
@@ -580,7 +570,7 @@
               Eq(ErrorType::NONE));
 }
 
-TEST_P(NtpBackgroundServiceTest, CheckValidAndInvalidBackdropUrls) {
+TEST_F(NtpBackgroundServiceTest, CheckValidAndInvalidBackdropUrls) {
   ntp::background::Image image;
   image.set_asset_id(12345);
   image.set_image_url(kTestImageUrl);
@@ -599,10 +589,6 @@
   service()->FetchCollectionImageInfo("shapes");
   base::RunLoop().RunUntilIdle();
 
-  if (BackgroundImageErrorDetectionEnabled()) {
-    histogram_tester_.ExpectTotalCount(
-        "NewTabPage.BackgroundService.Images.Headers.ErrorDetected", 0);
-  }
   EXPECT_TRUE(service()->IsValidBackdropUrl(
       GURL(image.image_url() + service()->GetImageOptionsForTesting())));
   EXPECT_FALSE(service()->IsValidBackdropUrl(
@@ -611,7 +597,7 @@
       GURL("https://wallpapers.co/another_image")));
 }
 
-TEST_P(NtpBackgroundServiceTest, GetThumbnailUrl) {
+TEST_F(NtpBackgroundServiceTest, GetThumbnailUrl) {
   const GURL kInvalidUrl("foo");
   const GURL kValidUrl("https://www.foo.com");
   const GURL kValidThumbnailUrl("https://www.foo.com/thumbnail");
@@ -622,7 +608,7 @@
   EXPECT_EQ(GURL(), service()->GetThumbnailUrl(kInvalidUrl));
 }
 
-TEST_P(NtpBackgroundServiceTest, OverrideBaseUrl) {
+TEST_F(NtpBackgroundServiceTest, OverrideBaseUrl) {
   base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
       "collections-base-url", "https://foo.com");
   service()->FetchCollectionInfo();
@@ -633,7 +619,7 @@
             test_url_loader_factory()->pending_requests()->at(0).request.url);
 }
 
-TEST_P(NtpBackgroundServiceTest, VerifyURLMetricsWithNetworkSuccess) {
+TEST_F(NtpBackgroundServiceTest, VerifyURLMetricsWithNetworkSuccess) {
   SetUpResponseWithNetworkSuccess(GURL(kTestImageUrl));
   histogram_tester_.ExpectTotalCount(
       "NewTabPage.BackgroundService.Images.Headers.RequestLatency", 0);
@@ -659,7 +645,7 @@
                    net::HTTP_OK));
 }
 
-TEST_P(NtpBackgroundServiceTest, VerifyURLMetricsWithNetworkError) {
+TEST_F(NtpBackgroundServiceTest, VerifyURLMetricsWithNetworkError) {
   SetUpResponseWithNetworkError(GURL(kTestImageUrl));
   histogram_tester_.ExpectTotalCount(
       "NewTabPage.BackgroundService.Images.Headers.RequestLatency", 0);
diff --git a/chrome/browser/search_engine_choice/OWNERS b/chrome/browser/search_engine_choice/OWNERS
index 5d7e015..c7aa42b 100644
--- a/chrome/browser/search_engine_choice/OWNERS
+++ b/chrome/browser/search_engine_choice/OWNERS
@@ -1 +1 @@
-file://components/search_engines/search_engine_choice/OWNERS
\ No newline at end of file
+file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java
index dc2def9..7dfe52e 100644
--- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java
+++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java
@@ -128,13 +128,11 @@
                         if (bottomSheet == mBottomSheet) {
                             mBottomSheet
                                     .getContentView()
-                                    .addOnLayoutChangeListener(
-                                            ShareSheetCoordinator.this::onLayoutChange);
+                                    .addOnLayoutChangeListener(ShareSheetCoordinator.this);
                         } else {
                             mBottomSheet
                                     .getContentView()
-                                    .removeOnLayoutChangeListener(
-                                            ShareSheetCoordinator.this::onLayoutChange);
+                                    .removeOnLayoutChangeListener(ShareSheetCoordinator.this);
                         }
                     }
                 };
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/page_info_sheet/PageInfoSharingControllerUnitTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/page_info_sheet/PageInfoSharingControllerUnitTest.java
index b2ab65f8..0a62f9b 100644
--- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/page_info_sheet/PageInfoSharingControllerUnitTest.java
+++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/page_info_sheet/PageInfoSharingControllerUnitTest.java
@@ -883,7 +883,9 @@
                                     .findViewById(R.id.learn_more_text);
                     var learnMoreTextLinks = learnMoreText.getClickableSpans();
                     assertNotEquals(
-                            "TextView should contain clickable spans", 0, learnMoreTextLinks);
+                            "TextView should contain clickable spans",
+                            0,
+                            learnMoreTextLinks.length);
                     // Click first span, which should contain a "learn more" text and link to a web
                     // page.
                     learnMoreTextLinks[0].onClick(learnMoreText);
diff --git a/chrome/browser/signin/BUILD.gn b/chrome/browser/signin/BUILD.gn
index acf1538..71997ec 100644
--- a/chrome/browser/signin/BUILD.gn
+++ b/chrome/browser/signin/BUILD.gn
@@ -61,6 +61,7 @@
       "//chrome/browser/search_engines",
       "//chrome/browser/themes",
       "//chrome/browser/ui:browser_list",
+      "//chrome/browser/ui:ui_features",
       "//chrome/browser/ui/signin",
       "//chrome/common:channel_info",
       "//chrome/common:constants",
diff --git a/chrome/browser/signin/dice_web_signin_interceptor.cc b/chrome/browser/signin/dice_web_signin_interceptor.cc
index 9a722ea..0db8385 100644
--- a/chrome/browser/signin/dice_web_signin_interceptor.cc
+++ b/chrome/browser/signin/dice_web_signin_interceptor.cc
@@ -51,6 +51,7 @@
 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h"
 #include "chrome/browser/ui/profiles/profile_colors_util.h"
 #include "chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.h"
+#include "chrome/browser/ui/ui_features.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/themes/autogenerated_theme_util.h"
@@ -788,7 +789,7 @@
   DCHECK(IsRequiredExtendedAccountInfoAvailable(intercepted_account_info));
 
   if (!base::FeatureList::IsEnabled(
-          kShowEnterpriseDialogForAllManagedAccountsSignin)) {
+          features::kEnterpriseUpdatedProfileCreationScreen)) {
     return false;
   }
 
@@ -800,11 +801,16 @@
     return false;
   }
 
-  // Check if the intercepted account is managed.
-  if (intercepted_account_info.IsManaged() &&
+  // Check if the intercepted account is managed and has not yet accepted
+  // management.
+  if (!intercepted_account_info.IsManaged() ||
+      enterprise_util::UserAcceptedAccountManagement(profile_)) {
+    return false;
+  }
+
+  if (switches::IsImprovedSigninUIOnDesktopEnabled() ||
       IsPrimaryAccountInterception(intercepted_account_info.account_id,
-                                   identity_manager_) &&
-      !enterprise_util::UserAcceptedAccountManagement(profile_)) {
+                                   identity_manager_)) {
     return true;
   }
 
@@ -1375,13 +1381,16 @@
   } else {
     DCHECK_EQ(SigninInterceptionResult::kDeclined, create)
         << "The user can only accept or decline";
+    if (state_->interception_type_ ==
+        WebSigninInterceptor::SigninInterceptionType::kEnterpriseForced) {
+      auto* accounts_mutator = identity_manager_->GetAccountsMutator();
+      accounts_mutator->RemoveAccount(
+          account_info.account_id,
+          signin_metrics::SourceForRefreshTokenOperation::
+              kEnterpriseForcedProfileCreation_UserDecline);
+    }
     OnProfileCreationChoice(account_info, profile_color,
                             SigninInterceptionResult::kDeclined);
-    auto* accounts_mutator = identity_manager_->GetAccountsMutator();
-    accounts_mutator->RemoveAccount(
-        account_info.account_id,
-        signin_metrics::SourceForRefreshTokenOperation::
-            kTurnOnSyncHelper_Abort);
   }
 }
 
diff --git a/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc b/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc
index 46d739ac..9487c1e 100644
--- a/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc
+++ b/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc
@@ -26,6 +26,7 @@
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
 #include "chrome/browser/signin/web_signin_interceptor.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/ui_features.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
@@ -495,7 +496,7 @@
        NoForcedInterceptionShowsDialogIfFeatureEnabled) {
   base::test::ScopedFeatureList scoped_list;
   scoped_list.InitAndEnableFeature(
-      kShowEnterpriseDialogForAllManagedAccountsSignin);
+      features::kEnterpriseUpdatedProfileCreationScreen);
   // Reauth intercepted if enterprise confirmation not shown yet for forced
   // managed separation.
   AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable(
@@ -523,7 +524,7 @@
     NoForcedInterceptionShowsNoDialogIfFeatureEnabledButDisabledDialogByPolicy) {
   base::test::ScopedFeatureList scoped_list;
   scoped_list.InitAndEnableFeature(
-      kShowEnterpriseDialogForAllManagedAccountsSignin);
+      features::kEnterpriseUpdatedProfileCreationScreen);
   // Reauth intercepted if enterprise confirmation not shown yet for forced
   // managed separation.
   AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable(
diff --git a/chrome/browser/site_protection/site_familiarity_heuristic_name.h b/chrome/browser/site_protection/site_familiarity_heuristic_name.h
index 09ba54d..575bd5a8 100644
--- a/chrome/browser/site_protection/site_familiarity_heuristic_name.h
+++ b/chrome/browser/site_protection/site_familiarity_heuristic_name.h
@@ -22,7 +22,8 @@
   kSiteEngagementScoreExists = 7,
   kNoVisitsToAnySiteMoreThanADayAgo = 8,
   kGlobalAllowlistNotReady = 9,
-  kMaxValue = kGlobalAllowlistNotReady,
+  kFamiliarLikelyPreviouslyUnfamiliar = 10,
+  kMaxValue = kFamiliarLikelyPreviouslyUnfamiliar,
 };
 
 // Subset of SiteFamiliarityHeuristicName for heuristics related to navigation
@@ -32,6 +33,7 @@
   kVisitedMoreThanADayAgo = 1,
   kVisitedMoreThanFourHoursAgo = 2,
   kNoVisitsToAnySiteMoreThanADayAgo = 3,
+  kVisitedMoreThanADayAgoPreviouslyUnfamiliar = 4,
 };
 
 }  // namespace site_protection
diff --git a/chrome/browser/site_protection/site_protection_metrics_observer.cc b/chrome/browser/site_protection/site_protection_metrics_observer.cc
index db67e7e..51c5bd0f 100644
--- a/chrome/browser/site_protection/site_protection_metrics_observer.cc
+++ b/chrome/browser/site_protection/site_protection_metrics_observer.cc
@@ -140,6 +140,7 @@
         SiteFamiliarityHeuristicName::kVisitedMoreThanFourHoursAgo);
     metrics_data->most_strict_matched_history_heuristic =
         SiteFamiliarityHistoryHeuristicName::kVisitedMoreThanFourHoursAgo;
+    metrics_data->last_visit_time = last_visit_result.last_visit;
 
     if (last_visit_result.last_visit < (base::Time::Now() - base::Days(1))) {
       OnGotVisitToOriginOlderThanADayAgo(std::move(metrics_data),
@@ -165,6 +166,7 @@
         SiteFamiliarityHeuristicName::kVisitedMoreThanADayAgo);
     metrics_data->most_strict_matched_history_heuristic =
         SiteFamiliarityHistoryHeuristicName::kVisitedMoreThanADayAgo;
+    metrics_data->last_visit_time = last_visit_result.last_visit;
     OnKnowIfAnyVisitOlderThanADayAgo(std::move(metrics_data),
                                      /*has_visit_older_than_a_day_ago=*/true);
     return;
@@ -204,18 +206,20 @@
       GURL last_committed_url = metrics_data->last_committed_url;
       database_manager->CheckUrlForHighConfidenceAllowlist(
           last_committed_url,
-          base::BindOnce(&SiteProtectionMetricsObserver::LogMetrics,
+          base::BindOnce(&SiteProtectionMetricsObserver::
+                             OnGotHighConfidenceAllowlistResult,
                          weak_factory_.GetWeakPtr(), std::move(metrics_data)));
       return;
     }
   }
 
-  LogMetrics(std::move(metrics_data),
-             /*url_on_safe_browsing_high_confidence_allowlist=*/false,
-             /*logging_details=*/std::nullopt);
+  OnGotHighConfidenceAllowlistResult(
+      std::move(metrics_data),
+      /*url_on_safe_browsing_high_confidence_allowlist=*/false,
+      /*logging_details=*/std::nullopt);
 }
 
-void SiteProtectionMetricsObserver::LogMetrics(
+void SiteProtectionMetricsObserver::OnGotHighConfidenceAllowlistResult(
     std::unique_ptr<MetricsData> metrics_data,
     bool url_on_safe_browsing_high_confidence_allowlist,
     std::optional<safe_browsing::SafeBrowsingDatabaseManager::
@@ -228,10 +232,95 @@
     url_on_safe_browsing_high_confidence_allowlist = false;
   }
   if (url_on_safe_browsing_high_confidence_allowlist) {
+    metrics_data->url_on_safe_browsing_high_confidence_allowlist = true;
     metrics_data->matched_heuristics.push_back(
         SiteFamiliarityHeuristicName::kGlobalAllowlistMatch);
   }
 
+  // Guess as to whether the site was previously categorized as unfamiliar.
+  //
+  // For the purpose of
+  // SiteFamiliarityHeuristicName::kFamiliarLikelyPreviouslyUnfamiliar an
+  // unfamiliar site is a site which is:
+  // - Not on the safe browsing high confidence allowlist
+  // AND
+  // - Wasn't visited more than 24 hours ago
+  // AND
+  // - Wasn't visited with a fresh profile which doesn't have any history
+  //   older than 24 hours.
+  //
+  // Assume that high confidence allowlist is stable and that if origin is
+  // currently on high confidence allowlist that it would have been previously
+  // on high confidence allowlist. Ignore site engagement score. Ignoring
+  // site engagement score is ok because the site engagement score is capped
+  // for site engagement all on the same day.
+  std::optional<base::Time> last_visit_time = metrics_data->last_visit_time;
+  if (!url_on_safe_browsing_high_confidence_allowlist && last_visit_time &&
+      *last_visit_time < (base::Time::Now() - base::Days(1))) {
+    url::Origin last_committed_origin = metrics_data->last_committed_origin;
+    history_service_->GetLastVisitToOrigin(
+        last_committed_origin, base::Time(), *last_visit_time - base::Days(1),
+        base::BindOnce(&SiteProtectionMetricsObserver::
+                           OnGotVisitToOriginOlderThanADayPriorToPreviousVisit,
+                       weak_factory_.GetWeakPtr(), std::move(metrics_data)),
+        &task_tracker_);
+    return;
+  }
+
+  LogMetrics(std::move(metrics_data));
+}
+
+void SiteProtectionMetricsObserver::
+    OnGotVisitToOriginOlderThanADayPriorToPreviousVisit(
+        std::unique_ptr<MetricsData> metrics_data,
+        history::HistoryLastVisitResult last_visit_result) {
+  if (!last_visit_result.success || last_visit_result.last_visit.is_null()) {
+    // Check whether
+    // SiteFamiliarityHistoryHeuristicName::kNoVisitsToAnySiteMoreThanADayAgo
+    // heuristic would have matched the previous visit.
+    history::QueryOptions history_query_options;
+    history_query_options.end_time =
+        *metrics_data->last_visit_time - base::Days(1);
+    history_query_options.max_count = 1;
+    history_service_->QueryHistory(
+        u"", std::move(history_query_options),
+        base::BindOnce(&SiteProtectionMetricsObserver::
+                           OnGotVisitOlderThanADayPriorToPreviousVisit,
+                       weak_factory_.GetWeakPtr(), std::move(metrics_data)),
+        &task_tracker_);
+    return;
+  }
+
+  OnKnowIfSiteWasLikelyPreviouslyFamiliar(
+      std::move(metrics_data),
+      /*was_site_likely_previously_familiar=*/true);
+  return;
+}
+
+void SiteProtectionMetricsObserver::OnGotVisitOlderThanADayPriorToPreviousVisit(
+    std::unique_ptr<MetricsData> metrics_data,
+    history::QueryResults query_results) {
+  OnKnowIfSiteWasLikelyPreviouslyFamiliar(
+      std::move(metrics_data),
+      /*was_site_likely_previously_familiar=*/query_results.empty());
+}
+
+void SiteProtectionMetricsObserver::OnKnowIfSiteWasLikelyPreviouslyFamiliar(
+    std::unique_ptr<MetricsData> metrics_data,
+    bool was_site_likely_previously_familiar) {
+  if (!was_site_likely_previously_familiar) {
+    metrics_data->matched_heuristics.push_back(
+        SiteFamiliarityHeuristicName::kFamiliarLikelyPreviouslyUnfamiliar);
+    metrics_data->most_strict_matched_history_heuristic =
+        SiteFamiliarityHistoryHeuristicName::
+            kVisitedMoreThanADayAgoPreviouslyUnfamiliar;
+  }
+
+  LogMetrics(std::move(metrics_data));
+}
+
+void SiteProtectionMetricsObserver::LogMetrics(
+    std::unique_ptr<MetricsData> metrics_data) {
   bool no_heuristics_match = metrics_data->matched_heuristics.empty();
   if (no_heuristics_match) {
     metrics_data->matched_heuristics.push_back(
@@ -257,7 +346,7 @@
   ukm::builders::SiteFamiliarityHeuristicResult(metrics_data->ukm_source_id)
       .SetAnyHeuristicsMatch(!no_heuristics_match)
       .SetOnHighConfidenceAllowlist(
-          url_on_safe_browsing_high_confidence_allowlist)
+          metrics_data->url_on_safe_browsing_high_confidence_allowlist)
       .SetSiteEngagementScore(
           RoundSiteEngagementScoreForUkm(metrics_data->site_engagement_score))
       .SetSiteFamiliarityHistoryHeuristic(
diff --git a/chrome/browser/site_protection/site_protection_metrics_observer.h b/chrome/browser/site_protection/site_protection_metrics_observer.h
index 9d61562..3731a81 100644
--- a/chrome/browser/site_protection/site_protection_metrics_observer.h
+++ b/chrome/browser/site_protection/site_protection_metrics_observer.h
@@ -72,9 +72,11 @@
 
     ukm::SourceId ukm_source_id = ukm::kInvalidSourceId;
     double site_engagement_score = 0;
+    bool url_on_safe_browsing_high_confidence_allowlist = false;
     GURL last_committed_url;
     url::Origin last_committed_origin;
     base::Time data_fetch_start_time;
+    std::optional<base::Time> last_visit_time;
     std::vector<SiteFamiliarityHeuristicName> matched_heuristics;
     SiteFamiliarityHistoryHeuristicName most_strict_matched_history_heuristic =
         SiteFamiliarityHistoryHeuristicName::kNoHeuristicMatch;
@@ -103,11 +105,33 @@
       std::unique_ptr<MetricsData> metrics_data,
       bool has_visit_older_than_a_day_ago);
 
-  void LogMetrics(std::unique_ptr<MetricsData> metrics_data,
-                  bool url_on_safe_browsing_high_confidence_allowlist,
-                  std::optional<safe_browsing::SafeBrowsingDatabaseManager::
-                                    HighConfidenceAllowlistCheckLoggingDetails>
-                      logging_details);
+  // Called with whether the site is on the high confidence allowlist.
+  void OnGotHighConfidenceAllowlistResult(
+      std::unique_ptr<MetricsData> metrics_data,
+      bool url_on_safe_browsing_high_confidence_allowlist,
+      std::optional<safe_browsing::SafeBrowsingDatabaseManager::
+                        HighConfidenceAllowlistCheckLoggingDetails>
+          logging_details);
+
+  // Called with the history visit to the origin in `metrics_data` which
+  // occurred more than a day prior to the most recent visit to the origin.
+  void OnGotVisitToOriginOlderThanADayPriorToPreviousVisit(
+      std::unique_ptr<MetricsData> metrics_data,
+      history::HistoryLastVisitResult last_visit_result);
+
+  // Called with the history visit to any site which occurred more than a day
+  // prior to the visit to the origin in `metrics_data`.
+  void OnGotVisitOlderThanADayPriorToPreviousVisit(
+      std::unique_ptr<MetricsData> metrics_data,
+      history::QueryResults query_results);
+
+  // Called with whether there is a history visit to any site more than a day
+  // prior to the visit to the origin in `metrics_data`.
+  void OnKnowIfSiteWasLikelyPreviouslyFamiliar(
+      std::unique_ptr<MetricsData> metrics_data,
+      bool was_site_likely_previously_familiar);
+
+  void LogMetrics(std::unique_ptr<MetricsData> metrics_data);
 
   WEB_CONTENTS_USER_DATA_KEY_DECL();
 
diff --git a/chrome/browser/site_protection/site_protection_metrics_observer_unittest.cc b/chrome/browser/site_protection/site_protection_metrics_observer_unittest.cc
index 116be2d0d..84a04845 100644
--- a/chrome/browser/site_protection/site_protection_metrics_observer_unittest.cc
+++ b/chrome/browser/site_protection/site_protection_metrics_observer_unittest.cc
@@ -184,6 +184,12 @@
     return values.size() == 1u ? values[0] : -1;
   }
 
+  int64_t GetUkmHistoryFamiliarityHeuristicValue(
+      ukm::TestUkmRecorder& ukm_recorder) {
+    return GetUkmFamiliarityHeuristicValue(ukm_recorder,
+                                           "SiteFamiliarityHistoryHeuristic");
+  }
+
   void NavigateAndCheckRecordedHeuristicUkm(const GURL& url,
                                             const std::string& metric_name,
                                             int64_t expected_value) {
@@ -222,8 +228,7 @@
       {SiteFamiliarityHeuristicName::kNoVisitsToAnySiteMoreThanADayAgo});
   EXPECT_EQ(static_cast<int>(SiteFamiliarityHistoryHeuristicName::
                                  kNoVisitsToAnySiteMoreThanADayAgo),
-            GetUkmFamiliarityHeuristicValue(ukm_recorder,
-                                            "SiteFamiliarityHistoryHeuristic"));
+            GetUkmHistoryFamiliarityHeuristicValue(ukm_recorder));
 }
 
 // Test the histograms and UKM which are logged by SiteProtectionMetricsObserver
@@ -250,8 +255,7 @@
          SiteFamiliarityHeuristicName::kVisitedMoreThanADayAgo});
     EXPECT_EQ(static_cast<int>(
                   SiteFamiliarityHistoryHeuristicName::kVisitedMoreThanADayAgo),
-              GetUkmFamiliarityHeuristicValue(
-                  ukm_recorder, "SiteFamiliarityHistoryHeuristic"));
+              GetUkmHistoryFamiliarityHeuristicValue(ukm_recorder));
   }
 
   {
@@ -262,8 +266,7 @@
     EXPECT_EQ(
         static_cast<int>(
             SiteFamiliarityHistoryHeuristicName::kVisitedMoreThanFourHoursAgo),
-        GetUkmFamiliarityHeuristicValue(ukm_recorder,
-                                        "SiteFamiliarityHistoryHeuristic"));
+        GetUkmHistoryFamiliarityHeuristicValue(ukm_recorder));
   }
 
   {
@@ -272,8 +275,7 @@
         kUrlVisited1HourAgo, {SiteFamiliarityHeuristicName::kNoHeuristicMatch});
     EXPECT_EQ(static_cast<int>(
                   SiteFamiliarityHistoryHeuristicName::kNoHeuristicMatch),
-              GetUkmFamiliarityHeuristicValue(
-                  ukm_recorder, "SiteFamiliarityHistoryHeuristic"));
+              GetUkmHistoryFamiliarityHeuristicValue(ukm_recorder));
   }
 }
 
@@ -383,6 +385,87 @@
   }
 }
 
+// Test that SiteProtectionMetricsObserver logs the correct histograms and UKM
+// if the SiteFamiliarityHeuristicName::kVisitedMoreThanADayAgo heuristic
+// applies for the current visit to the site but the heuristic did not apply
+// to the previous visit to the site.
+TEST_F(SiteProtectionMetricsObserverTest, SiteFamiliarWasPreviouslyUnfamiliar) {
+  GURL kPageUrl("https://bar.com");
+  GURL kOtherUrl("https://baz.com");
+
+  base::Time now = base::Time::Now();
+  base::Time kPageVisitTime1 = now - base::Hours(25);
+  base::Time kPageVisitTime2 = kPageVisitTime1 - base::Hours(25);
+  base::Time kOtherVisitTime = kPageVisitTime2 - base::Hours(25);
+
+  GetRegularProfileHistoryService()->AddPage(kPageUrl, kPageVisitTime1,
+                                             history::SOURCE_BROWSED);
+  GetRegularProfileHistoryService()->AddPage(kOtherUrl, kOtherVisitTime,
+                                             history::SOURCE_BROWSED);
+  {
+    ukm::TestAutoSetUkmRecorder ukm_recorder;
+    NavigateAndCheckRecordedHeuristicHistograms(
+        kPageUrl,
+        {SiteFamiliarityHeuristicName::kVisitedMoreThanFourHoursAgo,
+         SiteFamiliarityHeuristicName::kVisitedMoreThanADayAgo,
+         SiteFamiliarityHeuristicName::kFamiliarLikelyPreviouslyUnfamiliar});
+    EXPECT_EQ(static_cast<int>(SiteFamiliarityHistoryHeuristicName::
+                                   kVisitedMoreThanADayAgoPreviouslyUnfamiliar),
+              GetUkmHistoryFamiliarityHeuristicValue(ukm_recorder));
+  }
+
+  GetRegularProfileHistoryService()->AddPage(kPageUrl, kPageVisitTime2,
+                                             history::SOURCE_BROWSED);
+
+  {
+    ukm::TestAutoSetUkmRecorder ukm_recorder;
+    NavigateAndCheckRecordedHeuristicHistograms(
+        kPageUrl, {SiteFamiliarityHeuristicName::kVisitedMoreThanFourHoursAgo,
+                   SiteFamiliarityHeuristicName::kVisitedMoreThanADayAgo});
+    EXPECT_EQ(static_cast<int>(
+                  SiteFamiliarityHistoryHeuristicName::kVisitedMoreThanADayAgo),
+              GetUkmHistoryFamiliarityHeuristicValue(ukm_recorder));
+  }
+}
+
+// Test that SiteProtectionMetricsObserver logs the correct histograms
+// if:
+// - SiteFamiliarityHeuristicName::kVisitedMoreThanADayAgo heuristic
+//   applies for the current visit.
+// AND
+// -  SiteFamiliarityHeuristicName::kVisitedMoreThanADayAgo heuristic
+//   does not apply to the previous visit.
+// AND
+// - SiteFamiliarityHeuristicName::kNoVisitsToAnySiteMoreThanADayAgo
+//   applies to the previous visit.
+TEST_F(SiteProtectionMetricsObserverTest,
+       SiteFamiliarWasPreviouslyUnfamiliarDueToNoOldHistory) {
+  GURL kPageUrl("https://bar.com");
+  GURL kOtherUrl("https://baz.com");
+
+  base::Time now = base::Time::Now();
+  base::Time kPageVisitTime = now - base::Hours(25);
+  base::Time kOtherVisitTime1 = kPageVisitTime - base::Hours(1);
+  base::Time kOtherVisitTime2 = kOtherVisitTime1 - base::Hours(100);
+
+  GetRegularProfileHistoryService()->AddPage(kPageUrl, kPageVisitTime,
+                                             history::SOURCE_BROWSED);
+  GetRegularProfileHistoryService()->AddPage(kOtherUrl, kOtherVisitTime1,
+                                             history::SOURCE_BROWSED);
+
+  NavigateAndCheckRecordedHeuristicHistograms(
+      kPageUrl, {SiteFamiliarityHeuristicName::kVisitedMoreThanFourHoursAgo,
+                 SiteFamiliarityHeuristicName::kVisitedMoreThanADayAgo});
+
+  GetRegularProfileHistoryService()->AddPage(kOtherUrl, kOtherVisitTime2,
+                                             history::SOURCE_BROWSED);
+  NavigateAndCheckRecordedHeuristicHistograms(
+      kPageUrl,
+      {SiteFamiliarityHeuristicName::kVisitedMoreThanFourHoursAgo,
+       SiteFamiliarityHeuristicName::kVisitedMoreThanADayAgo,
+       SiteFamiliarityHeuristicName::kFamiliarLikelyPreviouslyUnfamiliar});
+}
+
 // Test that SiteProtectionMetricsObserver logs whether any heuristics matched
 // to UKM.
 TEST_F(SiteProtectionMetricsObserverTest, AnyHeuristicsMatchUkm) {
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java
index 49e1183..3bc27ca 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java
@@ -557,11 +557,10 @@
     public static void performStorageMaintenance(List<Integer> liveTabIds) {
         ThreadUtils.assertOnUiThread();
         for (Class<? extends PersistedTabData> clazz : sSupportedMaintenanceClasses) {
+            // Maintenance is supported only for regular Tabs.
+            boolean isEncrypted = false;
             PersistedTabDataConfiguration config =
-                    PersistedTabDataConfiguration.get(
-                            clazz, false
-                            /** Maintenance is only supported for regular Tabs */
-                            );
+                    PersistedTabDataConfiguration.get(clazz, isEncrypted);
             PersistedTabDataStorage storage = config.getStorage();
             storage.performMaintenance(liveTabIds, config.getId());
         }
diff --git a/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailMediaParserTest.java b/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailMediaParserTest.java
index aef2781..f0692db 100644
--- a/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailMediaParserTest.java
+++ b/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailMediaParserTest.java
@@ -73,29 +73,21 @@
         return result;
     }
 
+    /** Verify that the metadata from audio file can be retrieved correctly. */
     @Test
     @LargeTest
     @Feature({"MediaParser"})
-    /**
-     * Verify that the metadata from audio file can be retrieved correctly.
-     *
-     * @throws InterruptedException
-     */
     public void testParseAudioMetatadata() {
         String filePath = UrlUtils.getIsolatedTestRoot() + "/media/test/data/sfx.mp3";
         MediaParserResult result = parseMediaFile(filePath, "audio/mp3");
         Assert.assertTrue("Failed to parse audio metadata.", result.mediaData != null);
     }
 
+    /** Verify metadata and thumbnail can be retrieved correctly from h264 video file. */
     @Test
     @LargeTest
     @Feature({"MediaParser"})
     @Restriction(DeviceFormFactor.PHONE)
-    /**
-     * Verify metadata and thumbnail can be retrieved correctly from h264 video file.
-     *
-     * @throws InterruptedException
-     */
     public void testParseVideoH264() {
         String filePath = UrlUtils.getIsolatedTestRoot() + "/media/test/data/bear.mp4";
         MediaParserResult result = parseMediaFile(filePath, "video/mp4");
@@ -106,14 +98,10 @@
                 "Failed to retrieve thumbnail.", result.mediaData.thumbnail.getHeight() > 0);
     }
 
+    /** Verify metadata and thumbnail can be retrieved correctly from vp8 video file. */
     @Test
     @LargeTest
     @Feature({"MediaParser"})
-    /**
-     * Verify metadata and thumbnail can be retrieved correctly from vp8 video file.
-     *
-     * @throws InterruptedException
-     */
     public void testParseVideoThumbnailVp8() {
         String filePath = UrlUtils.getIsolatedTestRoot() + "/media/test/data/bear-vp8-webvtt.webm";
         MediaParserResult result = parseMediaFile(filePath, "video/webm");
@@ -124,15 +112,13 @@
                 "Failed to retrieve thumbnail.", result.mediaData.thumbnail.getHeight() > 0);
     }
 
-    @Test
-    @LargeTest
-    @Feature({"MediaParser"})
     /**
      * Verify metadata and thumbnail can be retrieved correctly from vp8 video file with alpha
      * plane.
-     *
-     * @throws InterruptedException
      */
+    @Test
+    @LargeTest
+    @Feature({"MediaParser"})
     public void testParseVideoThumbnailVp8WithAlphaPlane() {
         String filePath = UrlUtils.getIsolatedTestRoot() + "/media/test/data/bear-vp8a.webm";
         MediaParserResult result = parseMediaFile(filePath, "video/webm");
@@ -143,14 +129,10 @@
                 "Failed to retrieve thumbnail.", result.mediaData.thumbnail.getHeight() > 0);
     }
 
+    /** Verify metadata and thumbnail can be retrieved correctly from vp9 video file. */
     @Test
     @LargeTest
     @Feature({"MediaParser"})
-    /**
-     * Verify metadata and thumbnail can be retrieved correctly from vp9 video file.
-     *
-     * @throws InterruptedException
-     */
     public void testParseVideoThumbnailVp9() {
         String filePath = UrlUtils.getIsolatedTestRoot() + "/media/test/data/bear-vp9.webm";
         MediaParserResult result = parseMediaFile(filePath, "video/webm");
@@ -161,14 +143,10 @@
                 "Failed to retrieve thumbnail.", result.mediaData.thumbnail.getHeight() > 0);
     }
 
+    /** Verify metadata and thumbnail can be retrieved correctly from av1 video file. */
     @Test
     @LargeTest
     @Feature({"MediaParser"})
-    /**
-     * Verify metadata and thumbnail can be retrieved correctly from av1 video file.
-     *
-     * @throws InterruptedException
-     */
     public void testParseVideoThumbnailAv1() {
         String filePath = UrlUtils.getIsolatedTestRoot() + "/media/test/data/bear-av1.mp4";
         MediaParserResult result = parseMediaFile(filePath, "video/mp4");
@@ -179,14 +157,10 @@
                 "Failed to retrieve thumbnail.", result.mediaData.thumbnail.getHeight() > 0);
     }
 
+    /** Verify metadata and thumbnail can be retrieved correctly from h265 video file. */
     @Test
     @LargeTest
     @Feature({"MediaParser"})
-    /**
-     * Verify metadata and thumbnail can be retrieved correctly from h265 video file.
-     *
-     * @throws InterruptedException
-     */
     public void testParseVideoThumbnailH265() {
         String filePath = UrlUtils.getIsolatedTestRoot() + "/media/test/data/bear-hevc-frag.mp4";
         MediaParserResult result = parseMediaFile(filePath, "video/mp4");
@@ -197,14 +171,10 @@
                 "Failed to retrieve thumbnail.", result.mediaData.thumbnail.getHeight() > 0);
     }
 
+    /** Verify graceful failure on parsing invalid video file. */
     @Test
     @LargeTest
     @Feature({"MediaParser"})
-    /**
-     * Verify graceful failure on parsing invalid video file.
-     *
-     * @throws InterruptedException
-     */
     public void testParseInvalidVideoFile() throws Exception {
         File invalidFile = File.createTempFile("test", "webm");
         MediaParserResult result = parseMediaFile(invalidFile.getAbsolutePath(), "video/webm");
diff --git a/chrome/browser/translate/android/java/src/org/chromium/chrome/browser/translate/AutoTranslateSnackbarControllerJavaTest.java b/chrome/browser/translate/android/java/src/org/chromium/chrome/browser/translate/AutoTranslateSnackbarControllerJavaTest.java
index 869bb359..6ae84ee 100644
--- a/chrome/browser/translate/android/java/src/org/chromium/chrome/browser/translate/AutoTranslateSnackbarControllerJavaTest.java
+++ b/chrome/browser/translate/android/java/src/org/chromium/chrome/browser/translate/AutoTranslateSnackbarControllerJavaTest.java
@@ -87,14 +87,14 @@
         Assert.assertEquals("en", data.getTargetLanguage());
     }
 
-    @Test
-    @SmallTest
     /**
      * The target language is stored in Translate format, which uses the old deprecated Java codes
      * for several languages (Hebrew, Indonesian), and uses "tl" while Chromium uses "fil" for
      * Tagalog/Filipino. This tests that when using Translate format codes the Chrome version is
      * displayed in the Snackbar.
      */
+    @Test
+    @SmallTest
     public void testShowSnackbarChromeLanguage() throws Exception {
         // Use the Translate tag tl which Chrome should display as "Filipino"
         showSnackbar("tl");
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImplTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImplTest.java
index 72028a9f..014ad6fd 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImplTest.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImplTest.java
@@ -121,6 +121,7 @@
         verify(mViewTreeObserver).removeOnGlobalLayoutListener(mImpl);
     }
 
+    @Test
     public void testRecalculateOmniboxAlignment_phone() {
         doReturn(mAnchorView).when(mHorizontalAlignmentView).getParent();
         doReturn(60).when(mHorizontalAlignmentView).getTop();
@@ -138,6 +139,7 @@
                 alignment);
     }
 
+    @Test
     public void testRecalculateOmniboxAlignment_bottomWindowPadding() {
         mBottomWindowPadding = 40;
         doReturn(mAnchorView).when(mHorizontalAlignmentView).getParent();
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder.java
index d4568293..b947577 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder.java
@@ -356,7 +356,8 @@
                 nextSuggestionLogicalIndex++;
             } else {
                 assert false
-                        : "Unsupported group render type: " + currentGroupConfig.getRenderType();
+                        : "Unsupported group render type: "
+                                + currentGroupConfig.getRenderType().name();
             }
 
             previousGroupConfig = currentGroupConfig;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java
index 261e97e6..f99e9839 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java
@@ -339,7 +339,8 @@
         for (AnswerType type : ANSWER_TYPES) {
             SuggestionTestHelper suggHelper = createAnswerSuggestion(type, "", 1, "", 1, null);
             // Note: model is re-created on every iteration.
-            Assert.assertNotNull("No icon associated with type: " + type, suggHelper.getIcon());
+            Assert.assertNotNull(
+                    "No icon associated with type: " + type.name(), suggHelper.getIcon());
         }
     }
 
@@ -348,7 +349,8 @@
         for (AnswerType type : ANSWER_TYPES) {
             SuggestionTestHelper suggHelper = createRichAnswerSuggestion(type, 0, false);
             // Note: model is re-created on every iteration.
-            Assert.assertNotNull("No icon associated with type: " + type, suggHelper.getIcon());
+            Assert.assertNotNull(
+                    "No icon associated with type: " + type.name(), suggHelper.getIcon());
         }
     }
 
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/DynamicSpacingRecyclerViewItemDecorationUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/DynamicSpacingRecyclerViewItemDecorationUnitTest.java
index 8ca3109e..a4a2f8b 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/DynamicSpacingRecyclerViewItemDecorationUnitTest.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/DynamicSpacingRecyclerViewItemDecorationUnitTest.java
@@ -223,7 +223,8 @@
 
         // It's unlikely that the minimum spacing would guarantee 2.5 items to be shown, but we can
         // verify this fast.
-        assertNotEquals(CONTAINER_SIZE, LEAD_IN_SPACE + itemWidth * 2.5 + MIN_ELEMENT_SPACE * 2);
+        assertNotEquals(
+                CONTAINER_SIZE, (int) (LEAD_IN_SPACE + itemWidth * 2.5 + MIN_ELEMENT_SPACE * 2));
 
         // However, we don't permit dynamic spacing in landscape mode, so this should fall back to
         // MIN_ELEMENT_SPACE.
diff --git a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationErrorStateInfo.java b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationErrorStateInfo.java
index b2a4079..0892f1ed 100644
--- a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationErrorStateInfo.java
+++ b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationErrorStateInfo.java
@@ -10,8 +10,8 @@
 import org.jni_zero.JNINamespace;
 import org.jni_zero.JniType;
 
-@JNINamespace("plus_addresses")
 /** Contains necessary information to show a meaningful error message to the user. */
+@JNINamespace("plus_addresses")
 class PlusAddressCreationErrorStateInfo {
     private final @PlusAddressCreationBottomSheetErrorType int mErrorType;
     private final String mTitle;
diff --git a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationNormalStateInfo.java b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationNormalStateInfo.java
index 35d26d9..d705d40 100644
--- a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationNormalStateInfo.java
+++ b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationNormalStateInfo.java
@@ -14,8 +14,8 @@
 
 import java.util.Objects;
 
-@JNINamespace("plus_addresses")
 /** Contains necessary information to show a meaningful error message to the user. */
+@JNINamespace("plus_addresses")
 class PlusAddressCreationNormalStateInfo {
     private final String mTitle;
     private final String mDescription;
diff --git a/chrome/browser/ui/android/searchactivityutils/java/src/org/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManagerTest.java b/chrome/browser/ui/android/searchactivityutils/java/src/org/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManagerTest.java
index e2955f79..b64af8f 100644
--- a/chrome/browser/ui/android/searchactivityutils/java/src/org/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManagerTest.java
+++ b/chrome/browser/ui/android/searchactivityutils/java/src/org/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManagerTest.java
@@ -144,8 +144,6 @@
         SearchActivityPreferences p2 =
                 new SearchActivityPreferences(
                         "test", new GURL("https://test.url"), true, true, true);
-        Assert.assertEquals(p1, p1);
-        Assert.assertEquals(p2, p2);
         Assert.assertEquals(p1, p2);
         Assert.assertEquals(p1.hashCode(), p2.hashCode());
 
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/history_sync/HistorySyncTest.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/history_sync/HistorySyncTest.java
index 262d84e..0d9aeb2 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/history_sync/HistorySyncTest.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/history_sync/HistorySyncTest.java
@@ -481,13 +481,13 @@
         histogramWatcher.assertExpected();
     }
 
-    @Test
-    @MediumTest
     /**
      * This tests ensure that onClickListeners are attached to the accept/decline buttons when the
      * HistorySyncCoordinator is created without a view and the MinorModeHelper resolves before a
      * View is set.
      */
+    @Test
+    @MediumTest
     public void testOnClickListenersAttachedWithMinorModeAccount() {
         mSigninTestRule.addAccountThenSignin(AccountManagerTestRule.AADC_MINOR_ACCOUNT);
 
@@ -532,13 +532,13 @@
                 });
     }
 
-    @Test
-    @MediumTest
     /**
      * This tests ensure that onClickListeners are attached to the accept/decline buttons when the
      * HistorySyncCoordinator is created without a view and the MinorModeHelper resolves before a
      * View is set.
      */
+    @Test
+    @MediumTest
     public void testOnClickListenersAttachedWithNonMinorModeAccount() {
         mSigninTestRule.addAccountThenSignin(AccountManagerTestRule.AADC_ADULT_ACCOUNT);
 
diff --git a/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc b/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc
index a5d25b62..93be4045 100644
--- a/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc
+++ b/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc
@@ -160,7 +160,8 @@
     }
   }
   void DispatchAccessibilityLocationChange(
-      const ui::AXLocationChanges& details) override {}
+      const ui::AXTreeID& tree_id,
+      const ui::AXLocationChange& details) override {}
   void DispatchTreeDestroyedEvent(ui::AXTreeID tree_id) override {}
   void DispatchActionResult(
       const ui::AXActionData& data,
diff --git a/chrome/browser/ui/fullscreen_util_mac.cc b/chrome/browser/ui/fullscreen_util_mac.cc
index 7a3ad19..b94cff2 100644
--- a/chrome/browser/ui/fullscreen_util_mac.cc
+++ b/chrome/browser/ui/fullscreen_util_mac.cc
@@ -6,6 +6,7 @@
 
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
 #include "chrome/browser/ui/exclusive_access/exclusive_access_context.h"
 #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h"
@@ -15,12 +16,13 @@
 
 namespace fullscreen_utils {
 
-bool IsInContentFullscreen(Browser* browser) {
-  if (!browser->exclusive_access_manager()) {
+bool IsInContentFullscreen(BrowserWindowInterface* browser_window_interface) {
+  if (!browser_window_interface->GetExclusiveAccessManager()) {
     return false;
   }
-  FullscreenController* controller =
-      browser->exclusive_access_manager()->fullscreen_controller();
+  FullscreenController* const controller =
+      browser_window_interface->GetExclusiveAccessManager()
+          ->fullscreen_controller();
   return controller && (controller->IsWindowFullscreenForTabOrPending() ||
                         controller->IsExtensionFullscreenOrPending());
 }
diff --git a/chrome/browser/ui/fullscreen_util_mac.h b/chrome/browser/ui/fullscreen_util_mac.h
index 1db44d4..96ab162 100644
--- a/chrome/browser/ui/fullscreen_util_mac.h
+++ b/chrome/browser/ui/fullscreen_util_mac.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_UI_FULLSCREEN_UTIL_MAC_H_
 
 class Browser;
+class BrowserWindowInterface;
 
 namespace fullscreen_utils {
 
@@ -13,7 +14,7 @@
 // - `browser` is currently in fullscreen
 // - the fullscreen mode is web or extension API initiated (as opposed to via
 //   macOS affordances like traffic lights
-bool IsInContentFullscreen(Browser* browser);
+bool IsInContentFullscreen(BrowserWindowInterface* browser_window_interface);
 
 // Whether the "Always Show Toolbar in Full Screen" setting is enabled. Properly
 // handles PWAs.
diff --git a/chrome/browser/ui/lens/lens_overlay_controller.cc b/chrome/browser/ui/lens/lens_overlay_controller.cc
index d67fcd0..f4371cb 100644
--- a/chrome/browser/ui/lens/lens_overlay_controller.cc
+++ b/chrome/browser/ui/lens/lens_overlay_controller.cc
@@ -2096,6 +2096,8 @@
     // Add our blur layer to the view.
     overlay_view_->SetPaintToLayer();
     overlay_view_->layer()->Add(lens_overlay_blur_layer_delegate_->layer());
+    overlay_view_->layer()->StackAtBottom(
+        lens_overlay_blur_layer_delegate_->layer());
     lens_overlay_blur_layer_delegate_->layer()->SetBounds(
         overlay_view_->layer()->bounds());
     return;
diff --git a/chrome/browser/ui/search_engine_choice/OWNERS b/chrome/browser/ui/search_engine_choice/OWNERS
index a8ff91d..c7aa42b 100644
--- a/chrome/browser/ui/search_engine_choice/OWNERS
+++ b/chrome/browser/ui/search_engine_choice/OWNERS
@@ -1 +1 @@
-file://components/search_engines/search_engine_choice/OWNERS
+file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
diff --git a/chrome/browser/ui/toasts/toast_controller.cc b/chrome/browser/ui/toasts/toast_controller.cc
index 3fd8031..e7c441b 100644
--- a/chrome/browser/ui/toasts/toast_controller.cc
+++ b/chrome/browser/ui/toasts/toast_controller.cc
@@ -36,6 +36,10 @@
 #include "ui/views/view.h"
 #include "ui/views/widget/widget.h"
 
+#if BUILDFLAG(IS_MAC)
+#include "chrome/browser/ui/fullscreen_util_mac.h"
+#endif
+
 ToastParams::ToastParams(ToastId id) : toast_id_(id) {}
 ToastParams::ToastParams(ToastParams&& other) noexcept = default;
 ToastParams& ToastParams::operator=(ToastParams&& other) noexcept = default;
@@ -232,6 +236,18 @@
   }
 }
 
+bool ToastController::ShouldRenderToastOverWebContents() {
+  bool render_in_contents =
+      browser_window_interface_->ShouldHideUIForFullscreen();
+
+#if BUILDFLAG(IS_MAC)
+  render_in_contents |=
+      fullscreen_utils::IsInContentFullscreen(browser_window_interface_);
+#endif
+
+  return render_in_contents;
+}
+
 void ToastController::WebContentsDestroyed() {
   omnibox_helper_observer_.Reset();
   Observe(nullptr);
@@ -274,13 +290,13 @@
 
 void ToastController::CreateToast(const ToastParams& params,
                                   const ToastSpecification* spec) {
-  views::View* anchor_view = browser_window_interface_->TopContainer();
+  views::View* const anchor_view = browser_window_interface_->TopContainer();
   CHECK(anchor_view);
   auto toast_view = std::make_unique<toasts::ToastView>(
       anchor_view,
       FormatString(spec->body_string_id(),
                    params.body_string_replacement_params_),
-      spec->icon(), browser_window_interface_->ShouldHideUIForFullscreen(),
+      spec->icon(), ShouldRenderToastOverWebContents(),
       base::BindRepeating(&RecordToastDismissReason, params.toast_id_));
 
   if (spec->has_close_button()) {
@@ -335,7 +351,7 @@
 
 void ToastController::OnFullscreenStateChanged() {
   toast_view_->UpdateRenderToastOverWebContentsAndPaint(
-      browser_window_interface_->ShouldHideUIForFullscreen());
+      ShouldRenderToastOverWebContents());
 }
 
 void ToastController::ClearTabScopedToasts() {
diff --git a/chrome/browser/ui/toasts/toast_controller.h b/chrome/browser/ui/toasts/toast_controller.h
index eb4f4f3..cd51a6cd 100644
--- a/chrome/browser/ui/toasts/toast_controller.h
+++ b/chrome/browser/ui/toasts/toast_controller.h
@@ -91,6 +91,8 @@
 
   views::Widget* GetToastWidgetForTesting() { return toast_widget_; }
 
+  toasts::ToastView* GetToastViewForTesting() { return toast_view_; }
+
   base::OneShotTimer* GetToastCloseTimerForTesting();
 
  private:
@@ -104,6 +106,7 @@
                               std::vector<std::u16string> replacement);
   void ClearTabScopedToasts();
   void UpdateToastWidgetVisibility(bool show_toast_widget);
+  bool ShouldRenderToastOverWebContents();
 
   // FullscreenObserver:
   void OnFullscreenStateChanged() override;
diff --git a/chrome/browser/ui/toasts/toast_controller_interactive_ui_test.cc b/chrome/browser/ui/toasts/toast_controller_interactive_ui_test.cc
index de623d6..7e062c1 100644
--- a/chrome/browser/ui/toasts/toast_controller_interactive_ui_test.cc
+++ b/chrome/browser/ui/toasts/toast_controller_interactive_ui_test.cc
@@ -13,6 +13,8 @@
 #include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_features.h"
+#include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
+#include "chrome/browser/ui/exclusive_access/fullscreen_controller.h"
 #include "chrome/browser/ui/location_bar/location_bar.h"
 #include "chrome/browser/ui/omnibox/omnibox_tab_helper.h"
 #include "chrome/browser/ui/toasts/api/toast_id.h"
@@ -31,10 +33,12 @@
 #include "content/public/test/browser_test.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
+#include "third_party/blink/public/mojom/frame/fullscreen.mojom.h"
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/base/interaction/element_identifier.h"
 #include "ui/base/interaction/interactive_test.h"
 #include "ui/events/keycodes/keyboard_codes.h"
+#include "ui/gfx/geometry/rect.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
 #include "ui/views/focus/focus_manager.h"
 #include "ui/views/interaction/interactive_views_test.h"
@@ -448,3 +452,30 @@
                                            toasts::ToastCloseReason::kAbort, 1);
       }));
 }
+
+IN_PROC_BROWSER_TEST_F(ToastControllerInteractiveTest,
+                       ToastRendersOverWebContents) {
+#if BUILDFLAG(IS_MAC)
+  FullscreenController* const fullscreen_controller =
+      browser()->exclusive_access_manager()->fullscreen_controller();
+  fullscreen_controller->set_is_tab_fullscreen_for_testing(true);
+#else
+  ui_test_utils::FullscreenWaiter waiter(browser(), {.tab_fullscreen = true});
+  content::WebContents* const active_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  active_contents->GetDelegate()->EnterFullscreenModeForTab(
+      active_contents->GetPrimaryMainFrame(), {});
+  waiter.Wait();
+#endif
+
+  ToastController* const toast_controller = GetToastController();
+  EXPECT_TRUE(
+      toast_controller->MaybeShowToast(ToastParams(ToastId::kLinkCopied)));
+  const gfx::Rect toast_bounds =
+      toast_controller->GetToastViewForTesting()->GetBoundsInScreen();
+  const gfx::Rect web_view_bounds =
+      BrowserView::GetBrowserViewForBrowser(browser())
+          ->GetContentsWebView()
+          ->GetBoundsInScreen();
+  EXPECT_TRUE(web_view_bounds.Contains(toast_bounds));
+}
diff --git a/chrome/browser/ui/toasts/toast_view.cc b/chrome/browser/ui/toasts/toast_view.cc
index 4e9d9886..55542a8 100644
--- a/chrome/browser/ui/toasts/toast_view.cc
+++ b/chrome/browser/ui/toasts/toast_view.cc
@@ -19,9 +19,11 @@
 #include "ui/compositor/layer.h"
 #include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/animation/animation_builder.h"
+#include "ui/views/border.h"
 #include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/button/image_button_factory.h"
 #include "ui/views/controls/highlight_path_generator.h"
+#include "ui/views/layout/layout_provider.h"
 #include "ui/views/view_class_properties.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/window/dialog_client_view.h"
@@ -143,10 +145,12 @@
         close_button_callback_.Then(
             base::BindRepeating(&ToastView::Close, base::Unretained(this),
                                 ToastCloseReason::kCloseButton)),
-        vector_icons::kCloseIcon,
-        lp->GetDistanceMetric(DISTANCE_TOAST_BUBBLE_HEIGHT_CONTENT) -
-            lp->GetInsetsMetric(views::INSETS_VECTOR_IMAGE_BUTTON).height(),
+        vector_icons::kCloseChromeRefreshIcon,
+        lp->GetDistanceMetric(DISTANCE_TOAST_BUBBLE_ICON_SIZE),
         ui::kColorToastForeground));
+    // Override the image button's border with the appropriate icon border size.
+    close_button_->SetBorder(views::CreateEmptyBorder(
+        lp->GetInsetsMetric(views::InsetsMetric::INSETS_ICON_BUTTON)));
     views::InstallCircleHighlightPathGenerator(close_button_);
     close_button_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_CLOSE));
     close_button_->SetProperty(views::kElementIdentifierKey, kToastCloseButton);
@@ -280,7 +284,7 @@
   icon_view_->SetImage(ui::ImageModel::FromVectorIcon(
       *icon_, color_provider->GetColor(ui::kColorToastForeground),
       ChromeLayoutProvider::Get()->GetDistanceMetric(
-          DISTANCE_TOAST_BUBBLE_LEADING_ICON_SIZE)));
+          DISTANCE_TOAST_BUBBLE_ICON_SIZE)));
 }
 
 void ToastView::AnimateOut(base::OnceClosure callback,
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc
index 4d32cec..0c66beb 100644
--- a/chrome/browser/ui/ui_features.cc
+++ b/chrome/browser/ui/ui_features.cc
@@ -224,18 +224,6 @@
              "SearchWebInSidePanel",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Feature that controls whether or not feature engagement configurations can be
-// used to control automatic triggering for side search.
-BASE_FEATURE(kSideSearchAutoTriggering,
-             "SideSearchAutoTriggering",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
-// Feature param that determines how many times a user has to return to a given
-// SRP before we automatically trigger the side search side panel for that SRP
-// on a subsequent navigation.
-const base::FeatureParam<int> kSideSearchAutoTriggeringReturnCount{
-    &kSideSearchAutoTriggering, "SideSearchAutoTriggeringReturnCount", 2};
-
 BASE_FEATURE(kSidePanelWebView,
              "SidePanelWebView",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h
index 818cb38b..1c46163 100644
--- a/chrome/browser/ui/ui_features.h
+++ b/chrome/browser/ui/ui_features.h
@@ -167,9 +167,6 @@
 BASE_DECLARE_FEATURE(kSideSearchFeedback);
 BASE_DECLARE_FEATURE(kSearchWebInSidePanel);
 
-BASE_DECLARE_FEATURE(kSideSearchAutoTriggering);
-extern const base::FeatureParam<int> kSideSearchAutoTriggeringReturnCount;
-
 BASE_DECLARE_FEATURE(kTabGroupsCollapseFreezing);
 
 BASE_DECLARE_FEATURE(kTabHoverCardImages);
diff --git a/chrome/browser/ui/views/chrome_layout_provider.cc b/chrome/browser/ui/views/chrome_layout_provider.cc
index 3539939..9b189df 100644
--- a/chrome/browser/ui/views/chrome_layout_provider.cc
+++ b/chrome/browser/ui/views/chrome_layout_provider.cc
@@ -172,7 +172,7 @@
       return 36;
     case DISTANCE_TOAST_BUBBLE_HEIGHT_CONTENT:
       return 24;
-    case DISTANCE_TOAST_BUBBLE_LEADING_ICON_SIZE:
+    case DISTANCE_TOAST_BUBBLE_ICON_SIZE:
       return 20;
     case DISTANCE_TOAST_BUBBLE_LEADING_ICON_SIDE_MARGINS:
       return 2;
diff --git a/chrome/browser/ui/views/chrome_layout_provider.h b/chrome/browser/ui/views/chrome_layout_provider.h
index 7d283922..d93d7fa 100644
--- a/chrome/browser/ui/views/chrome_layout_provider.h
+++ b/chrome/browser/ui/views/chrome_layout_provider.h
@@ -110,8 +110,8 @@
   DISTANCE_TOAST_BUBBLE_HEIGHT_ACTION_BUTTON,
   // Height of the toast text and close button icon.
   DISTANCE_TOAST_BUBBLE_HEIGHT_CONTENT,
-  // Width and height of the leading vector icon shown in the toast bubble.
-  DISTANCE_TOAST_BUBBLE_LEADING_ICON_SIZE,
+  // Width and height of the vector icons shown in the toast bubble.
+  DISTANCE_TOAST_BUBBLE_ICON_SIZE,
   // Left and right margins of the leading vector icon shown in the toast
   // bubble.
   DISTANCE_TOAST_BUBBLE_LEADING_ICON_SIDE_MARGINS,
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
index c31c546..079c462 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
@@ -317,20 +317,18 @@
   // has placeholder text. Use that instead of the DSE placeholder text.
   if (!model()->keyword_placeholder().empty()) {
     SetPlaceholderText(model()->keyword_placeholder());
-    return;
-  }
-
-  // Otherwise, if a DSE is set, use the DSE placeholder text.
-  const TemplateURL* const default_provider = controller()
-                                                  ->client()
-                                                  ->GetTemplateURLService()
-                                                  ->GetDefaultSearchProvider();
-  if (default_provider) {
+  } else if (const auto* default_provider = controller()
+                                                ->client()
+                                                ->GetTemplateURLService()
+                                                ->GetDefaultSearchProvider()) {
+    // Otherwise, if a DSE is set, use the DSE placeholder text.
     SetPlaceholderText(l10n_util::GetStringFUTF16(
         IDS_OMNIBOX_PLACEHOLDER_TEXT, default_provider->short_name()));
   } else {
     SetPlaceholderText(std::u16string());
   }
+
+  UpdatePlaceholderTextColor();
 }
 
 bool OmniboxViewViews::GetSelectionAtEnd() const {
@@ -630,8 +628,7 @@
 void OmniboxViewViews::OnThemeChanged() {
   views::Textfield::OnThemeChanged();
 
-  set_placeholder_text_color(
-      GetColorProvider()->GetColor(kColorOmniboxTextDimmed));
+  UpdatePlaceholderTextColor();
   SetSelectionBackgroundColor(
       GetColorProvider()->GetColor(kColorOmniboxSelectionBackground));
   SetSelectionTextColor(
@@ -2004,6 +2001,18 @@
 #endif
 }
 
+void OmniboxViewViews::UpdatePlaceholderTextColor() {
+  // Keyword placeholders are dim to differentiate from user input. DSE
+  // placeholders are not dim to draw attention to the omnibox and because the
+  // omnibox is unfocused so there's less risk of confusion with user input.
+  // Null in tests.
+  if (!GetColorProvider())
+    return;
+  set_placeholder_text_color(GetColorProvider()->GetColor(
+      model()->keyword_placeholder().empty() ? kColorOmniboxText
+                                             : kColorOmniboxTextDimmed));
+}
+
 BEGIN_METADATA(OmniboxViewViews)
 ADD_READONLY_PROPERTY_METADATA(bool, SelectionAtEnd)
 ADD_READONLY_PROPERTY_METADATA(int, TextWidth)
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.h b/chrome/browser/ui/views/omnibox/omnibox_view_views.h
index a39f58c6..e8377f0 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views.h
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.h
@@ -84,9 +84,7 @@
 
   // Exposes the RenderText for tests.
 #if defined(UNIT_TEST)
-  gfx::RenderText* GetRenderText() {
-    return views::Textfield::GetRenderText();
-  }
+  gfx::RenderText* GetRenderText() { return views::Textfield::GetRenderText(); }
 #endif
 
   // For use when switching tabs, this saves the current state onto the tab so
@@ -326,6 +324,10 @@
   // Called when the popup view becomes visible.
   void OnPopupOpened();
 
+  // Helper for updating placeholder color depending on whether its a keyword or
+  // DSE placeholder.
+  void UpdatePlaceholderTextColor();
+
   // When true, the location bar view is read only and also is has a slightly
   // different presentation (smaller font size). This is used for popups.
   bool popup_window_mode_;
diff --git a/chrome/browser/ui/views/search_engine_choice/OWNERS b/chrome/browser/ui/views/search_engine_choice/OWNERS
index a8ff91d..c7aa42b 100644
--- a/chrome/browser/ui/views/search_engine_choice/OWNERS
+++ b/chrome/browser/ui/views/search_engine_choice/OWNERS
@@ -1 +1 @@
-file://components/search_engines/search_engine_choice/OWNERS
+file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
diff --git a/chrome/browser/ui/views/side_search/unified_side_search_controller.cc b/chrome/browser/ui/views/side_search/unified_side_search_controller.cc
index c6ad7543..7e5a490 100644
--- a/chrome/browser/ui/views/side_search/unified_side_search_controller.cc
+++ b/chrome/browser/ui/views/side_search/unified_side_search_controller.cc
@@ -14,7 +14,6 @@
 #include "chrome/browser/ui/browser_window/public/browser_window_features.h"
 #include "chrome/browser/ui/color/chrome_color_id.h"
 #include "chrome/browser/ui/side_search/side_search_utils.h"
-#include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/side_panel/side_panel.h"
@@ -322,8 +321,10 @@
   const GURL& previously_committed_url =
       navigation_handle->GetPreviousPrimaryMainFrameURL();
   const bool is_renderer_initiated = navigation_handle->IsRendererInitiated();
-  const int auto_triggering_return_count =
-      features::kSideSearchAutoTriggeringReturnCount.Get();
+
+  // How many times a user has to return to a given SRP before we automatically
+  // trigger the side search side panel for that SRP on a subsequent navigation.
+  constexpr int kAutoTriggeringReturnCount = 2;
 
   // Trigger the side panel only if we've returned to the same SRP n times and
   // this is the first navigation after navigating away from the Google SRP. We
@@ -332,7 +333,7 @@
   // etc.
   return is_renderer_initiated &&
          tab_contents_helper->returned_to_previous_srp_count() ==
-             auto_triggering_return_count &&
+             kAutoTriggeringReturnCount &&
          previously_committed_url == tab_contents_helper->last_search_url();
 }
 
diff --git a/chrome/browser/ui/views/web_apps/web_app_navigation_capturing_iph_interactive_uitest.cc b/chrome/browser/ui/views/web_apps/web_app_navigation_capturing_iph_interactive_uitest.cc
index de77d71d..c0c7c16 100644
--- a/chrome/browser/ui/views/web_apps/web_app_navigation_capturing_iph_interactive_uitest.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_navigation_capturing_iph_interactive_uitest.cc
@@ -34,6 +34,7 @@
 #include "third_party/blink/public/common/input/web_mouse_event.h"
 #include "ui/base/interaction/element_identifier.h"
 #include "ui/base/interaction/state_observer.h"
+#include "ui/base/test/ui_controls.h"
 #include "ui/views/interaction/interaction_test_util_views.h"
 #include "url/gurl.h"
 
@@ -158,51 +159,24 @@
   // Clicks on the "launch app" link on the start page with element ID
   // `element_id`. The start page must be open in at least one browser. The
   // context of the last step is the browser window containing the start page.
-  auto ClickLaunchLink(test::ClickMethod click, const std::string& element_id) {
-    int mouse_button;
-    bool shift = false;
-    switch (click) {
-      case test::ClickMethod::kLeftClick:
-        mouse_button = 0;
-        break;
-      case test::ClickMethod::kMiddleClick:
-        mouse_button = 1;
-        break;
-      case test::ClickMethod::kShiftClick:
-        mouse_button = 0;
-        shift = true;
-        break;
-      case test::ClickMethod::kRightClickLaunchApp:
-        mouse_button = 2;
-        break;
-    }
-    const auto js = base::StringPrintf(R"(
-      function(el) {
-        const event = new MouseEvent(
-            'click',
-            {
-              bubbles: true,
-              button: %d,
-              cancelable: true,
-              shiftKey: %s
-            }
-        );
-        el.dispatchEvent(event);
-      }
-    )",
-                                       mouse_button, shift ? "true" : "false");
-
-    return InAnyContext(ExecuteJsAt(kStartPageId, {"#" + element_id}, js)
-                            .SetDescription("ClickLaunchLink()"));
+  auto ClickLaunchLink(
+      const std::string& element_id,
+      ui_controls::MouseButton button,
+      ui_controls::AcceleratorState accel = ui_controls::kNoAccelerator) {
+    return InAnyContext(
+        ClickElement(kStartPageId, {"#" + element_id}, button, accel)
+            .SetDescription("ClickLaunchLink()"));
   }
 
   // Clicks on `element_id` in the start page, which must be open in at least
   // one browser, launching a new app window. The context of the last step is
   // the window in which the link was opened.
-  auto TriggerAppLaunch(test::ClickMethod click,
-                        const std::string& element_id) {
+  auto TriggerAppLaunch(
+      const std::string& element_id,
+      ui_controls::MouseButton button,
+      ui_controls::AcceleratorState accel = ui_controls::kNoAccelerator) {
     auto steps = Steps(
-        ClickLaunchLink(click, element_id),
+        ClickLaunchLink(element_id, button, accel),
         InAnyContext(
             WaitForShow(kBrowserViewElementId).SetTransitionOnlyOnEvent(true)),
         InSameContext(CheckViewProperty(kBrowserViewElementId,
@@ -230,11 +204,11 @@
 IN_PROC_BROWSER_TEST_F(WebAppNavigationCapturingIphUiTest,
                        IPHShownOnLinkLeftClick) {
   const webapps::AppId app_id = InstallTestWebApp(GetDestinationUrl());
-  RunTestSequence(OpenStartPage(),
-                  TriggerAppLaunch(test::ClickMethod::kLeftClick,
-                                   kToSiteBTargetBlankNoOpener),
-                  InSameContext(WaitForPromo(
-                      feature_engagement::kIPHDesktopPWAsLinkCapturingLaunch)));
+  RunTestSequence(
+      OpenStartPage(),
+      TriggerAppLaunch(kToSiteBTargetBlankNoOpener, ui_controls::LEFT),
+      InSameContext(WaitForPromo(
+          feature_engagement::kIPHDesktopPWAsLinkCapturingLaunch)));
 }
 
 // Middle click does not work (consistently?) on Mac; see
@@ -247,11 +221,11 @@
 IN_PROC_BROWSER_TEST_F(WebAppNavigationCapturingIphUiTest,
                        MAYBE_IPHShownOnLinkMiddleClick) {
   const webapps::AppId app_id = InstallTestWebApp(GetStartUrl());
-  RunTestSequence(OpenAppStartPage(app_id),
-                  TriggerAppLaunch(test::ClickMethod::kMiddleClick,
-                                   kToSiteATargetBlankWithOpener),
-                  InSameContext(WaitForPromo(
-                      feature_engagement::kIPHDesktopPWAsLinkCapturingLaunch)));
+  RunTestSequence(
+      OpenAppStartPage(app_id),
+      TriggerAppLaunch(kToSiteATargetBlankWithOpener, ui_controls::MIDDLE),
+      InSameContext(WaitForPromo(
+          feature_engagement::kIPHDesktopPWAsLinkCapturingLaunch)));
 }
 
 // Shift-click click does not work (consistently?) on Mac; see
@@ -266,8 +240,8 @@
   const webapps::AppId app_id_a = InstallTestWebApp(GetStartUrl());
   const webapps::AppId app_id_b = InstallTestWebApp(GetDestinationUrl());
   RunTestSequence(OpenAppStartPage(app_id_a),
-                  TriggerAppLaunch(test::ClickMethod::kShiftClick,
-                                   kToSiteBTargetBlankWithOpener),
+                  TriggerAppLaunch(kToSiteBTargetBlankWithOpener,
+                                   ui_controls::LEFT, ui_controls::kShift),
                   InSameContext(WaitForPromo(
                       feature_engagement::kIPHDesktopPWAsLinkCapturingLaunch)));
 }
@@ -279,14 +253,14 @@
       blink::Manifest::LaunchHandler(
           blink::mojom::ManifestLaunchHandler_ClientMode::kFocusExisting));
 
-  RunTestSequence(OpenStartPage(), OpenApp(app_id),
-                  ClickLaunchLink(test::ClickMethod::kLeftClick,
-                                  kToSiteBTargetBlankNoOpener),
-                  // Switch back to the app browser's context and verify the IPH
-                  // shows there.
-                  InAnyContext(WithElement(kAppPageId, base::DoNothing())),
-                  InSameContext(WaitForPromo(
-                      feature_engagement::kIPHDesktopPWAsLinkCapturingLaunch)));
+  RunTestSequence(
+      OpenStartPage(), OpenApp(app_id),
+      ClickLaunchLink(kToSiteBTargetBlankNoOpener, ui_controls::LEFT),
+      // Switch back to the app browser's context and verify the IPH
+      // shows there.
+      InAnyContext(WithElement(kAppPageId, base::DoNothing())),
+      InSameContext(WaitForPromo(
+          feature_engagement::kIPHDesktopPWAsLinkCapturingLaunch)));
 }
 
 IN_PROC_BROWSER_TEST_F(WebAppNavigationCapturingIphUiTest,
@@ -296,8 +270,7 @@
 
   RunTestSequence(
       OpenAppStartPage(app_id_a),
-      TriggerAppLaunch(test::ClickMethod::kLeftClick,
-                       kToSiteBTargetBlankWithOpener),
+      TriggerAppLaunch(kToSiteBTargetBlankWithOpener, ui_controls::LEFT),
       InSameContext(CheckPromoIsActive(
           feature_engagement::kIPHDesktopPWAsLinkCapturingLaunch, false)));
 }
@@ -308,8 +281,7 @@
 
   RunTestSequence(
       OpenStartPage(),
-      TriggerAppLaunch(test::ClickMethod::kLeftClick,
-                       kToSiteBTargetBlankNoOpener),
+      TriggerAppLaunch(kToSiteBTargetBlankNoOpener, ui_controls::LEFT),
       InSameContext(Steps(
           WaitForPromo(feature_engagement::kIPHDesktopPWAsLinkCapturingLaunch),
           CheckActionCount("LinkCapturingIPHAppBubbleShown", 1),
@@ -326,8 +298,7 @@
 
   RunTestSequence(
       OpenStartPage(),
-      TriggerAppLaunch(test::ClickMethod::kLeftClick,
-                       kToSiteBTargetBlankNoOpener),
+      TriggerAppLaunch(kToSiteBTargetBlankNoOpener, ui_controls::LEFT),
       InSameContext(Steps(
           WaitForPromo(feature_engagement::kIPHDesktopPWAsLinkCapturingLaunch),
           CheckActionCount("LinkCapturingIPHAppBubbleShown", 1),
@@ -342,8 +313,7 @@
 
   RunTestSequence(
       OpenStartPage(),
-      TriggerAppLaunch(test::ClickMethod::kLeftClick,
-                       kToSiteBTargetBlankNoOpener),
+      TriggerAppLaunch(kToSiteBTargetBlankNoOpener, ui_controls::LEFT),
       InSameContext(Steps(
           WaitForPromo(feature_engagement::kIPHDesktopPWAsLinkCapturingLaunch),
           PressDefaultPromoButton(),
diff --git a/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler.cc b/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler.cc
index d1c3474..be2dc4d 100644
--- a/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler.cc
+++ b/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler.h"
 
+#include "base/i18n/time_formatting.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/feedback/show_feedback_page.h"
@@ -122,6 +123,8 @@
     item->relative_time = base::UTF16ToUTF8(ui::TimeFormat::Simple(
         ui::TimeFormat::FORMAT_ELAPSED, ui::TimeFormat::LENGTH_SHORT,
         base::Time::Now() - scored_url_row.row.last_visit()));
+    item->short_date_time = base::UTF16ToUTF8(
+        base::TimeFormatShortDate(scored_url_row.row.last_visit()));
     item->last_url_visit_timestamp =
         scored_url_row.row.last_visit().InMillisecondsFSinceUnixEpoch();
 
diff --git a/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler_unittest.cc b/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler_unittest.cc
index 86823f70..b8bb99a 100644
--- a/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler_unittest.cc
+++ b/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler.h"
 
+#include "base/i18n/time_formatting.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
@@ -209,6 +210,9 @@
             base::UTF16ToUTF8(ui::TimeFormat::Simple(
                 ui::TimeFormat::FORMAT_ELAPSED, ui::TimeFormat::LENGTH_SHORT,
                 base::Time::Now() - scored_url_row.row.last_visit())));
+  EXPECT_EQ(mojo_result->items[0]->short_date_time,
+            base::UTF16ToUTF8(
+                base::TimeFormatShortDate(scored_url_row.row.last_visit())));
   EXPECT_EQ(mojo_result->items[0]->last_url_visit_timestamp,
             scored_url_row.row.last_visit().InMillisecondsFSinceUnixEpoch());
   EXPECT_EQ(mojo_result->items[0]->url_for_display, "google.com");
diff --git a/chrome/browser/ui/webui/password_manager/password_manager_ui.cc b/chrome/browser/ui/webui/password_manager/password_manager_ui.cc
index 5c08590..d63f1dd 100644
--- a/chrome/browser/ui/webui/password_manager/password_manager_ui.cc
+++ b/chrome/browser/ui/webui/password_manager/password_manager_ui.cc
@@ -355,6 +355,8 @@
       {"passwordManager",
        IDS_PASSWORD_BUBBLES_PASSWORD_MANAGER_LINK_TEXT_SYNCED_TO_ACCOUNT},
       // Header for the page, always "Password Manager".
+      {"passwordManagerDescription",
+       IDS_PASSWORD_MANAGER_UI_DESCRIPTION},
       {"passwordManagerPinChanged", IDS_PASSWORD_MANAGER_PIN_CHANGED},
       {"passwordManagerString", IDS_PASSWORD_MANAGER_UI_TITLE},
       // Page title, branded. "Google Password Manager" or "Password Manager"
diff --git a/chrome/browser/ui/webui/search_engine_choice/OWNERS b/chrome/browser/ui/webui/search_engine_choice/OWNERS
index 89018e9..c591a23 100644
--- a/chrome/browser/ui/webui/search_engine_choice/OWNERS
+++ b/chrome/browser/ui/webui/search_engine_choice/OWNERS
@@ -1,3 +1,3 @@
-file://components/search_engines/search_engine_choice/OWNERS
+file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/browser/ui/webui/settings/settings_interactive_uitest.cc b/chrome/browser/ui/webui/settings/settings_interactive_uitest.cc
index 53902e5..786a66e 100644
--- a/chrome/browser/ui/webui/settings/settings_interactive_uitest.cc
+++ b/chrome/browser/ui/webui/settings/settings_interactive_uitest.cc
@@ -106,15 +106,10 @@
   UNCALLED_MOCK_CALLBACK(ui::InteractionSequence::CompletedCallback, completed);
   UNCALLED_MOCK_CALLBACK(ui::InteractionSequence::AbortedCallback, aborted);
 
-  bool is_3pcd = base::FeatureList::IsEnabled(
-      content_settings::features::kTrackingProtection3pcd);
-  const std::string cookie_row_selector =
-      is_3pcd ? "cr-link-row#trackingProtectionLinkRow"
-              : "cr-link-row#thirdPartyCookiesLinkRow";
   const GURL cookie_setting_url("chrome://settings/privacy");
   const WebContentsInteractionTestUtil::DeepQuery cookies_link_row = {
       "settings-ui", "settings-main", "settings-basic-page",
-      "settings-privacy-page", cookie_row_selector};
+      "settings-privacy-page", "cr-link-row#thirdPartyCookiesLinkRow"};
   const WebContentsInteractionTestUtil::DeepQuery
       cookies_setting_page_help_icon = {
           "settings-ui",
@@ -152,14 +147,8 @@
                         auto* util =
                             element->AsA<TrackedElementWebContents>()->owner();
                         auto* const contents = util->web_contents();
-                        if (is_3pcd) {
-                          EXPECT_EQ(
-                              contents->GetURL(),
-                              GURL(chrome::kTrackingProtectionHelpCenterURL));
-                        } else {
-                          EXPECT_EQ(contents->GetURL(),
-                                    chrome::kCookiesSettingsHelpCenterURL);
-                        }
+                        EXPECT_EQ(contents->GetURL(),
+                                  chrome::kCookiesSettingsHelpCenterURL);
                       }))
                   .Build())
           .Build();
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc
index 623fc7a..1b92d88 100644
--- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc
+++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc
@@ -241,8 +241,9 @@
 }
 
 void ReadAnythingWebContentsObserver::AccessibilityLocationChangesReceived(
-    const std::vector<ui::AXLocationChanges>& details) {
-  page_handler_->AccessibilityLocationChangesReceived(details);
+    const ui::AXTreeID& tree_id,
+    ui::AXLocationAndScrollUpdates& details) {
+  page_handler_->AccessibilityLocationChangesReceived(tree_id, details);
 }
 
 void ReadAnythingWebContentsObserver::PrimaryPageChanged(content::Page& page) {
@@ -390,9 +391,10 @@
 }
 
 void ReadAnythingUntrustedPageHandler::AccessibilityLocationChangesReceived(
-    const std::vector<ui::AXLocationChanges>& details) {
+    const ui::AXTreeID& tree_id,
+    ui::AXLocationAndScrollUpdates& details) {
   if (features::IsReadAnythingDocsIntegrationEnabled()) {
-    page_->AccessibilityLocationChangesReceived(details);
+    page_->AccessibilityLocationChangesReceived(tree_id, details);
   }
 }
 
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.h b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.h
index 24968ac..abbf48be 100644
--- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.h
+++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.h
@@ -57,7 +57,8 @@
   void AccessibilityEventReceived(
       const ui::AXUpdatesAndEvents& details) override;
   void AccessibilityLocationChangesReceived(
-      const std::vector<ui::AXLocationChanges>& details) override;
+      const ui::AXTreeID& tree_id,
+      ui::AXLocationAndScrollUpdates& details) override;
   void PrimaryPageChanged(content::Page& page) override;
   void WebContentsDestroyed() override;
 
@@ -102,7 +103,8 @@
 
   void AccessibilityEventReceived(const ui::AXUpdatesAndEvents& details);
   void AccessibilityLocationChangesReceived(
-      const std::vector<ui::AXLocationChanges>& details);
+      const ui::AXTreeID& tree_id,
+      ui::AXLocationAndScrollUpdates& details);
   void PrimaryPageChanged();
   void WebContentsDestroyed();
 
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler_unittest.cc b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler_unittest.cc
index c18fff7..b45f4255 100644
--- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler_unittest.cc
+++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler_unittest.cc
@@ -26,7 +26,6 @@
 #include "ui/accessibility/ax_node_id_forward.h"
 #include "ui/accessibility/ax_tree_id.h"
 #include "ui/accessibility/mojom/ax_event.mojom.h"
-#include "ui/accessibility/mojom/ax_location_changes.mojom.h"
 #include "ui/accessibility/mojom/ax_tree_id.mojom.h"
 #include "ui/accessibility/mojom/ax_tree_update.mojom.h"
 #include "ui/gfx/geometry/size.h"
@@ -51,7 +50,12 @@
                     const std::vector<ui::AXEvent>& events));
   MOCK_METHOD(void,
               AccessibilityLocationChangesReceived,
-              (const std::vector<ui::AXLocationChanges>& details));
+              (const ui::AXTreeID& tree_id,
+               ui::AXLocationAndScrollUpdates& details));
+  MOCK_METHOD(void,
+              AccessibilityLocationChangesReceived,
+              (const ui::AXTreeID& tree_id,
+               const ui::AXLocationAndScrollUpdates& details));
   MOCK_METHOD(void,
               OnSettingsRestoredFromPrefs,
               (read_anything::mojom::LineSpacing line_spacing,
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 768145d..a2bc247 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1727791183-18ebb677bfded080d4fbccf41c258d8f5b869cce-5c8b1389ff74057dc8513e6687b93c9019d4a496.profdata
+chrome-mac-arm-main-1727805595-7e9a010c1d8e5cb05c53975b96ca20fa6c385199-bdb53115de59bca1fe7e29f68cb950f5b1280da2.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index c7b36b7..5a4b2b4 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1727773147-71e35f3eeb906599fea4b886352dcd4a11b1a762-a163f2d7227da4a5b9792888bd14304ff72ce6f2.profdata
+chrome-win64-main-1727783961-fa1fbfa59af5e894dd8c60c24877d4aaf771b088-f7bc99221b34f0a43ca97da3ec7dcc2ae2e90c0c.profdata
diff --git a/chrome/common/accessibility/read_anything.mojom b/chrome/common/accessibility/read_anything.mojom
index 080c697..cf38aa56 100644
--- a/chrome/common/accessibility/read_anything.mojom
+++ b/chrome/common/accessibility/read_anything.mojom
@@ -11,7 +11,7 @@
 import "skia/public/mojom/bitmap.mojom";
 import "ui/accessibility/ax_features.mojom";
 import "ui/accessibility/mojom/ax_event.mojom";
-import "ui/accessibility/mojom/ax_location_changes.mojom";
+import "ui/accessibility/mojom/ax_location_and_scroll_updates.mojom";
 import "ui/accessibility/mojom/ax_tree_id.mojom";
 import "ui/accessibility/mojom/ax_tree_update.mojom";
 import "mojo/public/mojom/base/values.mojom";
@@ -226,7 +226,9 @@
   // Send a location change notification to the WebUI. The WebUI updates the
   // locations for each node in the vector. This does not trigger a distillation.
   [RuntimeFeature=ax.mojom.features.kReadAnythingDocsIntegration]
-  AccessibilityLocationChangesReceived(array<ax.mojom.AXLocationChanges> details);
+  AccessibilityLocationChangesReceived(
+    ax.mojom.AXTreeID tree_id,
+    ax.mojom.AXLocationAndScrollUpdates details);
 
   // Sends the active AXTreeID to the WebUI. This is not guaranteed to be called
   // after the tree_id was previously passed to AccessibilityEventsReceived.
diff --git a/chrome/enterprise_companion/enterprise_companion_client.cc b/chrome/enterprise_companion/enterprise_companion_client.cc
index bf8d438..2b4cc72 100644
--- a/chrome/enterprise_companion/enterprise_companion_client.cc
+++ b/chrome/enterprise_companion/enterprise_companion_client.cc
@@ -96,6 +96,7 @@
     VLOG(1) << "Failed to connect to EnterpriseCompanionService remote. "
                "The service could not be launched.";
     std::move(callback).Run({});
+    return;
   }
 
   mojo::PlatformChannelEndpoint endpoint =
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.cc b/chrome/renderer/accessibility/read_anything_app_controller.cc
index 6992db7..8154fbb 100644
--- a/chrome/renderer/accessibility/read_anything_app_controller.cc
+++ b/chrome/renderer/accessibility/read_anything_app_controller.cc
@@ -47,6 +47,7 @@
 #include "third_party/skia/include/core/SkImageInfo.h"
 #include "ui/accessibility/accessibility_features.h"
 #include "ui/accessibility/ax_enums.mojom-shared.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_node.h"
 #include "ui/accessibility/ax_node_id_forward.h"
 #include "ui/accessibility/ax_role_properties.h"
@@ -523,10 +524,18 @@
 }
 
 void ReadAnythingAppController::AccessibilityLocationChangesReceived(
-    const std::vector<ui::AXLocationChanges>& details) {
+    const ui::AXTreeID& tree_id,
+    const ui::AXLocationAndScrollUpdates& details) {
+  NOTREACHED() << "Non-const ref version of this method should be used as a "
+                  "performance optimization.";
+}
+
+void ReadAnythingAppController::AccessibilityLocationChangesReceived(
+    const ui::AXTreeID& tree_id,
+    ui::AXLocationAndScrollUpdates& details) {
   // Listen to location change notifications to update locations of the nodes
   // accordingly.
-  for (auto& change : details) {
+  for (auto& change : details.location_changes) {
     ui::AXNode* ax_node = model_.GetAXNode(change.id);
     if (!ax_node) {
       continue;
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.h b/chrome/renderer/accessibility/read_anything_app_controller.h
index 974648b..b6f9fad 100644
--- a/chrome/renderer/accessibility/read_anything_app_controller.h
+++ b/chrome/renderer/accessibility/read_anything_app_controller.h
@@ -25,6 +25,7 @@
 #include "services/metrics/public/cpp/ukm_source_id.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColor.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_node_id_forward.h"
 #include "ui/accessibility/ax_node_position.h"
 #include "ui/accessibility/ax_position.h"
@@ -121,7 +122,11 @@
       const std::vector<ui::AXTreeUpdate>& updates,
       const std::vector<ui::AXEvent>& events) override;
   void AccessibilityLocationChangesReceived(
-      const std::vector<ui::AXLocationChanges>& details) override;
+      const ui::AXTreeID& tree_id,
+      ui::AXLocationAndScrollUpdates& details) override;
+  void AccessibilityLocationChangesReceived(
+      const ui::AXTreeID& tree_id,
+      const ui::AXLocationAndScrollUpdates& details) override;
   void OnActiveAXTreeIDChanged(const ui::AXTreeID& tree_id,
                                ukm::SourceId ukm_source_id,
                                bool is_pdf) override;
diff --git a/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc b/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc
index 414e831..ac37ac2 100644
--- a/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc
+++ b/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc
@@ -24,6 +24,7 @@
 #include "services/strings/grit/services_strings.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "ui/accessibility/accessibility_features.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_node.h"
 #include "ui/accessibility/ax_node_id_forward.h"
 #include "ui/accessibility/ax_serializable_tree.h"
@@ -292,8 +293,9 @@
   }
 
   void AccessibilityLocationChangesReceived(
-      const std::vector<ui::AXLocationChanges>& details) {
-    controller_->AccessibilityLocationChangesReceived(details);
+      const ui::AXTreeID& tree_id,
+      ui::AXLocationAndScrollUpdates& details) {
+    controller_->AccessibilityLocationChangesReceived(tree_id, details);
   }
 
   // Since a11y events happen asynchronously, they can come between the time
@@ -1732,13 +1734,11 @@
   ui::AXRelativeBounds location_update;
   location_update.offset_container_id = 1;
   location_update.bounds = gfx::RectF(5, 5, 100, 100);
-  ui::AXLocationChanges location_changes;
-  location_changes.id = 2;
-  location_changes.ax_tree_id = id_1;
-  location_changes.new_location = location_update;
+  ui::AXLocationAndScrollUpdates location_and_scroll_updates;
+  location_and_scroll_updates.location_changes.emplace_back(2, location_update);
 
   // Test that the node data updates correctly
-  AccessibilityLocationChangesReceived({location_changes});
+  AccessibilityLocationChangesReceived(id_1, location_and_scroll_updates);
   node = GetNodeData(2);
   EXPECT_EQ(node.relative_bounds, location_update);
 }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeBrowserTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeBrowserTestRule.java
index 1416c84..443786b 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeBrowserTestRule.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeBrowserTestRule.java
@@ -25,10 +25,8 @@
                 new Statement() {
                     @Override
                     public void evaluate() throws Throwable {
-                        /**
-                         * Loads the native library on the activity UI thread.  After loading the library,
-                         * this will initialize the browser process if necessary.
-                         */
+                        // Loads the native library on the activity UI thread. After loading the
+                        // library, this will initialize the browser process if necessary.
                         NativeLibraryTestUtils.loadNativeLibraryAndInitBrowserProcess();
                         base.evaluate();
                     }
diff --git a/chrome/test/base/chrome_unit_test_suite.cc b/chrome/test/base/chrome_unit_test_suite.cc
index 0ea9af3a..fb961c4 100644
--- a/chrome/test/base/chrome_unit_test_suite.cc
+++ b/chrome/test/base/chrome_unit_test_suite.cc
@@ -52,8 +52,11 @@
 #include "components/web_package/signed_web_bundles/signed_web_bundle_id.h"
 #endif  // !BUILDFLAG(IS_ANDROID)
 
-#if BUILDFLAG(ENABLE_EXTENSIONS)
+#if BUILDFLAG(ENABLE_EXTENSIONS_CORE)
 #include "chrome/common/initialize_extensions_client.h"
+#endif
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
 #include "extensions/common/extension_paths.h"
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
@@ -176,7 +179,9 @@
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   extensions::RegisterPathProvider();
+#endif
 
+#if BUILDFLAG(ENABLE_EXTENSIONS_CORE)
   EnsureExtensionsClientInitialized();
 #endif
 
diff --git a/chrome/test/base/testing_browser_process.cc b/chrome/test/base/testing_browser_process.cc
index 1f214167..1778d1bc 100644
--- a/chrome/test/base/testing_browser_process.cc
+++ b/chrome/test/base/testing_browser_process.cc
@@ -68,6 +68,10 @@
 #include "components/storage_monitor/test_storage_monitor.h"
 #endif
 
+#if BUILDFLAG(ENABLE_DESKTOP_ANDROID_EXTENSIONS)
+#include "chrome/browser/extensions/desktop_android/desktop_android_extensions_browser_client.h"
+#endif
+
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
 #include "chrome/browser/printing/background_printing_manager.h"
 #include "chrome/browser/printing/print_preview_dialog_controller.h"
@@ -175,7 +179,11 @@
         test_network_connection_tracker_.get());
   }
 
-#if BUILDFLAG(ENABLE_EXTENSIONS)
+#if BUILDFLAG(ENABLE_DESKTOP_ANDROID_EXTENSIONS)
+  extensions_browser_client_ =
+      std::make_unique<extensions::DesktopAndroidExtensionsBrowserClient>();
+  extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get());
+#elif BUILDFLAG(ENABLE_EXTENSIONS)
   extensions_browser_client_ =
       std::make_unique<extensions::ChromeExtensionsBrowserClient>();
   extensions_browser_client_->AddAPIProvider(
diff --git a/chrome/test/base/testing_browser_process.h b/chrome/test/base/testing_browser_process.h
index 8ef74cb..617e441 100644
--- a/chrome/test/base/testing_browser_process.h
+++ b/chrome/test/base/testing_browser_process.h
@@ -267,7 +267,9 @@
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   std::unique_ptr<MediaFileSystemRegistry> media_file_system_registry_;
+#endif
 
+#if BUILDFLAG(ENABLE_EXTENSIONS_CORE)
   std::unique_ptr<extensions::ExtensionsBrowserClient>
       extensions_browser_client_;
 #endif
diff --git a/chrome/test/data/click.html b/chrome/test/data/click.html
new file mode 100644
index 0000000..ab726b0
--- /dev/null
+++ b/chrome/test/data/click.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<body>
+<button id="button">Button</button>
+<script>
+const button = document.getElementById('button');
+button.addEventListener('click', function(event) {
+  button.lastClickEvent = event;
+});
+</script>
+</body>
+</html>
diff --git a/chrome/test/data/webui/commerce/product_specifications/loading_state_test.ts b/chrome/test/data/webui/commerce/product_specifications/loading_state_test.ts
index de7c847..4053a91 100644
--- a/chrome/test/data/webui/commerce/product_specifications/loading_state_test.ts
+++ b/chrome/test/data/webui/commerce/product_specifications/loading_state_test.ts
@@ -17,6 +17,19 @@
     document.body.appendChild(loadingElement);
   });
 
+  function resizeContainer(width: number): Promise<void> {
+    // A ResizeObserver is used to ensure the ResizeObserver callback that shows
+    // the last column gradient has completed.
+    return new Promise<void>(resolve => {
+      const observer = new ResizeObserver(() => {
+        resolve();
+        observer.unobserve(loadingElement.$.loadingContainer);
+      });
+      observer.observe(loadingElement.$.loadingContainer);
+      loadingElement.$.loadingContainer.style.width = `${width}px`;
+    });
+  }
+
   test(
       'last column gradient appears when SVG is wider than its container',
       async () => {
@@ -31,7 +44,7 @@
 
         // Container should be smaller than the loading gradient, so the last
         // column gradient should appear.
-        document.body.style.width = '200px';
+        await resizeContainer(200);
         await microtasksFinished();
         assertTrue(isVisible(lastColumnGradient));
       });
diff --git a/chrome/test/data/webui/cr_components/history_embeddings/history_embeddings_test.ts b/chrome/test/data/webui/cr_components/history_embeddings/history_embeddings_test.ts
index 6f0775a7..fe5a6f0 100644
--- a/chrome/test/data/webui/cr_components/history_embeddings/history_embeddings_test.ts
+++ b/chrome/test/data/webui/cr_components/history_embeddings/history_embeddings_test.ts
@@ -29,6 +29,7 @@
         url: {url: 'http://google.com'},
         urlForDisplay: 'google.com',
         relativeTime: '2 hours ago',
+        shortDateTime: 'Sept 2, 2022',
         sourcePassage: 'Google description',
         lastUrlVisitTimestamp: 1000,
         answerData: null,
@@ -38,6 +39,7 @@
         url: {url: 'http://youtube.com'},
         urlForDisplay: 'youtube.com',
         relativeTime: '4 hours ago',
+        shortDateTime: 'Sept 2, 2022',
         sourcePassage: 'Youtube description',
         lastUrlVisitTimestamp: 2000,
         answerData: null,
@@ -464,6 +466,7 @@
         url: {url: 'http://answer.com'},
         urlForDisplay: 'Answer.com',
         relativeTime: '2 months ago',
+        shortDateTime: 'Sept 2, 2022',
         sourcePassage: 'Answer description',
         lastUrlVisitTimestamp: 2000,
         answerData: {answerTextDirectives: []},
@@ -482,9 +485,11 @@
       assertTrue(!!answerSource);
       assertFalse(answerSource.hidden);
       assertEquals('http://answer.com', answerSource.getAttribute('href'));
-      assertEquals(
-          'Answer.com',
-          answerSource.querySelector<HTMLElement>('.result-url')!.innerText);
+
+      const answerUrlAndDate =
+          answerSource.querySelector<HTMLElement>('.result-url')!.innerText;
+      assertTrue(answerUrlAndDate.startsWith('Answer.com'));
+      assertTrue(answerUrlAndDate.endsWith('Sept 2, 2022'));
       assertEquals(
           getFaviconForPageURL('http://answer.com', true),
           answerSource.querySelector<HTMLElement>(
diff --git a/chrome/test/data/webui/side_panel/customize_chrome/categories_test.ts b/chrome/test/data/webui/side_panel/customize_chrome/categories_test.ts
index 1468442..3073bb1 100644
--- a/chrome/test/data/webui/side_panel/customize_chrome/categories_test.ts
+++ b/chrome/test/data/webui/side_panel/customize_chrome/categories_test.ts
@@ -6,7 +6,7 @@
 
 import type {CategoriesElement} from 'chrome://customize-chrome-side-panel.top-chrome/categories.js';
 import {CHANGE_CHROME_THEME_CLASSIC_ELEMENT_ID, CHROME_THEME_COLLECTION_ELEMENT_ID} from 'chrome://customize-chrome-side-panel.top-chrome/categories.js';
-import {CustomizeChromeAction} from 'chrome://customize-chrome-side-panel.top-chrome/common.js';
+import {CustomizeChromeAction, NtpImageType} from 'chrome://customize-chrome-side-panel.top-chrome/common.js';
 import type {BackgroundCollection, CustomizeChromePageRemote} from 'chrome://customize-chrome-side-panel.top-chrome/customize_chrome.mojom-webui.js';
 import {CustomizeChromePageCallbackRouter, CustomizeChromePageHandlerRemote} from 'chrome://customize-chrome-side-panel.top-chrome/customize_chrome.mojom-webui.js';
 import {CustomizeChromeApiProxy} from 'chrome://customize-chrome-side-panel.top-chrome/customize_chrome_api_proxy.js';
@@ -21,6 +21,11 @@
 
 import {$$, createBackgroundImage, createTheme, installMock} from './test_support.js';
 
+interface CollectionOptions {
+  numCollections: number;
+  shouldReplaceBrokenImages?: boolean;
+}
+
 function createTestCollections(length: number): BackgroundCollection[] {
   const testCollections: BackgroundCollection[] = [];
   for (let i = 1; i < length + 1; i++) {
@@ -41,16 +46,21 @@
   let callbackRouterRemote: CustomizeChromePageRemote;
   let metrics: MetricsTracker;
 
-  async function setInitialSettings(numCollections: number) {
+  async function setInitialSettings(
+      {numCollections, shouldReplaceBrokenImages = false}: CollectionOptions) {
     handler.setResultFor('getBackgroundCollections', Promise.resolve({
       collections: createTestCollections(numCollections),
     }));
     if (loadTimeData.getBoolean('imageErrorDetectionEnabled')) {
       handler.setResultMapperFor(
           'getReplacementCollectionPreviewImage', (collectionId: string) => {
-            return Promise.resolve({
-              previewImageUrl: {url: `https://replaced-${collectionId}.jpg`},
-            });
+            if (shouldReplaceBrokenImages) {
+              return Promise.resolve({
+                previewImageUrl: {url: `https://replaced-${collectionId}.jpg`},
+              });
+            } else {
+              return Promise.resolve(null);
+            }
           });
     }
     categoriesElement = document.createElement('customize-chrome-categories');
@@ -73,7 +83,7 @@
 
   test('hide collection elements when collections empty', async () => {
     const numCollections = 0;
-    await setInitialSettings(numCollections);
+    await setInitialSettings({numCollections: numCollections});
 
     const collections =
         categoriesElement.shadowRoot!.querySelectorAll('.collection');
@@ -90,8 +100,7 @@
 
       test('collection visibility based on error detection', async () => {
         const numCollections = 2;
-        await setInitialSettings(numCollections);
-        await microtasksFinished();
+        await setInitialSettings({numCollections: numCollections});
 
         const collections =
             categoriesElement.shadowRoot!.querySelectorAll('.collection');
@@ -114,7 +123,8 @@
 
       test('collection image src based on error detection', async () => {
         const numCollections = 2;
-        await setInitialSettings(numCollections);
+        await setInitialSettings(
+            {numCollections: numCollections, shouldReplaceBrokenImages: true});
 
         const images =
             categoriesElement.shadowRoot!.querySelectorAll<CrAutoImgElement>(
@@ -128,6 +138,10 @@
         if (!errorDetectionEnabled) {
           assertEquals('https://collection-1.jpg', images[0]!.autoSrc);
           assertEquals('https://collection-2.jpg', images[1]!.autoSrc);
+          assertEquals(
+              0,
+              metrics.count(
+                  'NewTabPage.BackgroundService.Images.Headers.ErrorDetected'));
         } else {
           assertEquals('https://replaced-1.jpg', images[0]!.autoSrc);
           assertEquals('https://replaced-2.jpg', images[1]!.autoSrc);
@@ -135,17 +149,16 @@
       });
 
       test('collections surface if their images load', async () => {
-        await setInitialSettings(1);
+        await setInitialSettings({numCollections: 1});
         await microtasksFinished();
         const collection = $$(categoriesElement, '.collection');
         assertTrue(!!collection);
-        const img1 = collection!.querySelector<CrAutoImgElement>('img');
-        assertTrue(!!img1);
-
         if (errorDetectionEnabled) {
           assertFalse(isVisible(collection));
         }
 
+        const img1 = collection!.querySelector<CrAutoImgElement>('img');
+        assertTrue(!!img1);
         img1.dispatchEvent(new Event('load'));
 
         await microtasksFinished();
@@ -155,13 +168,44 @@
             metrics.count(
                 'NewTabPage.Images.ShownTime.CollectionPreviewImage'));
       });
+
+      test('error detection metrics fire correctly', async () => {
+        const numCollections = 2;
+        await setInitialSettings({numCollections: 2});
+
+        const images =
+            categoriesElement.shadowRoot!.querySelectorAll<CrAutoImgElement>(
+                '.collection img');
+        assertEquals(numCollections, images.length);
+        const img1Error = eventToPromise('error', images[0]!);
+        const img2Error = eventToPromise('error', images[1]!);
+        await Promise.all([img1Error, img2Error]);
+        await microtasksFinished();
+
+        if (!errorDetectionEnabled) {
+          assertEquals(
+              0,
+              metrics.count(
+                  'NewTabPage.BackgroundService.Images.Headers.ErrorDetected'));
+        } else {
+          assertEquals(
+              2,
+              metrics.count(
+                  'NewTabPage.BackgroundService.Images.Headers.ErrorDetected'));
+          assertEquals(
+              2,
+              metrics.count(
+                  'NewTabPage.BackgroundService.Images.Headers.ErrorDetected',
+                  NtpImageType.COLLECTIONS));
+        }
+      });
     });
   });
 
   test('collection preview images create metrics when loaded', async () => {
     const startTime = 123.45;
     windowProxy.setResultFor('now', startTime);
-    await setInitialSettings(1);
+    await setInitialSettings({numCollections: 1});
     assertEquals(1, windowProxy.getCallCount('now'));
     const imageLoadTime = 678.90;
     windowProxy.setResultFor('now', imageLoadTime);
@@ -180,7 +224,7 @@
   });
 
   test('clicking collection sends event', async () => {
-    await setInitialSettings(1);
+    await setInitialSettings({numCollections: 1});
 
     const eventPromise = eventToPromise('collection-select', categoriesElement);
     const category =
@@ -193,7 +237,7 @@
   });
 
   test('back button creates event', async () => {
-    await setInitialSettings(0);
+    await setInitialSettings({numCollections: 0});
     const eventPromise = eventToPromise('back-click', categoriesElement);
     categoriesElement.$.heading.getBackButton().click();
     const event = await eventPromise;
@@ -201,7 +245,7 @@
   });
 
   test('clicking classic chrome sets theme', async () => {
-    await setInitialSettings(0);
+    await setInitialSettings({numCollections: 0});
     categoriesElement.$.classicChromeTile.click();
     assertEquals(1, handler.getCallCount('removeBackgroundImage'));
     assertEquals(1, handler.getCallCount('setDefaultColor'));
@@ -214,7 +258,7 @@
         loadTimeData.overrideValues({
           updatedToUploadedImage: 'Theme updated to uploaded image',
         });
-        await setInitialSettings(0);
+        await setInitialSettings({numCollections: 0});
         handler.setResultFor('chooseLocalCustomBackground', Promise.resolve({
           success: true,
         }));
@@ -239,14 +283,14 @@
       });
 
   test('clicking Chrome Web Store tile opens Chrome Web Store', async () => {
-    await setInitialSettings(0);
+    await setInitialSettings({numCollections: 0});
 
     categoriesElement.$.chromeWebStoreTile.click();
     assertEquals(1, handler.getCallCount('openChromeWebStore'));
   });
 
   test('checks selected category', async () => {
-    await setInitialSettings(2);
+    await setInitialSettings({numCollections: 2});
 
     // Set an empty theme with no color and no background.
     const theme = createTheme();
@@ -314,7 +358,7 @@
   });
 
   test('help bubble can correctly find anchor elements', async () => {
-    await setInitialSettings(5);
+    await setInitialSettings({numCollections: 5});
     assertDeepEquals(
         categoriesElement.getSortedAnchorStatusesForTesting(),
         [
@@ -325,7 +369,7 @@
   });
 
   test('classic chrome tile shows correct image', async () => {
-    await setInitialSettings(0);
+    await setInitialSettings({numCollections: 0});
 
     assertEquals(
         $$<HTMLImageElement>(
@@ -346,7 +390,7 @@
       test(
           `wallpaper search does ${flagEnabled ? '' : 'not '}show`,
           async () => {
-            await setInitialSettings(0);
+            await setInitialSettings({numCollections: 0});
             assertEquals(
                 !!categoriesElement.shadowRoot!.querySelector(
                     '#wallpaperSearchTile'),
@@ -354,7 +398,7 @@
           });
 
       test('check category for wallpaper search background', async () => {
-        await setInitialSettings(1);
+        await setInitialSettings({numCollections: 1});
 
         // Set a theme with wallpaper search background.
         const theme = createTheme();
@@ -392,7 +436,7 @@
     });
 
     test('choosing collection sets metric', async () => {
-      await setInitialSettings(1);
+      await setInitialSettings({numCollections: 1});
 
       const tile = categoriesElement.shadowRoot!.querySelector('.collection');
       assertTrue(!!tile);
@@ -409,7 +453,7 @@
     });
 
     test('choosing default chrome sets metric', async () => {
-      await setInitialSettings(0);
+      await setInitialSettings({numCollections: 0});
 
       categoriesElement.$.classicChromeTile.click();
 
@@ -423,7 +467,7 @@
     });
 
     test('choosing wallpaper search sets metric', async () => {
-      await setInitialSettings(0);
+      await setInitialSettings({numCollections: 0});
 
       const tile =
           categoriesElement.shadowRoot!.querySelector('#wallpaperSearchTile');
@@ -440,7 +484,7 @@
     });
 
     test('choosing upload sets metric', async () => {
-      await setInitialSettings(0);
+      await setInitialSettings({numCollections: 0});
 
       categoriesElement.$.uploadImageTile.click();
 
diff --git a/chrome/test/data/webui/side_panel/customize_chrome/themes_test.ts b/chrome/test/data/webui/side_panel/customize_chrome/themes_test.ts
index 2482f8c..8e9eba6 100644
--- a/chrome/test/data/webui/side_panel/customize_chrome/themes_test.ts
+++ b/chrome/test/data/webui/side_panel/customize_chrome/themes_test.ts
@@ -4,7 +4,7 @@
 
 import 'chrome://customize-chrome-side-panel.top-chrome/themes.js';
 
-import {CustomizeChromeAction} from 'chrome://customize-chrome-side-panel.top-chrome/common.js';
+import {CustomizeChromeAction, NtpImageType} from 'chrome://customize-chrome-side-panel.top-chrome/common.js';
 import type {BackgroundCollection, CollectionImage, CustomizeChromePageRemote} from 'chrome://customize-chrome-side-panel.top-chrome/customize_chrome.mojom-webui.js';
 import {CustomizeChromePageCallbackRouter, CustomizeChromePageHandlerRemote} from 'chrome://customize-chrome-side-panel.top-chrome/customize_chrome.mojom-webui.js';
 import {CustomizeChromeApiProxy} from 'chrome://customize-chrome-side-panel.top-chrome/customize_chrome_api_proxy.js';
@@ -98,13 +98,13 @@
   });
 
   test('get collection images when collection changes', async () => {
-    let numThemes = 3;
-    await setCollection('test1', numThemes);
+    let numImages = 3;
+    await setCollection('test1', numImages);
 
     let header = themesElement.$.heading;
     assertEquals('test1', header.textContent!.trim());
     let themes = themesElement.shadowRoot!.querySelectorAll('.theme');
-    assertEquals(themes.length, numThemes);
+    assertEquals(themes.length, numImages);
     assertEquals(
         'https://preview_1.jpg',
         themes[0]!.querySelector('img')!.getAttribute('auto-src'));
@@ -115,13 +115,13 @@
         'https://preview_3.jpg',
         themes[2]!.querySelector('img')!.getAttribute('auto-src'));
 
-    numThemes = 5;
-    await setCollection('test2', numThemes);
+    numImages = 5;
+    await setCollection('test2', numImages);
 
     header = themesElement.$.heading;
     assertEquals('test2', header.textContent!.trim());
     themes = themesElement.shadowRoot!.querySelectorAll('.theme');
-    assertEquals(themes.length, numThemes);
+    assertEquals(themes.length, numImages);
     assertEquals(
         'https://preview_1.jpg',
         themes[0]!.querySelector('img')!.getAttribute('auto-src'));
@@ -350,11 +350,11 @@
       });
 
       test('theme visibility based on error detection', async () => {
-        const numThemes = 2;
-        await setCollection('test1', numThemes);
+        const numImages = 2;
+        await setCollection('test1', numImages);
 
         const themes = themesElement.shadowRoot!.querySelectorAll('.theme');
-        assertEquals(numThemes, themes.length);
+        assertEquals(numImages, themes.length);
         if (!errorDetectionEnabled) {
           assertTrue(isVisible(themes[0]!));
           assertTrue(isVisible(themes[1]!));
@@ -369,17 +369,43 @@
 
         const theme = $$(themesElement, '.theme');
         assertTrue(!!theme);
-        const img1 = theme!.querySelector<CrAutoImgElement>('img');
-        assertTrue(!!img1);
+        const img = theme!.querySelector<CrAutoImgElement>('img');
+        assertTrue(!!img);
 
         if (errorDetectionEnabled) {
           assertFalse(isVisible(theme));
         }
 
-        img1.dispatchEvent(new Event('load'));
+        img.dispatchEvent(new Event('load'));
+        await microtasksFinished();
+
+        assertTrue(isVisible(theme));
+      });
+
+      test('error detection metrics fire correctly', async () => {
+        const numImages = 1;
+        await setCollection('test1', numImages);
+        const img = $$(themesElement, '.theme img');
+        assertTrue(!!img);
 
         await microtasksFinished();
-        assertTrue(isVisible(theme));
+
+        if (!errorDetectionEnabled) {
+          assertEquals(
+              0,
+              metrics.count(
+                  'NewTabPage.BackgroundService.Images.Headers.ErrorDetected'));
+        } else {
+          assertEquals(
+              numImages,
+              metrics.count(
+                  'NewTabPage.BackgroundService.Images.Headers.ErrorDetected'));
+          assertEquals(
+              numImages,
+              metrics.count(
+                  'NewTabPage.BackgroundService.Images.Headers.ErrorDetected',
+                  NtpImageType.BACKGROUND_IMAGE));
+        }
       });
     });
   });
diff --git a/chrome/test/interaction/README.md b/chrome/test/interaction/README.md
index 77b1f5be..5ac3db9 100644
--- a/chrome/test/interaction/README.md
+++ b/chrome/test/interaction/README.md
@@ -146,6 +146,8 @@
     - `ScrollIntoView()` [Views, Browser]
       - Recommended before doing anything that needs the screen coordinates of
         a UI or DOM element that is in a scrollable container.
+    - `ClickElement()` [Browser]
+      - For use with instrumented webcontents; see below.
 - **Mouse** verbs simulate mouse input to the entire application, and are
   therefore only reliable in test fixtures that run as exclusive processes (e.g.
   interactive_browser_tests). Examples include:
diff --git a/chrome/test/interaction/interactive_browser_test.cc b/chrome/test/interaction/interactive_browser_test.cc
index cc310100..6ae3aeb 100644
--- a/chrome/test/interaction/interactive_browser_test.cc
+++ b/chrome/test/interaction/interactive_browser_test.cc
@@ -40,6 +40,7 @@
 #include "ui/base/interaction/interaction_sequence.h"
 #include "ui/base/interaction/interaction_test_util.h"
 #include "ui/base/interaction/interactive_test_internal.h"
+#include "ui/base/test/ui_controls.h"
 #include "ui/views/controls/webview/webview.h"
 #include "ui/views/interaction/interaction_test_util_views.h"
 #include "ui/views/interaction/interactive_views_test.h"
@@ -762,6 +763,70 @@
           .SetDescription("ScrollIntoView()"));
 }
 
+ui::InteractionSequence::StepBuilder InteractiveBrowserTestApi::ClickElement(
+    ui::ElementIdentifier web_contents,
+    const DeepQuery& where,
+    ui_controls::MouseButton button,
+    ui_controls::AcceleratorState modifiers) {
+  int js_button;
+  switch (button) {
+    case ui_controls::LEFT:
+      js_button = 0;
+      break;
+    case ui_controls::MIDDLE:
+      js_button = 1;
+      break;
+    case ui_controls::RIGHT:
+      js_button = 2;
+      break;
+  }
+
+  const bool shift = modifiers & ui_controls::AcceleratorState::kShift;
+  const bool alt = modifiers & ui_controls::AcceleratorState::kAlt;
+  const bool ctrl = modifiers & ui_controls::AcceleratorState::kControl;
+  const bool meta = modifiers & ui_controls::AcceleratorState::kCommand;
+
+  auto b2s = [](bool b) { return b ? "true" : "false"; };
+
+  const std::string command = base::StringPrintf(
+      R"(
+      function(el) {
+        const rect = el.getBoundingClientRect();
+        const left = Math.max(0, rect.x);
+        const top = Math.max(0, rect.y);
+        const right = Math.min(rect.x + rect.width, window.innerWidth);
+        const bottom = Math.min(rect.y + rect.height, window.innerHeight);
+        if (right <= left || bottom <= top) {
+          throw new Error(
+              'Target element is zero size or ' +
+              'has empty intersection with the viewport.');
+        }
+        const x = (left + right) / 2;
+        const y = (top + bottom) / 2;
+
+        const event = new MouseEvent(
+            'click',
+            {
+              bubbles: true,
+              cancelable: true,
+              clientX: x,
+              clientY: y,
+              button: %d,
+              shiftKey: %s,
+              altKey: %s,
+              ctrlKey: %s,
+              metaKey: %s
+            }
+        );
+        el.dispatchEvent(event);
+      }
+    )",
+      js_button, b2s(shift), b2s(alt), b2s(ctrl), b2s(meta));
+
+  return std::move(ExecuteJsAt(web_contents, where, command)
+                       .SetDescription("ClickElement()"));
+}
+
 // static
 InteractiveBrowserTestApi::RelativePositionCallback
 InteractiveBrowserTestApi::DeepQueryToRelativePosition(const DeepQuery& query) {
diff --git a/chrome/test/interaction/interactive_browser_test.h b/chrome/test/interaction/interactive_browser_test.h
index 360e034..75c1eba7 100644
--- a/chrome/test/interaction/interactive_browser_test.h
+++ b/chrome/test/interaction/interactive_browser_test.h
@@ -358,6 +358,22 @@
   [[nodiscard]] StepBuilder ScrollIntoView(ui::ElementIdentifier web_contents,
                                            const DeepQuery& where);
 
+  // Simulates clicking on an HTML element by injecting the click event directly
+  // into the DOM. You can specify the mouse button and additional modifier
+  // keys (default is left-click, no modifiers).
+  //
+  // Normally, clicking with buttons other than the left mouse button generates
+  // an auxclick event rather than a click event. However, injecting auxclick
+  // does not e.g. trigger navigation when clicking a link, so in all these
+  // cases, vanilla click events are sent, which should be handled normally for
+  // backwards-compatibility reasons.
+  [[nodiscard]] StepBuilder ClickElement(
+      ui::ElementIdentifier web_contents,
+      const DeepQuery& where,
+      ui_controls::MouseButton button = ui_controls::LEFT,
+      ui_controls::AcceleratorState modifiers =
+          ui_controls::AcceleratorState::kNoAccelerator);
+
  protected:
   explicit InteractiveBrowserTestApi(
       std::unique_ptr<internal::InteractiveBrowserTestPrivate>
diff --git a/chrome/test/interaction/interactive_browser_test_browsertest.cc b/chrome/test/interaction/interactive_browser_test_browsertest.cc
index 669177d..9e32acd8 100644
--- a/chrome/test/interaction/interactive_browser_test_browsertest.cc
+++ b/chrome/test/interaction/interactive_browser_test_browsertest.cc
@@ -4,6 +4,9 @@
 
 #include "chrome/test/interaction/interactive_browser_test.h"
 
+#include <sstream>
+#include <tuple>
+
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -19,6 +22,7 @@
 #include "ui/base/interaction/expect_call_in_scope.h"
 #include "ui/base/interaction/interaction_sequence.h"
 #include "ui/base/mojom/ui_base_types.mojom-shared.h"
+#include "ui/base/test/ui_controls.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/native_widget_types.h"
@@ -30,6 +34,7 @@
 DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kWebContentsId);
 constexpr char kDocumentWithNamedElement[] = "/select.html";
 constexpr char kDocumentWithLinks[] = "/links.html";
+constexpr char kDocumentWithClickDetection[] = "/click.html";
 constexpr char kScrollableDocument[] =
     "/scroll/scrollable_page_with_content.html";
 }  // namespace
@@ -561,6 +566,99 @@
                  WaitForStateChange(kTabId, state_change)));
 }
 
+using ClickElementParams =
+    std::tuple<ui_controls::MouseButton, ui_controls::AcceleratorState>;
+
+class InteractiveBrowserTestClickElementTest
+    : public InteractiveBrowserTestBrowsertest,
+      public testing::WithParamInterface<ClickElementParams> {
+ public:
+  InteractiveBrowserTestClickElementTest() = default;
+  ~InteractiveBrowserTestClickElementTest() override = default;
+};
+
+INSTANTIATE_TEST_SUITE_P(
+    ,
+    InteractiveBrowserTestClickElementTest,
+    testing::Combine(
+        testing::Values(ui_controls::LEFT,
+                        ui_controls::MIDDLE,
+                        ui_controls::RIGHT),
+        testing::Values(ui_controls::AcceleratorState::kNoAccelerator,
+                        ui_controls::AcceleratorState::kShift,
+                        ui_controls::AcceleratorState::kControl,
+                        ui_controls::AcceleratorState::kAlt,
+                        ui_controls::AcceleratorState::kCommand,
+                        static_cast<ui_controls::AcceleratorState>(
+                            ui_controls::AcceleratorState::kAlt |
+                            ui_controls::AcceleratorState::kShift),
+                        static_cast<ui_controls::AcceleratorState>(
+                            ui_controls::AcceleratorState::kControl |
+                            ui_controls::AcceleratorState::kCommand |
+                            ui_controls::AcceleratorState::kAlt |
+                            ui_controls::AcceleratorState::kShift))),
+    [](const testing::TestParamInfo<ClickElementParams>& params) {
+      std::ostringstream oss;
+      switch (std::get<0>(params.param)) {
+        case ui_controls::LEFT:
+          oss << "Left";
+          break;
+        case ui_controls::MIDDLE:
+          oss << "Middle";
+          break;
+        case ui_controls::RIGHT:
+          oss << "Right";
+          break;
+      }
+      const auto accel = std::get<1>(params.param);
+      if (accel & ui_controls::AcceleratorState::kControl) {
+        oss << "_Control";
+      }
+      if (accel & ui_controls::AcceleratorState::kAlt) {
+        oss << "_Alt";
+      }
+      if (accel & ui_controls::AcceleratorState::kShift) {
+        oss << "_Shift";
+      }
+      if (accel & ui_controls::AcceleratorState::kCommand) {
+        oss << "_Meta";
+      }
+      return oss.str();
+    });
+
+IN_PROC_BROWSER_TEST_P(InteractiveBrowserTestClickElementTest, ClickElement) {
+  const GURL url = embedded_test_server()->GetURL(kDocumentWithClickDetection);
+  const auto mouse_button = std::get<0>(GetParam());
+  const auto modifier = std::get<1>(GetParam());
+  const DeepQuery kButton = {"#button"};
+  RunTestSequence(
+      InstrumentTab(kWebContentsId), NavigateWebContents(kWebContentsId, url),
+      ClickElement(kWebContentsId, kButton, mouse_button, modifier),
+      CheckJsResultAt(kWebContentsId, kButton, "el => el.lastClickEvent.button",
+                      static_cast<int>(mouse_button)),
+      CheckJsResultAt(kWebContentsId, kButton, "el => el.lastClickEvent.altKey",
+                      (modifier & ui_controls::AcceleratorState::kAlt) != 0),
+      CheckJsResultAt(kWebContentsId, kButton,
+                      "el => el.lastClickEvent.shiftKey",
+                      (modifier & ui_controls::AcceleratorState::kShift) != 0),
+      CheckJsResultAt(
+          kWebContentsId, kButton, "el => el.lastClickEvent.ctrlKey",
+          (modifier & ui_controls::AcceleratorState::kControl) != 0),
+      CheckJsResultAt(
+          kWebContentsId, kButton, "el => el.lastClickEvent.metaKey",
+          (modifier & ui_controls::AcceleratorState::kCommand) != 0),
+      CheckJsResultAt(kWebContentsId, kButton,
+                      R"(
+            function(el) {
+              const x = el.lastClickEvent.x;
+              const y = el.lastClickEvent.y;
+              const rect = el.getBoundingClientRect();
+              return x >= rect.left && x < rect.right &&
+                     y >= rect.top && y < rect.bottom;
+            }
+          )"));
+}
+
 // Parameter for WebUI coverage tests.
 struct CoverageConfig {
   // Whether to set the --devtools-code-coverage flag. If it's not set, nothing
diff --git a/chromecast/media/cma/backend/android/java/src/org/chromium/chromecast/cma/backend/android/AudioSinkAudioTrackImpl.java b/chromecast/media/cma/backend/android/java/src/org/chromium/chromecast/cma/backend/android/AudioSinkAudioTrackImpl.java
index 848e5c14..2626ee8 100644
--- a/chromecast/media/cma/backend/android/java/src/org/chromium/chromecast/cma/backend/android/AudioSinkAudioTrackImpl.java
+++ b/chromecast/media/cma/backend/android/java/src/org/chromium/chromecast/cma/backend/android/AudioSinkAudioTrackImpl.java
@@ -454,11 +454,8 @@
         return (playtimeLeftNsecs < 0) ? 0 : playtimeLeftNsecs / 1000; // return usecs
     }
 
+    /** Closes the instance by stopping playback and releasing the AudioTrack object. */
     @CalledByNative
-    /**
-     * Closes the instance by stopping playback and releasing the AudioTrack
-     * object.
-     */
     private void close() {
         Log.i(mTag, "Close AudioSinkAudioTrackImpl!");
         if (!isStopped()) mAudioTrack.stop();
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 2585f39..ce8a8656 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-16049.0.0-1063698
\ No newline at end of file
+16050.0.0-1063704
\ No newline at end of file
diff --git a/chromeos/ash/components/boca/babelorca/BUILD.gn b/chromeos/ash/components/boca/babelorca/BUILD.gn
index 67e203b..26e69b8 100644
--- a/chromeos/ash/components/boca/babelorca/BUILD.gn
+++ b/chromeos/ash/components/boca/babelorca/BUILD.gn
@@ -25,7 +25,8 @@
     "tachyon_registrar.cc",
     "tachyon_registrar.h",
     "tachyon_request_data_provider.h",
-    "tachyon_request_error.h",
+    "tachyon_response.cc",
+    "tachyon_response.h",
     "tachyon_utils.cc",
     "tachyon_utils.h",
     "token_data_wrapper.h",
@@ -83,6 +84,7 @@
     "tachyon_authed_client_impl_unittest.cc",
     "tachyon_client_impl_unittest.cc",
     "tachyon_registrar_unittest.cc",
+    "tachyon_response_unittest.cc",
     "token_manager_impl_unittest.cc",
     "transcript_sender_unittest.cc",
   ]
diff --git a/chromeos/ash/components/boca/babelorca/fakes/fake_tachyon_authed_client.cc b/chromeos/ash/components/boca/babelorca/fakes/fake_tachyon_authed_client.cc
index 054d42f..9692683 100644
--- a/chromeos/ash/components/boca/babelorca/fakes/fake_tachyon_authed_client.cc
+++ b/chromeos/ash/components/boca/babelorca/fakes/fake_tachyon_authed_client.cc
@@ -12,7 +12,7 @@
 #include "base/run_loop.h"
 #include "base/types/expected.h"
 #include "chromeos/ash/components/boca/babelorca/request_data_wrapper.h"
-#include "chromeos/ash/components/boca/babelorca/tachyon_request_error.h"
+#include "chromeos/ash/components/boca/babelorca/tachyon_response.h"
 #include "third_party/protobuf/src/google/protobuf/message_lite.h"
 
 namespace ash::babelorca {
@@ -40,7 +40,7 @@
 }
 
 void FakeTachyonAuthedClient::ExecuteResponseCallback(
-    base::expected<std::string, TachyonRequestError> response) {
+    TachyonResponse response) {
   CHECK(response_cb_);
   std::move(response_cb_).Run(std::move(response));
 }
diff --git a/chromeos/ash/components/boca/babelorca/fakes/fake_tachyon_authed_client.h b/chromeos/ash/components/boca/babelorca/fakes/fake_tachyon_authed_client.h
index 4ad3db5..6686098 100644
--- a/chromeos/ash/components/boca/babelorca/fakes/fake_tachyon_authed_client.h
+++ b/chromeos/ash/components/boca/babelorca/fakes/fake_tachyon_authed_client.h
@@ -9,13 +9,13 @@
 #include <string>
 
 #include "base/run_loop.h"
-#include "base/types/expected.h"
 #include "chromeos/ash/components/boca/babelorca/request_data_wrapper.h"
 #include "chromeos/ash/components/boca/babelorca/tachyon_authed_client.h"
-#include "chromeos/ash/components/boca/babelorca/tachyon_request_error.h"
 
 namespace ash::babelorca {
 
+class TachyonResponse;
+
 class FakeTachyonAuthedClient : public TachyonAuthedClient {
  public:
   FakeTachyonAuthedClient();
@@ -33,8 +33,7 @@
       std::unique_ptr<RequestDataWrapper> request_data,
       std::string request_string) override;
 
-  void ExecuteResponseCallback(
-      base::expected<std::string, TachyonRequestError> response);
+  void ExecuteResponseCallback(TachyonResponse response);
 
   RequestDataWrapper::ResponseCallback TakeResponseCallback();
 
diff --git a/chromeos/ash/components/boca/babelorca/request_data_wrapper.h b/chromeos/ash/components/boca/babelorca/request_data_wrapper.h
index 8285249..2d60e47 100644
--- a/chromeos/ash/components/boca/babelorca/request_data_wrapper.h
+++ b/chromeos/ash/components/boca/babelorca/request_data_wrapper.h
@@ -9,15 +9,14 @@
 #include <string_view>
 
 #include "base/functional/callback.h"
-#include "base/types/expected.h"
-#include "chromeos/ash/components/boca/babelorca/tachyon_request_error.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 
 namespace ash::babelorca {
 
+class TachyonResponse;
+
 struct RequestDataWrapper {
-  using ResponseCallback = base::OnceCallback<void(
-      base::expected<std::string, TachyonRequestError>)>;
+  using ResponseCallback = base::OnceCallback<void(TachyonResponse)>;
 
   RequestDataWrapper(
       const net::NetworkTrafficAnnotationTag& annotation_tag_param,
diff --git a/chromeos/ash/components/boca/babelorca/tachyon_authed_client_impl.cc b/chromeos/ash/components/boca/babelorca/tachyon_authed_client_impl.cc
index a900e4f..53501289 100644
--- a/chromeos/ash/components/boca/babelorca/tachyon_authed_client_impl.cc
+++ b/chromeos/ash/components/boca/babelorca/tachyon_authed_client_impl.cc
@@ -16,10 +16,9 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "base/task/thread_pool.h"
-#include "base/types/expected.h"
 #include "chromeos/ash/components/boca/babelorca/request_data_wrapper.h"
 #include "chromeos/ash/components/boca/babelorca/tachyon_client.h"
-#include "chromeos/ash/components/boca/babelorca/tachyon_request_error.h"
+#include "chromeos/ash/components/boca/babelorca/tachyon_response.h"
 #include "chromeos/ash/components/boca/babelorca/token_manager.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "third_party/protobuf/src/google/protobuf/message_lite.h"
@@ -70,7 +69,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!request_string) {
     std::move(request_data->response_cb)
-        .Run(base::unexpected(TachyonRequestError::kInternalError));
+        .Run(TachyonResponse(TachyonResponse::Status::kInternalError));
     return;
   }
   request_data->content_data = std::move(*request_string);
@@ -91,7 +90,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!has_oauth_token) {
     std::move(request_data->response_cb)
-        .Run(base::unexpected(TachyonRequestError::kAuthError));
+        .Run(TachyonResponse(TachyonResponse::Status::kAuthError));
     return;
   }
   std::string oauth_token = *(oauth_token_manager_->GetTokenString());
@@ -108,7 +107,7 @@
   static int constexpr kMaxAuthRetries = 1;
   if (request_data->oauth_retry_num >= kMaxAuthRetries) {
     std::move(request_data->response_cb)
-        .Run(base::unexpected(TachyonRequestError::kAuthError));
+        .Run(TachyonResponse(TachyonResponse::Status::kAuthError));
     return;
   }
   ++(request_data->oauth_retry_num);
diff --git a/chromeos/ash/components/boca/babelorca/tachyon_authed_client_impl_unittest.cc b/chromeos/ash/components/boca/babelorca/tachyon_authed_client_impl_unittest.cc
index 3381d50..cdf95ff9 100644
--- a/chromeos/ash/components/boca/babelorca/tachyon_authed_client_impl_unittest.cc
+++ b/chromeos/ash/components/boca/babelorca/tachyon_authed_client_impl_unittest.cc
@@ -11,12 +11,11 @@
 #include "base/memory/raw_ptr.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
-#include "base/types/expected.h"
 #include "chromeos/ash/components/boca/babelorca/fakes/fake_tachyon_client.h"
 #include "chromeos/ash/components/boca/babelorca/fakes/fake_token_manager.h"
 #include "chromeos/ash/components/boca/babelorca/proto/testing_message.pb.h"
 #include "chromeos/ash/components/boca/babelorca/request_data_wrapper.h"
-#include "chromeos/ash/components/boca/babelorca/tachyon_request_error.h"
+#include "chromeos/ash/components/boca/babelorca/tachyon_response.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -24,8 +23,6 @@
 namespace ash::babelorca {
 namespace {
 
-using ExpectedTestingMessage = base::expected<std::string, TachyonRequestError>;
-
 constexpr char kOAuthToken1[] = "oauth-token1";
 constexpr char kOAuthToken2[] = "oauth-token2";
 constexpr int kMaxRetries = 2;
@@ -64,7 +61,7 @@
                                                 test_future_.GetCallback());
   }
 
-  base::test::TestFuture<ExpectedTestingMessage>* test_future() {
+  base::test::TestFuture<TachyonResponse>* test_future() {
     return &test_future_;
   }
 
@@ -76,7 +73,7 @@
   FakeTokenManager fake_token_manager_;
   std::unique_ptr<TestingMessage> request_message_;
   std::string request_string_;
-  base::test::TestFuture<ExpectedTestingMessage> test_future_;
+  base::test::TestFuture<TachyonResponse> test_future_;
 };
 
 TEST_F(TachyonAuthedClientImplTest, InitiallyAuthed) {
@@ -215,8 +212,7 @@
   fake_client_ptr()->WaitForRequest();
   fake_client_ptr()->ExecuteAuthFailCb();
 
-  EXPECT_EQ(test_future()->Get(),
-            base::unexpected(TachyonRequestError::kAuthError));
+  EXPECT_EQ(test_future()->Get().status(), TachyonResponse::Status::kAuthError);
 }
 
 TEST_F(TachyonAuthedClientImplTest, TokenFetchFailed) {
@@ -226,8 +222,7 @@
   fake_token_manager()->WaitForForceFetchRequest();
   fake_token_manager()->ExecuteFetchCallback(/*success=*/false);
 
-  EXPECT_EQ(test_future()->Get(),
-            base::unexpected(TachyonRequestError::kAuthError));
+  EXPECT_EQ(test_future()->Get().status(), TachyonResponse::Status::kAuthError);
 }
 
 }  // namespace
diff --git a/chromeos/ash/components/boca/babelorca/tachyon_client_impl.cc b/chromeos/ash/components/boca/babelorca/tachyon_client_impl.cc
index 003d4a0..270b022 100644
--- a/chromeos/ash/components/boca/babelorca/tachyon_client_impl.cc
+++ b/chromeos/ash/components/boca/babelorca/tachyon_client_impl.cc
@@ -5,6 +5,7 @@
 #include "chromeos/ash/components/boca/babelorca/tachyon_client_impl.h"
 
 #include <memory>
+#include <optional>
 #include <string>
 #include <utility>
 
@@ -13,9 +14,8 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/strings/stringprintf.h"
-#include "base/types/expected.h"
 #include "chromeos/ash/components/boca/babelorca/request_data_wrapper.h"
-#include "chromeos/ash/components/boca/babelorca/tachyon_request_error.h"
+#include "chromeos/ash/components/boca/babelorca/tachyon_response.h"
 #include "net/base/load_flags.h"
 #include "net/base/net_errors.h"
 #include "net/http/http_request_headers.h"
@@ -80,34 +80,17 @@
     std::unique_ptr<RequestDataWrapper> request_data,
     AuthFailureCallback auth_failure_cb,
     std::unique_ptr<std::string> response_body) {
-  if (url_loader->NetError() != net::OK &&
-      url_loader->NetError() != net::ERR_HTTP_RESPONSE_CODE_FAILURE) {
-    std::move(request_data->response_cb)
-        .Run(base::unexpected(TachyonRequestError::kNetworkError));
-    return;
+  std::optional<int> http_status_code;
+  if (url_loader->ResponseInfo() && url_loader->ResponseInfo()->headers) {
+    http_status_code = url_loader->ResponseInfo()->headers->response_code();
   }
-  if (!url_loader->ResponseInfo() || !url_loader->ResponseInfo()->headers) {
-    std::move(request_data->response_cb)
-        .Run(base::unexpected(TachyonRequestError::kInternalError));
-    return;
-  }
-  const int response_code =
-      url_loader->ResponseInfo()->headers->response_code();
-  if (response_code == net::HttpStatusCode::HTTP_UNAUTHORIZED) {
+  TachyonResponse response(url_loader->NetError(), http_status_code,
+                           std::move(response_body));
+  if (response.status() == TachyonResponse::Status::kAuthError) {
     std::move(auth_failure_cb).Run(std::move(request_data));
     return;
   }
-  if (!network::IsSuccessfulStatus(response_code)) {
-    std::move(request_data->response_cb)
-        .Run(base::unexpected(TachyonRequestError::kHttpError));
-    return;
-  }
-  if (!response_body) {
-    std::move(request_data->response_cb)
-        .Run(base::unexpected(TachyonRequestError::kInternalError));
-    return;
-  }
-  std::move(request_data->response_cb).Run(std::move(*response_body));
+  std::move(request_data->response_cb).Run(std::move(response));
 }
 
 }  // namespace ash::babelorca
diff --git a/chromeos/ash/components/boca/babelorca/tachyon_client_impl_unittest.cc b/chromeos/ash/components/boca/babelorca/tachyon_client_impl_unittest.cc
index 6d7b4ad2..01cd300 100644
--- a/chromeos/ash/components/boca/babelorca/tachyon_client_impl_unittest.cc
+++ b/chromeos/ash/components/boca/babelorca/tachyon_client_impl_unittest.cc
@@ -10,10 +10,9 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
-#include "base/types/expected.h"
 #include "chromeos/ash/components/boca/babelorca/proto/testing_message.pb.h"
 #include "chromeos/ash/components/boca/babelorca/request_data_wrapper.h"
-#include "chromeos/ash/components/boca/babelorca/tachyon_request_error.h"
+#include "chromeos/ash/components/boca/babelorca/tachyon_response.h"
 #include "net/base/net_errors.h"
 #include "net/http/http_status_code.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
@@ -27,7 +26,6 @@
 namespace ash::babelorca {
 namespace {
 
-using ExpectedTestingMessage = base::expected<std::string, TachyonRequestError>;
 using RequestDataPtr = std::unique_ptr<RequestDataWrapper>;
 
 constexpr char kOAuthToken[] = "oauth-token";
@@ -50,13 +48,13 @@
     return &auth_failure_future_;
   }
 
-  base::test::TestFuture<ExpectedTestingMessage>* result_future() {
+  base::test::TestFuture<TachyonResponse>* result_future() {
     return &result_future_;
   }
 
  private:
   base::test::TestFuture<RequestDataPtr> auth_failure_future_;
-  base::test::TestFuture<ExpectedTestingMessage> result_future_;
+  base::test::TestFuture<TachyonResponse> result_future_;
   base::test::TaskEnvironment task_env_;
 };
 
@@ -70,10 +68,10 @@
   client.StartRequest(request_data(), kOAuthToken,
                       auth_failure_future()->GetCallback());
 
-  auto result = result_future()->Get();
-  ASSERT_TRUE(result.has_value());
+  auto result = result_future()->Take();
+  EXPECT_TRUE(result.ok());
   TestingMessage result_proto;
-  ASSERT_TRUE(result_proto.ParseFromString(result.value()));
+  ASSERT_TRUE(result_proto.ParseFromString(result.response_body()));
   EXPECT_EQ(result_proto.int_field(), 9999);
   EXPECT_FALSE(auth_failure_future()->IsReady());
 }
@@ -88,9 +86,8 @@
   client.StartRequest(request_data(), kOAuthToken,
                       auth_failure_future()->GetCallback());
 
-  auto result = result_future()->Get();
-  ASSERT_FALSE(result.has_value());
-  EXPECT_EQ(result.error(), TachyonRequestError::kNetworkError);
+  auto result = result_future()->Take();
+  EXPECT_EQ(result.status(), TachyonResponse::Status::kNetworkError);
   EXPECT_FALSE(auth_failure_future()->IsReady());
 }
 
@@ -103,9 +100,8 @@
   client.StartRequest(request_data(), kOAuthToken,
                       auth_failure_future()->GetCallback());
 
-  auto result = result_future()->Get();
-  ASSERT_FALSE(result.has_value());
-  EXPECT_EQ(result.error(), TachyonRequestError::kHttpError);
+  auto result = result_future()->Take();
+  EXPECT_EQ(result.status(), TachyonResponse::Status::kHttpError);
   EXPECT_FALSE(auth_failure_future()->IsReady());
 }
 
diff --git a/chromeos/ash/components/boca/babelorca/tachyon_registrar.cc b/chromeos/ash/components/boca/babelorca/tachyon_registrar.cc
index 28d13a1..5041ebac 100644
--- a/chromeos/ash/components/boca/babelorca/tachyon_registrar.cc
+++ b/chromeos/ash/components/boca/babelorca/tachyon_registrar.cc
@@ -12,7 +12,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/sequence_checker.h"
-#include "base/types/expected.h"
 #include "base/uuid.h"
 #include "chromeos/ash/components/boca/babelorca/proto/tachyon.pb.h"
 #include "chromeos/ash/components/boca/babelorca/proto/tachyon_common.pb.h"
@@ -20,6 +19,7 @@
 #include "chromeos/ash/components/boca/babelorca/request_data_wrapper.h"
 #include "chromeos/ash/components/boca/babelorca/tachyon_authed_client.h"
 #include "chromeos/ash/components/boca/babelorca/tachyon_constants.h"
+#include "chromeos/ash/components/boca/babelorca/tachyon_response.h"
 #include "chromeos/ash/components/boca/babelorca/tachyon_utils.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 
@@ -69,16 +69,15 @@
   return tachyon_token_;
 }
 
-void TachyonRegistrar::OnResponse(
-    base::OnceCallback<void(bool)> success_cb,
-    base::expected<std::string, TachyonRequestError> response) {
+void TachyonRegistrar::OnResponse(base::OnceCallback<void(bool)> success_cb,
+                                  TachyonResponse response) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!response.has_value()) {
+  if (!response.ok()) {
     std::move(success_cb).Run(false);
     return;
   }
   SignInGaiaResponse signin_response;
-  if (!signin_response.ParseFromString(response.value())) {
+  if (!signin_response.ParseFromString(response.response_body())) {
     std::move(success_cb).Run(false);
     return;
   }
diff --git a/chromeos/ash/components/boca/babelorca/tachyon_registrar.h b/chromeos/ash/components/boca/babelorca/tachyon_registrar.h
index 7f079cf..3b14125 100644
--- a/chromeos/ash/components/boca/babelorca/tachyon_registrar.h
+++ b/chromeos/ash/components/boca/babelorca/tachyon_registrar.h
@@ -15,13 +15,12 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "base/thread_annotations.h"
-#include "base/types/expected.h"
-#include "chromeos/ash/components/boca/babelorca/tachyon_request_error.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 
 namespace ash::babelorca {
 
 class TachyonAuthedClient;
+class TachyonResponse;
 
 // Register user with Tachyon and store tachyon token to be used by other
 // tachyon requests.
@@ -45,7 +44,7 @@
 
  private:
   void OnResponse(base::OnceCallback<void(bool)> success_cb,
-                  base::expected<std::string, TachyonRequestError> response);
+                  TachyonResponse response);
 
   SEQUENCE_CHECKER(sequence_checker_);
 
diff --git a/chromeos/ash/components/boca/babelorca/tachyon_registrar_unittest.cc b/chromeos/ash/components/boca/babelorca/tachyon_registrar_unittest.cc
index 8b9a0a9..4b5aa66d 100644
--- a/chromeos/ash/components/boca/babelorca/tachyon_registrar_unittest.cc
+++ b/chromeos/ash/components/boca/babelorca/tachyon_registrar_unittest.cc
@@ -9,10 +9,11 @@
 
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
-#include "base/types/expected.h"
 #include "chromeos/ash/components/boca/babelorca/fakes/fake_tachyon_authed_client.h"
 #include "chromeos/ash/components/boca/babelorca/proto/tachyon.pb.h"
-#include "chromeos/ash/components/boca/babelorca/tachyon_request_error.h"
+#include "chromeos/ash/components/boca/babelorca/tachyon_response.h"
+#include "net/base/net_errors.h"
+#include "net/http/http_status_code.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -31,7 +32,9 @@
   registrar.Register(kClientUuid, test_future.GetCallback());
   SignInGaiaResponse signin_response;
   signin_response.mutable_auth_token()->set_payload(kTachyonToken);
-  authed_client.ExecuteResponseCallback(signin_response.SerializeAsString());
+  authed_client.ExecuteResponseCallback(TachyonResponse(
+      net::OK, net::HttpStatusCode::HTTP_OK,
+      std::make_unique<std::string>(signin_response.SerializeAsString())));
 
   EXPECT_TRUE(test_future.Get());
   std::optional<std::string> tachyon_token = registrar.GetTachyonToken();
@@ -47,7 +50,7 @@
 
   registrar.Register(kClientUuid, test_future.GetCallback());
   authed_client.ExecuteResponseCallback(
-      base::unexpected(TachyonRequestError::kHttpError));
+      TachyonResponse(TachyonResponse::Status::kHttpError));
 
   EXPECT_FALSE(test_future.Get());
   std::optional<std::string> tachyon_token = registrar.GetTachyonToken();
diff --git a/chromeos/ash/components/boca/babelorca/tachyon_request_error.h b/chromeos/ash/components/boca/babelorca/tachyon_request_error.h
deleted file mode 100644
index 41ae4f4..0000000
--- a/chromeos/ash/components/boca/babelorca/tachyon_request_error.h
+++ /dev/null
@@ -1,19 +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 CHROMEOS_ASH_COMPONENTS_BOCA_BABELORCA_TACHYON_REQUEST_ERROR_H_
-#define CHROMEOS_ASH_COMPONENTS_BOCA_BABELORCA_TACHYON_REQUEST_ERROR_H_
-
-namespace ash::babelorca {
-
-enum class TachyonRequestError {
-  kHttpError,
-  kNetworkError,
-  kInternalError,
-  kAuthError
-};
-
-}
-
-#endif  // CHROMEOS_ASH_COMPONENTS_BOCA_BABELORCA_TACHYON_REQUEST_ERROR_H_
diff --git a/chromeos/ash/components/boca/babelorca/tachyon_response.cc b/chromeos/ash/components/boca/babelorca/tachyon_response.cc
new file mode 100644
index 0000000..b2695a1
--- /dev/null
+++ b/chromeos/ash/components/boca/babelorca/tachyon_response.cc
@@ -0,0 +1,66 @@
+// 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 "chromeos/ash/components/boca/babelorca/tachyon_response.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "net/base/net_errors.h"
+#include "net/http/http_status_code.h"
+#include "services/network/public/cpp/header_util.h"
+
+namespace ash::babelorca {
+
+TachyonResponse::TachyonResponse(Status status) : status_(status) {}
+
+TachyonResponse::TachyonResponse(int rpc_code,
+                                 const std::string& error_message) {
+  constexpr int kOkCode = 0;
+  constexpr int kUnauthenticatedCode = 16;
+  switch (rpc_code) {
+    case kOkCode:
+      status_ = Status::kOk;
+      break;
+    case kUnauthenticatedCode:
+      status_ = Status::kAuthError;
+      break;
+    default:
+      status_ = Status::kHttpError;
+  }
+  error_message_ = error_message;
+}
+
+TachyonResponse::TachyonResponse(int net_error,
+                                 std::optional<int> http_status_code,
+                                 std::unique_ptr<std::string> response_body) {
+  if (net_error != net::OK &&
+      net_error != net::ERR_HTTP_RESPONSE_CODE_FAILURE) {
+    status_ = Status::kNetworkError;
+    return;
+  }
+  if (!http_status_code.has_value()) {
+    status_ = Status::kInternalError;
+    return;
+  }
+  if (http_status_code == net::HttpStatusCode::HTTP_UNAUTHORIZED) {
+    status_ = Status::kAuthError;
+    return;
+  }
+  if (!network::IsSuccessfulStatus(http_status_code.value())) {
+    status_ = Status::kHttpError;
+    return;
+  }
+  response_body_ = response_body ? std::move(*response_body) : "";
+  status_ = Status::kOk;
+}
+
+TachyonResponse::~TachyonResponse() = default;
+
+bool TachyonResponse::ok() const {
+  return status_ == Status::kOk;
+}
+
+}  // namespace ash::babelorca
diff --git a/chromeos/ash/components/boca/babelorca/tachyon_response.h b/chromeos/ash/components/boca/babelorca/tachyon_response.h
new file mode 100644
index 0000000..a2d7950c
--- /dev/null
+++ b/chromeos/ash/components/boca/babelorca/tachyon_response.h
@@ -0,0 +1,51 @@
+// 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 CHROMEOS_ASH_COMPONENTS_BOCA_BABELORCA_TACHYON_RESPONSE_H_
+#define CHROMEOS_ASH_COMPONENTS_BOCA_BABELORCA_TACHYON_RESPONSE_H_
+
+#include <memory>
+#include <string>
+
+namespace ash::babelorca {
+
+class TachyonResponse {
+ public:
+  enum class Status {
+    kOk,
+    kHttpError,
+    kNetworkError,
+    kInternalError,
+    kAuthError
+  };
+  explicit TachyonResponse(Status status);
+  explicit TachyonResponse(int rpc_code, const std::string& error_message = "");
+  TachyonResponse(int net_error,
+                  std::optional<int> http_status_code,
+                  std::unique_ptr<std::string> response_body);
+
+  TachyonResponse(TachyonResponse&& other) = default;
+  TachyonResponse& operator=(TachyonResponse&& other) = default;
+
+  ~TachyonResponse();
+
+  bool ok() const;
+
+  Status status() const { return status_; }
+
+  // Empty string if there is no response body.
+  const std::string& response_body() const { return response_body_; }
+
+  // Empty string if there is no error message.
+  const std::string& error_message() const { return error_message_; }
+
+ private:
+  Status status_;
+  std::string response_body_;
+  std::string error_message_;
+};
+
+}  // namespace ash::babelorca
+
+#endif  // CHROMEOS_ASH_COMPONENTS_BOCA_BABELORCA_TACHYON_RESPONSE_H_
diff --git a/chromeos/ash/components/boca/babelorca/tachyon_response_unittest.cc b/chromeos/ash/components/boca/babelorca/tachyon_response_unittest.cc
new file mode 100644
index 0000000..c414e574
--- /dev/null
+++ b/chromeos/ash/components/boca/babelorca/tachyon_response_unittest.cc
@@ -0,0 +1,96 @@
+// 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 "chromeos/ash/components/boca/babelorca/tachyon_response.h"
+
+#include <memory>
+#include <string>
+
+#include "net/base/net_errors.h"
+#include "net/http/http_status_code.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace ash::babelorca {
+namespace {
+
+struct TachyonResponseTestCase {
+  std::string test_name;
+  int net_error;
+  std::optional<int> http_status_code;
+  std::string response_body;
+  TachyonResponse::Status expected_status;
+};
+
+using TachyonResponseTest = testing::TestWithParam<TachyonResponseTestCase>;
+
+TEST(TachyonResponseTest, InternalErrorStatus) {
+  TachyonResponse response(TachyonResponse::Status::kInternalError);
+  EXPECT_FALSE(response.ok());
+  EXPECT_EQ(response.status(), TachyonResponse::Status::kInternalError);
+  EXPECT_THAT(response.error_message(), testing::IsEmpty());
+  EXPECT_THAT(response.response_body(), testing::IsEmpty());
+}
+
+TEST(TachyonResponseTest, OkRpcCode) {
+  TachyonResponse response(/*rpc_code=*/0);
+  EXPECT_TRUE(response.ok());
+  EXPECT_EQ(response.status(), TachyonResponse::Status::kOk);
+  EXPECT_THAT(response.error_message(), testing::IsEmpty());
+  EXPECT_THAT(response.response_body(), testing::IsEmpty());
+}
+
+TEST(TachyonResponseTest, AuthErrorRpcCode) {
+  constexpr char kAuthErrorMessage[] = "auth error";
+  TachyonResponse response(/*rpc_code=*/16,
+                           /*error_message=*/kAuthErrorMessage);
+  EXPECT_FALSE(response.ok());
+  EXPECT_EQ(response.status(), TachyonResponse::Status::kAuthError);
+  EXPECT_THAT(response.error_message(), testing::StrEq(kAuthErrorMessage));
+  EXPECT_THAT(response.response_body(), testing::IsEmpty());
+}
+
+TEST(TachyonResponseTest, OtherRpcCode) {
+  constexpr char kResourcedMessage[] = "resource exhausted";
+  TachyonResponse response(/*rpc_code=*/8, /*error_message=*/kResourcedMessage);
+  EXPECT_FALSE(response.ok());
+  EXPECT_EQ(response.status(), TachyonResponse::Status::kHttpError);
+  EXPECT_THAT(response.error_message(), testing::StrEq(kResourcedMessage));
+  EXPECT_THAT(response.response_body(), testing::IsEmpty());
+}
+
+TEST_P(TachyonResponseTest, HttpHeader) {
+  TachyonResponse response(
+      GetParam().net_error, GetParam().http_status_code,
+      std::make_unique<std::string>(GetParam().response_body));
+  EXPECT_EQ(response.status(), GetParam().expected_status);
+  EXPECT_THAT(response.response_body(),
+              testing::StrEq(GetParam().response_body));
+  EXPECT_THAT(response.error_message(), testing::IsEmpty());
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    TachyonResponseTestSuiteInstantiation,
+    TachyonResponseTest,
+    testing::ValuesIn<TachyonResponseTestCase>({
+        {"NetError", net::ERR_TOO_MANY_RETRIES, std::nullopt, "",
+         TachyonResponse::Status::kNetworkError},
+        {"NoHttpStatus", net::OK, std::nullopt, "",
+         TachyonResponse::Status::kInternalError},
+        {"AuthError", net::ERR_HTTP_RESPONSE_CODE_FAILURE,
+         net::HttpStatusCode::HTTP_UNAUTHORIZED, "",
+         TachyonResponse::Status::kAuthError},
+        {"OtherHttpError", net::ERR_HTTP_RESPONSE_CODE_FAILURE,
+         net::HttpStatusCode::HTTP_PRECONDITION_FAILED, "",
+         TachyonResponse::Status::kHttpError},
+        {"Success", net::ERR_HTTP_RESPONSE_CODE_FAILURE,
+         net::HttpStatusCode::HTTP_OK, "response",
+         TachyonResponse::Status::kOk},
+    }),
+    [](const testing::TestParamInfo<TachyonResponseTest::ParamType>& info) {
+      return info.param.test_name;
+    });
+
+}  // namespace
+}  // namespace ash::babelorca
diff --git a/chromeos/ash/components/boca/babelorca/transcript_sender.cc b/chromeos/ash/components/boca/babelorca/transcript_sender.cc
index 3e4ba0b..532278f 100644
--- a/chromeos/ash/components/boca/babelorca/transcript_sender.cc
+++ b/chromeos/ash/components/boca/babelorca/transcript_sender.cc
@@ -28,7 +28,7 @@
 #include "chromeos/ash/components/boca/babelorca/tachyon_authed_client.h"
 #include "chromeos/ash/components/boca/babelorca/tachyon_constants.h"
 #include "chromeos/ash/components/boca/babelorca/tachyon_request_data_provider.h"
-#include "chromeos/ash/components/boca/babelorca/tachyon_request_error.h"
+#include "chromeos/ash/components/boca/babelorca/tachyon_response.h"
 #include "chromeos/ash/components/boca/babelorca/tachyon_utils.h"
 #include "media/mojo/mojom/speech_recognition_result.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
@@ -203,10 +203,9 @@
       std::move(request_string));
 }
 
-void TranscriptSender::OnSendResponse(
-    base::expected<std::string, TachyonRequestError> response) {
+void TranscriptSender::OnSendResponse(TachyonResponse response) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (response.has_value()) {
+  if (response.ok()) {
     errors_num_ = 0;
     return;
   }
diff --git a/chromeos/ash/components/boca/babelorca/transcript_sender.h b/chromeos/ash/components/boca/babelorca/transcript_sender.h
index d34a310..f97ee73 100644
--- a/chromeos/ash/components/boca/babelorca/transcript_sender.h
+++ b/chromeos/ash/components/boca/babelorca/transcript_sender.h
@@ -18,8 +18,6 @@
 #include "base/sequence_checker.h"
 #include "base/thread_annotations.h"
 #include "base/time/time.h"
-#include "base/types/expected.h"
-#include "chromeos/ash/components/boca/babelorca/tachyon_request_error.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 
 namespace media {
@@ -35,6 +33,7 @@
 class BabelOrcaMessage;
 class TachyonAuthedClient;
 class TachyonRequestDataProvider;
+class TachyonResponse;
 
 // Class to send transcriptions.
 class TranscriptSender {
@@ -74,8 +73,7 @@
 
   void Send(int max_retries, std::string message);
 
-  void OnSendResponse(
-      base::expected<std::string, TachyonRequestError> response);
+  void OnSendResponse(TachyonResponse response);
 
   SEQUENCE_CHECKER(sequence_checker_);
 
diff --git a/chromeos/ash/components/boca/babelorca/transcript_sender_unittest.cc b/chromeos/ash/components/boca/babelorca/transcript_sender_unittest.cc
index a87f7e0..0969b1e 100644
--- a/chromeos/ash/components/boca/babelorca/transcript_sender_unittest.cc
+++ b/chromeos/ash/components/boca/babelorca/transcript_sender_unittest.cc
@@ -4,12 +4,13 @@
 
 #include "chromeos/ash/components/boca/babelorca/transcript_sender.h"
 
+#include <optional>
 #include <string>
+#include <utility>
 
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
 #include "base/time/time.h"
-#include "base/types/expected.h"
 #include "chromeos/ash/components/boca/babelorca/fakes/fake_tachyon_authed_client.h"
 #include "chromeos/ash/components/boca/babelorca/fakes/fake_tachyon_client.h"
 #include "chromeos/ash/components/boca/babelorca/fakes/fake_tachyon_request_data_provider.h"
@@ -18,8 +19,10 @@
 #include "chromeos/ash/components/boca/babelorca/proto/tachyon_enums.pb.h"
 #include "chromeos/ash/components/boca/babelorca/request_data_wrapper.h"
 #include "chromeos/ash/components/boca/babelorca/tachyon_constants.h"
-#include "chromeos/ash/components/boca/babelorca/tachyon_request_error.h"
+#include "chromeos/ash/components/boca/babelorca/tachyon_response.h"
 #include "media/mojo/mojom/speech_recognition_result.h"
+#include "net/base/net_errors.h"
+#include "net/http/http_status_code.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -72,8 +75,9 @@
                                             /*is_final=*/false);
   EXPECT_TRUE(sender.SendTranscriptionUpdate(transcript, kLanguage));
   authed_client.WaitForRequest();
-  authed_client.ExecuteResponseCallback(
-      InboxSendResponse().SerializeAsString());
+  authed_client.ExecuteResponseCallback(TachyonResponse(
+      net::OK, net::HttpStatusCode::HTTP_OK,
+      std::make_unique<std::string>(InboxSendResponse().SerializeAsString())));
 
   EXPECT_FALSE(failure_future.IsReady());
   InboxSendRequest sent_request;
@@ -135,16 +139,18 @@
   EXPECT_TRUE(sender.SendTranscriptionUpdate(transcript1, kLanguage));
   authed_client.WaitForRequest();
   request_string1 = authed_client.GetRequestString();
-  authed_client.ExecuteResponseCallback(
-      InboxSendResponse().SerializeAsString());
+  authed_client.ExecuteResponseCallback(TachyonResponse(
+      net::OK, net::HttpStatusCode::HTTP_OK,
+      std::make_unique<std::string>(InboxSendResponse().SerializeAsString())));
 
   media::SpeechRecognitionResult transcript2(kTranscriptText,
                                              /*is_final=*/false);
   EXPECT_TRUE(sender.SendTranscriptionUpdate(transcript2, kLanguage));
   authed_client.WaitForRequest();
   request_string2 = authed_client.GetRequestString();
-  authed_client.ExecuteResponseCallback(
-      InboxSendResponse().SerializeAsString());
+  authed_client.ExecuteResponseCallback(TachyonResponse(
+      net::OK, net::HttpStatusCode::HTTP_OK,
+      std::make_unique<std::string>(InboxSendResponse().SerializeAsString())));
 
   EXPECT_FALSE(failure_future.IsReady());
   InboxSendRequest sent_request1;
@@ -194,14 +200,14 @@
   EXPECT_TRUE(sender.SendTranscriptionUpdate(transcript1, kLanguage));
   authed_client.WaitForRequest();
   authed_client.ExecuteResponseCallback(
-      base::unexpected(TachyonRequestError::kHttpError));
+      TachyonResponse(TachyonResponse::Status::kHttpError));
 
   media::SpeechRecognitionResult transcript2(kTranscriptText,
                                              /*is_final=*/false);
   EXPECT_TRUE(sender.SendTranscriptionUpdate(transcript2, kLanguage));
   authed_client.WaitForRequest();
   authed_client.ExecuteResponseCallback(
-      base::unexpected(TachyonRequestError::kHttpError));
+      TachyonResponse(TachyonResponse::Status::kHttpError));
 
   media::SpeechRecognitionResult transcript3(kTranscriptText,
                                              /*is_final=*/false);
@@ -230,15 +236,16 @@
   EXPECT_TRUE(sender.SendTranscriptionUpdate(transcript1, kLanguage));
   authed_client.WaitForRequest();
   authed_client.ExecuteResponseCallback(
-      base::unexpected(TachyonRequestError::kHttpError));
+      TachyonResponse(TachyonResponse::Status::kHttpError));
 
   // Successful request, should reset error count.
   media::SpeechRecognitionResult transcript2(kTranscriptText,
                                              /*is_final=*/false);
   EXPECT_TRUE(sender.SendTranscriptionUpdate(transcript2, kLanguage));
   authed_client.WaitForRequest();
-  authed_client.ExecuteResponseCallback(
-      InboxSendResponse().SerializeAsString());
+  authed_client.ExecuteResponseCallback(TachyonResponse(
+      net::OK, net::HttpStatusCode::HTTP_OK,
+      std::make_unique<std::string>(InboxSendResponse().SerializeAsString())));
 
   // Failed request, should not trigger failure callback since the error count
   // was reset.
@@ -247,7 +254,7 @@
   EXPECT_TRUE(sender.SendTranscriptionUpdate(transcript3, kLanguage));
   authed_client.WaitForRequest();
   authed_client.ExecuteResponseCallback(
-      base::unexpected(TachyonRequestError::kHttpError));
+      TachyonResponse(TachyonResponse::Status::kHttpError));
 
   EXPECT_FALSE(failure_future.IsReady());
 }
@@ -288,14 +295,14 @@
       authed_client.TakeResponseCallback();
 
   std::move(response_cb1)
-      .Run(base::unexpected(TachyonRequestError::kHttpError));
+      .Run(TachyonResponse(TachyonResponse::Status::kHttpError));
   std::move(response_cb2)
-      .Run(base::unexpected(TachyonRequestError::kHttpError));
+      .Run(TachyonResponse(TachyonResponse::Status::kHttpError));
 
   EXPECT_TRUE(failure_future.IsReady());
 
   std::move(response_cb3)
-      .Run(base::unexpected(TachyonRequestError::kHttpError));
+      .Run(TachyonResponse(TachyonResponse::Status::kHttpError));
 
   media::SpeechRecognitionResult transcript4(kTranscriptText,
                                              /*is_final=*/false);
diff --git a/chromeos/profiles/arm.afdo.newest.txt b/chromeos/profiles/arm.afdo.newest.txt
index 7c19afd68..efe8bc0 100644
--- a/chromeos/profiles/arm.afdo.newest.txt
+++ b/chromeos/profiles/arm.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-arm-none-131-6723.9-1727662744-benchmark-131.0.6749.0-r1-redacted.afdo.xz
+chromeos-chrome-arm-none-131-6723.9-1727662744-benchmark-131.0.6750.0-r1-redacted.afdo.xz
diff --git a/clank b/clank
index 59c00202..4120c4d 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 59c00202c7c9270d760bf9a57ffd242ef6b0f271
+Subproject commit 4120c4d811f4c534ae4be631037163de6f797935
diff --git a/components/OWNERS b/components/OWNERS
index e0ba2bb..6fa527a 100644
--- a/components/OWNERS
+++ b/components/OWNERS
@@ -48,8 +48,8 @@
 per-file privacy_sandbox_strings.grd=file://components/privacy_sandbox/OWNERS
 per-file reset_password_strings.grdp=file://components/safe_browsing/OWNERS
 per-file saved_tab_groups_strings.grdp=file://components/saved_tab_groups/OWNERS
-per-file search_engine_choice_strings.grdp=file://components/search_engines/search_engine_choice/OWNERS
-per-file search_engine_descriptions_strings.grd=file://components/search_engines/search_engine_choice/OWNERS
+per-file search_engine_choice_strings.grdp=file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
+per-file search_engine_descriptions_strings.grd=file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
 per-file security_interstitials_strings.grdp=file://components/security_interstitials/OWNERS
 per-file send_tab_to_self_strings.grdp=file://components/send_tab_to_self/OWNERS
 per-file site_settings_strings.grdp=file://components/browser_ui/site_settings/OWNERS
diff --git a/components/autofill/android/java/src/org/chromium/components/autofill/payments/AutofillSaveIbanUiInfo.java b/components/autofill/android/java/src/org/chromium/components/autofill/payments/AutofillSaveIbanUiInfo.java
index e11ead6..1ab20afa 100644
--- a/components/autofill/android/java/src/org/chromium/components/autofill/payments/AutofillSaveIbanUiInfo.java
+++ b/components/autofill/android/java/src/org/chromium/components/autofill/payments/AutofillSaveIbanUiInfo.java
@@ -17,11 +17,11 @@
 import java.util.List;
 import java.util.Objects;
 
-@JNINamespace("autofill")
 /**
  * The android version of the C++ AutofillSaveIbanUiInfo providing UI resources for the save IBAN
  * bottom sheet.
  */
+@JNINamespace("autofill")
 public class AutofillSaveIbanUiInfo {
     private final String mAcceptText;
     private final String mCancelText;
@@ -64,8 +64,6 @@
         return mTitleText;
     }
 
-    @CalledByNative
-    @VisibleForTesting
     /**
      * Construct the {@link AutofillSaveIbanUiInfo} given all the members. This constructor is used
      * for native binding purposes.
@@ -80,6 +78,8 @@
      *     {@code 0} for local save.
      * @param titleText A bottom sheet title UI string. This value must not be {@code null}.
      */
+    @CalledByNative
+    @VisibleForTesting
     /* package */ AutofillSaveIbanUiInfo(
             @JniType("std::u16string") String acceptText,
             @JniType("std::u16string") String cancelText,
diff --git a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_filling_engine_impl.cc b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_filling_engine_impl.cc
index a1ba10c..9e01583 100644
--- a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_filling_engine_impl.cc
+++ b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_filling_engine_impl.cc
@@ -154,6 +154,10 @@
         // in the suggestion as the main text.
         select_option_text = predicted_select_option_it->text;
       }
+      // Skip predictions for non-empty text fields.
+      else if (field.IsTextInputElement() && !field.value().empty()) {
+        continue;
+      }
 
       const std::u16string label =
           filled_form_field_proto.normalized_label().empty()
diff --git a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_filling_engine_impl_unittest.cc b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_filling_engine_impl_unittest.cc
index f1ee7f68..b58c00f 100644
--- a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_filling_engine_impl_unittest.cc
+++ b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_filling_engine_impl_unittest.cc
@@ -108,6 +108,7 @@
   AddFieldToResponse(response,
                      "Country - response equals selected value, not filled", "",
                      "2");
+  AddFieldToResponse(response, "Field has value, not filled", "", "value");
   optimization_guide::proto::Any any;
   any.set_type_url(response.GetTypeName());
   response.SerializeToString(any.mutable_value());
@@ -139,7 +140,8 @@
            .value = u"2",
            .form_control_type = autofill::FormControlType::kSelectOne,
            .select_options = {{.value = u"1", .text = u"France"},
-                              {.value = u"2", .text = u"Spain"}}}}};
+                              {.value = u"2", .text = u"Spain"}}},
+          {.label = u"Field has value, not filled", .value = u"value"}}};
   autofill::FormData form = autofill::test::GetFormData(form_description);
 
   optimization_guide::proto::AXTreeUpdate ax_tree;
diff --git a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager.cc b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager.cc
index e923a85..09f11c2 100644
--- a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager.cc
+++ b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager.cc
@@ -36,6 +36,8 @@
 
 namespace {
 
+constexpr int kNumberFieldsToShowInSuggestionLabel = 2;
+
 // Define `field_types_to_fill` as Autofill address types +
 // `IMPROVED_PREDICTION`.
 // TODO(crbug.com/364808228): Remove `UNKNOWN_TYPE` from `field_types_to_fill`.
@@ -213,8 +215,6 @@
   // Add a `kFillPredictionImprovements` suggestion with a separator to
   // `suggestion.children` before the field-by-field filling entries.
   {
-    // TODO(crbug.com/361434879): Add hardcoded string to an appropriate grd
-    // file.
     autofill::Suggestion fill_all_child(
         l10n_util::GetStringUTF16(
             IDS_AUTOFILL_PREDICTION_IMPROVEMENTS_FILL_ALL_MAIN_TEXT),
@@ -225,7 +225,13 @@
   }
   // Add the child suggestion for the triggering field on top.
   suggestion.children.emplace_back(CreateChildSuggestionForFilling(prediction));
-  // Then add child suggestions for all remaining, non-empty fields.
+  // Initialize as 1 because of the suggestion added above.
+  size_t n_fields_to_fill = 1;
+  // The label depends on the fields that will be filled.
+  std::u16string label =
+      l10n_util::GetStringUTF16(
+          IDS_AUTOFILL_PREDICTION_IMPROVEMENTS_FILL_LABEL_TEXT) +
+      u" " + prediction.label;
   for (const auto& [child_field_global_id, child_prediction] : (*cache_)) {
     // Only add a child suggestion if the field is not the triggering field and
     // the value to fill is not empty.
@@ -235,16 +241,34 @@
     }
     suggestion.children.emplace_back(
         CreateChildSuggestionForFilling(child_prediction));
+    ++n_fields_to_fill;
+    if (n_fields_to_fill == 2) {
+      label += l10n_util::GetStringUTF16(
+                   IDS_AUTOFILL_PREDICTION_IMPROVEMENTS_FILL_LABEL_SEPARATOR) +
+               child_prediction.label;
+    }
   }
-  if (!suggestion.children.empty()) {
-    suggestion.labels.emplace_back();
-    // TODO(crbug.com/361434879): Add hardcoded string to an appropriate grd
-    // file.
-    suggestion.labels.back().emplace_back(u"& more");
-    suggestion.children.emplace_back(autofill::SuggestionType::kSeparator);
-    suggestion.children.emplace_back(
-        CreateEditPredictionImprovementsInformation());
+
+  suggestion.children.emplace_back(autofill::SuggestionType::kSeparator);
+  suggestion.children.emplace_back(
+      CreateEditPredictionImprovementsInformation());
+
+  if (n_fields_to_fill > kNumberFieldsToShowInSuggestionLabel) {
+    // When more than `kNumberFieldsToShowInSuggestionLabel` are filled, include
+    // the "& More".
+    size_t number_of_more_fields_to_fill =
+        n_fields_to_fill - kNumberFieldsToShowInSuggestionLabel;
+    const std::u16string more_fields_label_substr =
+        number_of_more_fields_to_fill > 1
+            ? l10n_util::GetStringFUTF16(
+                  IDS_AUTOFILL_PREDICTION_IMPROVEMENTS_FILL_SUGGESTION_AND_N_MORE_FIELDS,
+                  base::NumberToString16(number_of_more_fields_to_fill))
+            : l10n_util::GetStringUTF16(
+                  IDS_AUTOFILL_PREDICTION_IMPROVEMENTS_FILL_SUGGESTION_AND_ONE_MORE_FIELD);
+    label = base::StrCat({label, u" ", more_fields_label_substr});
   }
+  suggestion.labels.emplace_back();
+  suggestion.labels.back().emplace_back(label);
 
   // TODO(crbug.com/365512352): Figure out how to handle Undo suggestion.
   std::vector<autofill::Suggestion> filling_suggestions = {suggestion};
diff --git a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager_unittest.cc b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager_unittest.cc
index 4d18f16..3c291858 100644
--- a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager_unittest.cc
+++ b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager_unittest.cc
@@ -509,6 +509,81 @@
           HasType(SuggestionType::kPredictionImprovementsFeedback)));
 }
 
+// Tests that the filling suggestion label is correct when only one field can be
+// filled.
+TEST_F(
+    AutofillPredictionImprovementsManagerTest,
+    FillingSuggestion_OneFieldCanBeFilled_CreateLabelThatContainsOnlyOneFieldData) {
+  autofill::test::FormDescription form_description = {
+      .fields = {{.role = autofill::NAME_FIRST,
+                  .heuristic_type = autofill::NAME_FIRST}}};
+  autofill::FormData form = autofill::test::GetFormData(form_description);
+  test_api(*manager_).SetCache(PredictionsByGlobalId{
+      {form.fields()[0].global_id(), {u"Jane", u"First name"}}});
+
+  std::vector<Suggestion> suggestions_to_show;
+  EXPECT_TRUE(
+      manager_->MaybeUpdateSuggestions(suggestions_to_show, form.fields()[0],
+                                       /*should_add_trigger_suggestion=*/true));
+  EXPECT_EQ(suggestions_to_show[0].labels[0][0].value, u"Fill First name");
+}
+
+// Tests that the filling suggestion label is correct when 3 fields can be
+// filled.
+TEST_F(AutofillPredictionImprovementsManagerTest,
+       FillingSuggestion_ThreeFieldsCanBeFilled_UserSingularAndMoreString) {
+  autofill::test::FormDescription form_description = {
+      .fields = {{.role = autofill::NAME_FIRST,
+                  .heuristic_type = autofill::NAME_FIRST},
+                 {.role = autofill::ADDRESS_HOME_STREET_NAME,
+                  .heuristic_type = autofill::ADDRESS_HOME_STREET_NAME},
+                 {.role = autofill::ADDRESS_HOME_STATE,
+                  .heuristic_type = autofill::ADDRESS_HOME_STATE,
+                  .form_control_type = autofill::FormControlType::kSelectOne}}};
+  autofill::FormData form = autofill::test::GetFormData(form_description);
+  test_api(*manager_).SetCache(PredictionsByGlobalId{
+      {form.fields()[0].global_id(), {u"Jane", u"First name"}},
+      {form.fields()[1].global_id(), {u"Country roads str", u"Street name"}},
+      {form.fields()[2].global_id(), {u"33", u"state", u"West Virginia"}}});
+
+  std::vector<Suggestion> suggestions_to_show;
+  EXPECT_TRUE(
+      manager_->MaybeUpdateSuggestions(suggestions_to_show, form.fields()[0],
+                                       /*should_add_trigger_suggestion=*/true));
+  EXPECT_EQ(suggestions_to_show[0].labels[0][0].value,
+            u"Fill First name, Street name & 1 more field");
+}
+
+// Tests that the filling suggestion label is correct when more than 3 fields
+// can be filled.
+TEST_F(
+    AutofillPredictionImprovementsManagerTest,
+    FillingSuggestion_MoreThanThreeFieldsCanBeFilled_UserPluralAndMoreString) {
+  autofill::test::FormDescription form_description = {
+      .fields = {
+          {.role = autofill::NAME_FIRST,
+           .heuristic_type = autofill::NAME_FIRST},
+          {.role = autofill::NAME_LAST, .heuristic_type = autofill::NAME_LAST},
+          {.role = autofill::ADDRESS_HOME_STREET_NAME,
+           .heuristic_type = autofill::ADDRESS_HOME_STREET_NAME},
+          {.role = autofill::ADDRESS_HOME_STATE,
+           .heuristic_type = autofill::ADDRESS_HOME_STATE,
+           .form_control_type = autofill::FormControlType::kSelectOne}}};
+  autofill::FormData form = autofill::test::GetFormData(form_description);
+  test_api(*manager_).SetCache(PredictionsByGlobalId{
+      {form.fields()[0].global_id(), {u"Jane", u"First name"}},
+      {form.fields()[1].global_id(), {u"Doe", u"Last name"}},
+      {form.fields()[2].global_id(), {u"Country roads str", u"Street name"}},
+      {form.fields()[3].global_id(), {u"33", u"state", u"West Virginia"}}});
+
+  std::vector<Suggestion> suggestions_to_show;
+  EXPECT_TRUE(
+      manager_->MaybeUpdateSuggestions(suggestions_to_show, form.fields()[0],
+                                       /*should_add_trigger_suggestion=*/true));
+  EXPECT_EQ(suggestions_to_show[0].labels[0][0].value,
+            u"Fill First name, Last name & 2 more fields");
+}
+
 class AutofillPredictionImprovementsManagerUserFeedbackTest
     : public AutofillPredictionImprovementsManagerTest,
       public testing::WithParamInterface<
diff --git a/components/autofill_prediction_improvements_strings.grdp b/components/autofill_prediction_improvements_strings.grdp
index 7e5eae2..05e52fe 100644
--- a/components/autofill_prediction_improvements_strings.grdp
+++ b/components/autofill_prediction_improvements_strings.grdp
@@ -9,8 +9,17 @@
   <message name="IDS_AUTOFILL_PREDICTION_IMPROVEMENTS_FILL_ALL_MAIN_TEXT" desc="Suggestion shown when the user focuses a prediction improvements field." translateable="false">
     Fill all
   </message>
-  <message name="IDS_AUTOFILL_PREDICTION_IMPROVEMENTS_FILL_SUGGESTION_AND_MORE" desc="Text displayed as label to indicate more fields will be filled." translateable="false">
-    &amp; more
+  <message name="IDS_AUTOFILL_PREDICTION_IMPROVEMENTS_FILL_LABEL_TEXT" desc="Text shown as a label when the user sees a prediction improvements suggestion." translateable="false">
+    Fill
+  </message>
+  <message name="IDS_AUTOFILL_PREDICTION_IMPROVEMENTS_FILL_LABEL_SEPARATOR" desc="The separator character used in the prediction improvements label." translateable="false">
+    , '''
+  </message>
+  <message name="IDS_AUTOFILL_PREDICTION_IMPROVEMENTS_FILL_SUGGESTION_AND_ONE_MORE_FIELD" desc="Text displayed as label to indicate more fields will be filled." translateable="false">
+    &amp; 1 more field
+  </message>
+  <message name="IDS_AUTOFILL_PREDICTION_IMPROVEMENTS_FILL_SUGGESTION_AND_N_MORE_FIELDS" desc="Text displayed as label to indicate more fields will be filled." translateable="false">
+    &amp; <ph name="N_FIELDS">$1<ex>4</ex></ph> more fields
   </message>
 
   <!-- Save prompt -->
diff --git a/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaNotificationInfoTest.java b/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaNotificationInfoTest.java
index 70ba875a..bd7009d3 100644
--- a/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaNotificationInfoTest.java
+++ b/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaNotificationInfoTest.java
@@ -90,7 +90,6 @@
         assertNotNull(info);
 
         // Make sure hashCode() doesn't crash.
-        int hashValue = info.hashCode();
-        assertNotNull(hashValue);
+        info.hashCode();
     }
 }
diff --git a/components/browser_ui/widget/android/java/res/layout/title_and_description_layout.xml b/components/browser_ui/widget/android/java/res/layout/title_and_description_layout.xml
index 0504a27..52d15a98 100644
--- a/components/browser_ui/widget/android/java/res/layout/title_and_description_layout.xml
+++ b/components/browser_ui/widget/android/java/res/layout/title_and_description_layout.xml
@@ -5,79 +5,83 @@
 found in the LICENSE file.
 -->
 
-<LinearLayout
+<androidx.constraintlayout.widget.ConstraintLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="0dp"
     android:layout_height="wrap_content"
-    android:layout_weight="1"
-    android:orientation="vertical"
-    android:layout_gravity="center_vertical" >
+    android:layout_weight="1" >
 
-    <LinearLayout
-        android:layout_width="match_parent"
+    <ImageView
+        android:id="@+id/before_title_icon"
+        android:layout_marginEnd="6dp"
+        android:layout_marginTop="4dp"
+        android:layout_marginBottom="2dp"
+        android:layout_width="16dp"
+        android:layout_height="16dp"
+        android:contentDescription="@null"
+        android:visibility="gone"
+        app:layout_constraintHorizontal_bias="0.0"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/title" />
+
+    <TextView
+        android:id="@+id/title"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_gravity="start"
-        android:orientation="horizontal"
-        tools:ignore="UseCompoundDrawables" >
+        android:maxLines="1"
+        android:ellipsize="end"
+        android:textAppearance="@style/TextAppearance.TextLarge.Primary"
+        app:layout_constraintHorizontal_bias="0.0"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/before_title_icon"
+        app:layout_constraintEnd_toStartOf="@+id/space_anchor" />
 
-        <ImageView
-            android:id="@+id/icon"
-            android:layout_marginEnd="6dp"
-            android:layout_marginTop="4dp"
-            android:layout_marginBottom="2dp"
-            android:layout_width="16dp"
-            android:layout_height="16dp"
-            android:contentDescription="@null"
-            android:visibility="gone" />
+    <!-- Anchor to ensure the chain terminates without any elements being pushed offscreen. -->
+    <Space
+        android:id="@+id/space_anchor"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        app:layout_constraintEnd_toEndOf="parent" />
 
-        <TextView
-            android:id="@+id/title"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:maxLines="1"
-            android:ellipsize="end"
-            android:textAppearance="@style/TextAppearance.TextLarge.Primary" />
-    </LinearLayout>
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/chip_description"
-        android:layout_width="match_parent"
+    <TextView
+        android:id="@+id/description"
+        android:layout_gravity="center_vertical|start"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:orientation="horizontal">
+        android:maxLines="1"
+        android:ellipsize="end"
+        android:textAppearance="@style/TextAppearance.TextMedium.Secondary"
+        app:layout_constraintHorizontal_bias="0.0"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintTop_toBottomOf="@+id/title"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/chip" />
 
-        <TextView
-            android:id="@+id/description"
-            android:layout_gravity="center_vertical|start"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:maxLines="1"
-            android:ellipsize="end"
-            android:textAppearance="@style/TextAppearance.TextMedium.Secondary"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
-
-        <!-- An optional chip view. Used for history.TODO(b/331856225): Consider adding min_width
-             to prevent the description view from occupying the whole space. -->
-        <org.chromium.components.browser_ui.widget.chips.ChipView
-            android:id="@+id/chip"
-            android:layout_gravity="center_vertical|start"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="8dp"
-            android:visibility="gone"
-            app:layout_constrainedWidth="true"
-            app:layout_constraintBottom_toBottomOf="@+id/description"
-            app:layout_constraintStart_toEndOf="@+id/description"
-            app:layout_constraintTop_toTopOf="@+id/description"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintHorizontal_bias="0"
-            style="@style/HistoryAppChip" />
-    </androidx.constraintlayout.widget.ConstraintLayout>
+    <!-- An optional chip view. Used for history. -->
+    <org.chromium.components.browser_ui.widget.chips.ChipView
+        android:id="@+id/chip"
+        android:layout_gravity="center_vertical|start"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:visibility="gone"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintTop_toTopOf="@+id/description"
+        app:layout_constraintBottom_toBottomOf="@+id/description"
+        app:layout_constraintStart_toEndOf="@+id/description"
+        app:layout_constraintEnd_toStartOf="@+id/space_anchor"
+        style="@style/HistoryAppChip" />
 
     <FrameLayout
         android:id="@+id/custom_content_container"
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content" />
-</LinearLayout>
+        android:layout_height="wrap_content"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/description" />
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemViewBaseTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemViewBaseTest.java
index e28bdd80..89cc040b2 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemViewBaseTest.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemViewBaseTest.java
@@ -61,7 +61,7 @@
         SelectionDelegate<Integer> selectionDelegate = new SelectionDelegate<>();
         mSelectableItemViewBase.setSelectionDelegate(selectionDelegate);
 
-        Integer item = new Integer(1);
+        Integer item = 1;
         assertNull(mSelectableItemViewBase.getItem());
         mSelectableItemViewBase.setItem(item);
         assertEquals(item, mSelectableItemViewBase.getItem());
@@ -87,7 +87,7 @@
 
     @Test
     public void testSelection_NullDelegate() {
-        Integer item = new Integer(1);
+        Integer item = 1;
         assertNull(mSelectableItemViewBase.getItem());
         mSelectableItemViewBase.setItem(item);
         assertNull(mSelectableItemViewBase.getItem());
diff --git a/components/cronet/android/api/src/org/chromium/net/apihelpers/ContentTypeParametersParser.java b/components/cronet/android/api/src/org/chromium/net/apihelpers/ContentTypeParametersParser.java
index 3394c465..d3a56a9 100644
--- a/components/cronet/android/api/src/org/chromium/net/apihelpers/ContentTypeParametersParser.java
+++ b/components/cronet/android/api/src/org/chromium/net/apihelpers/ContentTypeParametersParser.java
@@ -172,7 +172,7 @@
     }
 
     private static boolean isAscii(char ch) {
-        return (char) 0 <= ch && ch <= (char) 127;
+        return ch <= 127;
     }
 
     private static boolean isWhitespace(char c) {
diff --git a/components/cronet/android/sample/javatests/src/org/chromium/cronet_sample_apk/CronetSampleTest.java b/components/cronet/android/sample/javatests/src/org/chromium/cronet_sample_apk/CronetSampleTest.java
index 8090371..1af4c5ab 100644
--- a/components/cronet/android/sample/javatests/src/org/chromium/cronet_sample_apk/CronetSampleTest.java
+++ b/components/cronet/android/sample/javatests/src/org/chromium/cronet_sample_apk/CronetSampleTest.java
@@ -18,6 +18,6 @@
     @Test
     @SmallTest
     public void testSimple() throws Exception {
-        assertThat(1).isEqualTo(1);
+        assertThat(1 + 1).isEqualTo(2);
     }
 }
diff --git a/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/Options.java b/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/Options.java
index 74c77bc..09d0176 100644
--- a/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/Options.java
+++ b/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/Options.java
@@ -14,29 +14,34 @@
 import java.util.Map;
 
 /**
- * Adding an option here will make it show up in the list of available options.
- * Each {@link Option} has the following attributes:
+ * Adding an option here will make it show up in the list of available options. Each {@link Option}
+ * has the following attributes:
+ *
  * <ul>
- *   <li>A short name which appears in bold on the options list.</li>
- *  <li>A description which provides a thorough explanation of what this option does.</li>
- *  <li>An {@link Action} which is applied on CronetEngine's Builder each time the user hits "Reset
- * Engine". </li> <li>A default value, every option must have a default value.</li>
+ *   <li>A short name which appears in bold on the options list.
+ *   <li>A description which provides a thorough explanation of what this option does.
+ *   <li>An {@link Action} which is applied on CronetEngine's Builder each time the user hits "Reset
+ *       Engine".
+ *   <li>A default value, every option must have a default value.
  * </ul>
+ *
  * <b>NOTE</b>: Each option must map to one {@link OptionsIdentifier OptionsIdentifier}. This is
  * necessary to provide custom implementation for options that does not configure the builders. See
  * {@link OptionsIdentifier#SLOW_DOWNLOAD} as an example.
  *
- * <p> To add a new option, do the following:
+ * <p>To add a new option, do the following:
+ *
  * <ol>
- *  <li> Add a new optionIdentifier {@link OptionsIdentifier} </li>
- *  <li> Inject a new Option instance into your optionIdentifier enum value. </li>
- *  <li> Implement the logic for the new option within a new {@link Action}. </li>
- *  <li> If the {@link Action} interface is not enough to satisfy the use-case. Feel free to add
- * custom logic, See {@link OptionsIdentifier#SLOW_DOWNLOAD} as an example.</li>
- *  <li> Restart the APK and verify that your option is working as intended. </li>
+ *   <li>Add a new optionIdentifier {@link OptionsIdentifier}
+ *   <li>Inject a new Option instance into your optionIdentifier enum value.
+ *   <li>Implement the logic for the new option within a new {@link Action}.
+ *   <li>If the {@link Action} interface is not enough to satisfy the use-case. Feel free to add
+ *       custom logic, See {@link OptionsIdentifier#SLOW_DOWNLOAD} as an example.
+ *   <li>Restart the APK and verify that your option is working as intended.
  * </ol>
  */
 public class Options {
+    @SuppressWarnings("ImmutableEnumChecker")
     public enum OptionsIdentifier {
         MIGRATE_SESSIONS_ON_NETWORK_CHANGE_V2(
                 new BooleanOption(
@@ -57,9 +62,9 @@
                 new BooleanOption(
                         "migrate_sessions_early_v2",
                         "Enable QUIC early session migration. This will make quic send probing"
-                                + " packets when the network is degrading, QUIC will migrate the "
-                                + "sessions to a different network even before the original network "
-                                + "has disconnected.",
+                            + " packets when the network is degrading, QUIC will migrate the"
+                            + " sessions to a different network even before the original network"
+                            + " has disconnected.",
                         new Action<Boolean>() {
                             @Override
                             @OptIn(markerClass = ConnectionMigrationOptions.Experimental.class)
@@ -72,7 +77,8 @@
         SLOW_DOWNLOAD(
                 new BooleanOption(
                         "Slow Download (10s)",
-                        "Hang the onReadCompleted for 10s before proceeding. This should simulate slow connection.",
+                        "Hang the onReadCompleted for 10s before proceeding. This should simulate"
+                                + " slow connection.",
                         new Action<>() {},
                         false));
 
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestRule.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestRule.java
index b1c75f7..240d8a3 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestRule.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestRule.java
@@ -678,6 +678,8 @@
         ExperimentalCronetEngine.Builder getCronetEngineBuilder(Context context);
     }
 
+    // Warning should go away once we can use java.util.function.Function.
+    @SuppressWarnings("ImmutableEnumChecker")
     public enum CronetImplementation {
         STATICALLY_LINKED(
                 context ->
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java
index 92bd66a..914c621 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java
@@ -1813,17 +1813,11 @@
         String url = NativeTestServer.getFileURL("/cacheable.txt");
 
         // When cache is disabled, making a request does not write to the cache.
-        checkRequestCaching(
-                cronetEngine, url, false, true
-                /** disable cache */
-                );
+        checkRequestCaching(cronetEngine, url, false, true);
         checkRequestCaching(cronetEngine, url, false);
 
         // When cache is enabled, the second request is cached.
-        checkRequestCaching(
-                cronetEngine, url, false, true
-                /** disable cache */
-                );
+        checkRequestCaching(cronetEngine, url, false, true);
         checkRequestCaching(cronetEngine, url, true);
 
         // Shut down the server, next request should have a cached response.
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java
index dc544afd..9bde7eb 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java
@@ -2875,12 +2875,12 @@
         }
     }
 
-    @Test
-    @SmallTest
     /**
      * Open many connections and cancel them right away. This test verifies all internal sockets and
      * other Closeables are properly closed. See crbug.com/726193.
      */
+    @Test
+    @SmallTest
     public void testGzipCancel() throws Exception {
         String url = NativeTestServer.getFileURL("/gzipped.html");
         for (int i = 0; i < 100; i++) {
@@ -2912,10 +2912,10 @@
         }
     }
 
+    /** Do a HEAD request and get back a 404. */
     @Test
     @SmallTest
     @RequiresMinApi(8) // JavaUrlRequest fixed in API level 8: crrev.com/499303
-    /** Do a HEAD request and get back a 404. */
     public void test404Head() throws Exception {
         TestUrlRequestCallback callback = new TestUrlRequestCallback();
         UrlRequest.Builder builder =
@@ -2997,12 +2997,12 @@
         assertThat(CronetTestUtil.nativeGetTaggedBytes(tag)).isGreaterThan(priorBytes);
     }
 
-    @Test
-    @SmallTest
     /**
      * Initiate many requests concurrently to make sure neither Cronet implementation crashes.
      * Regression test for https://crbug.com/844031.
      */
+    @Test
+    @SmallTest
     public void testManyRequests() throws Exception {
         String url = NativeTestServer.getMultiRedirectURL();
         final int numRequests = 2000;
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java b/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
index 4191b21..11e51d43 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
@@ -198,7 +198,7 @@
             // Termination shouldn't take long. Use 1 min which should be more than enough.
             mExecutorService.awaitTermination(1, TimeUnit.MINUTES);
         } catch (InterruptedException e) {
-            fail("ExecutorService is interrupted while waiting for termination");
+            throw new RuntimeException(e);
         }
         assertThat(mExecutorService.isTerminated()).isTrue();
     }
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLStreamHandlerTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLStreamHandlerTest.java
index 1fd392d..75e19256 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLStreamHandlerTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLStreamHandlerTest.java
@@ -88,6 +88,7 @@
 
     @Test
     @SmallTest
+    @SuppressWarnings("AddressSelection")
     public void testOpenConnectionWithProxy() throws Exception {
         URL url = new URL(NativeTestServer.getEchoMethodURL());
         CronetHttpURLStreamHandler streamHandler =
diff --git a/components/embedder_support/android/native_java_unittests/src/org/chromium/components/embedder_support/util/InputStreamUnittest.java b/components/embedder_support/android/native_java_unittests/src/org/chromium/components/embedder_support/util/InputStreamUnittest.java
index f1863018..1f1352cd 100644
--- a/components/embedder_support/android/native_java_unittests/src/org/chromium/components/embedder_support/util/InputStreamUnittest.java
+++ b/components/embedder_support/android/native_java_unittests/src/org/chromium/components/embedder_support/util/InputStreamUnittest.java
@@ -9,6 +9,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 
+@SuppressWarnings("InputStreamSlowMultibyteRead")
 class InputStreamUnittest {
     private InputStreamUnittest() {}
 
diff --git a/components/facilitated_payments/core/browser/facilitated_payments_manager.cc b/components/facilitated_payments/core/browser/facilitated_payments_manager.cc
index f810f95..aa71cc4 100644
--- a/components/facilitated_payments/core/browser/facilitated_payments_manager.cc
+++ b/components/facilitated_payments/core/browser/facilitated_payments_manager.cc
@@ -60,11 +60,7 @@
   ukm_source_id_ = ukm_source_id;
   trigger_source_ = TriggerSource::kCopyEvent;
   // Check whether the domain for the render_frame_host_url is allowlisted.
-  auto decision = optimization_guide_decider_->CanApplyOptimization(
-      render_frame_host_url,
-      optimization_guide::proto::PIX_MERCHANT_ORIGINS_ALLOWLIST,
-      /*optimization_metadata=*/nullptr);
-  if (decision != optimization_guide::OptimizationGuideDecision::kTrue) {
+  if (!IsMerchantAllowlisted(render_frame_host_url)) {
     // The merchant is not part of the allowlist, ignore the copy event.
     return;
   }
@@ -79,21 +75,20 @@
 
 void FacilitatedPaymentsManager::RegisterPixAllowlist() const {
   optimization_guide_decider_->RegisterOptimizationTypes(
-      {optimization_guide::proto::PIX_PAYMENT_MERCHANT_ALLOWLIST,
-       optimization_guide::proto::PIX_MERCHANT_ORIGINS_ALLOWLIST});
+      {optimization_guide::proto::PIX_MERCHANT_ORIGINS_ALLOWLIST});
 }
 
-optimization_guide::OptimizationGuideDecision
-FacilitatedPaymentsManager::GetAllowlistCheckResult(const GURL& url) const {
+bool FacilitatedPaymentsManager::IsMerchantAllowlisted(const GURL& url) const {
   // Since the optimization guide decider integration corresponding to PIX
   // merchant lists are allowlists for the question "Can this site be
   // optimized?", a match on the allowlist answers the question with "yes".
-  // Therefore, `kTrue` indicates that `url` is allowed for running PIX code
-  // detection. If the optimization type was not registered in time when we
+  // Therefore, `kTrue` indicates that `url` is allowed for detecting PIX code
+  // on copy events. If the optimization type was not registered in time when we
   // queried it, it will be `kUnknown`.
   return optimization_guide_decider_->CanApplyOptimization(
-      url, optimization_guide::proto::PIX_PAYMENT_MERCHANT_ALLOWLIST,
-      /*optimization_metadata=*/nullptr);
+             url, optimization_guide::proto::PIX_MERCHANT_ORIGINS_ALLOWLIST,
+             /*optimization_metadata=*/nullptr) ==
+         optimization_guide::OptimizationGuideDecision::kTrue;
 }
 
 void FacilitatedPaymentsManager::OnPixCodeValidated(
diff --git a/components/facilitated_payments/core/browser/facilitated_payments_manager.h b/components/facilitated_payments/core/browser/facilitated_payments_manager.h
index 7c70c47..2bbbc3e 100644
--- a/components/facilitated_payments/core/browser/facilitated_payments_manager.h
+++ b/components/facilitated_payments/core/browser/facilitated_payments_manager.h
@@ -223,8 +223,8 @@
   // 1. In the allowlist
   // 2. Not in the allowlist
   // 3. Infra for querying is not ready
-  optimization_guide::OptimizationGuideDecision GetAllowlistCheckResult(
-      const GURL& url) const;
+  // Returns true if the result is [1].
+  bool IsMerchantAllowlisted(const GURL& url) const;
 
   // Called by the utility process after validation of the `pix_code`. If the
   // utility processes has disconnected (e.g., due to a crash in the validation
diff --git a/components/facilitated_payments/core/browser/facilitated_payments_manager_unittest.cc b/components/facilitated_payments/core/browser/facilitated_payments_manager_unittest.cc
index c1e382a..dc0f365 100644
--- a/components/facilitated_payments/core/browser/facilitated_payments_manager_unittest.cc
+++ b/components/facilitated_payments/core/browser/facilitated_payments_manager_unittest.cc
@@ -242,7 +242,6 @@
 TEST_F(FacilitatedPaymentsManagerTest, RegisterPixAllowlist) {
   EXPECT_CALL(*optimization_guide_decider_,
               RegisterOptimizationTypes(testing::ElementsAre(
-                  optimization_guide::proto::PIX_PAYMENT_MERCHANT_ALLOWLIST,
                   optimization_guide::proto::PIX_MERCHANT_ORIGINS_ALLOWLIST)))
       .Times(1);
 
diff --git a/components/ip_protection/common/ip_protection_token_manager_impl.cc b/components/ip_protection/common/ip_protection_token_manager_impl.cc
index 8823367..389fadf 100644
--- a/components/ip_protection/common/ip_protection_token_manager_impl.cc
+++ b/components/ip_protection/common/ip_protection_token_manager_impl.cc
@@ -262,7 +262,9 @@
     return;
   }
 
-  VLOG(2) << "IPPATC::OnGotAuthTokens got " << tokens->size() << " tokens";
+  VLOG(2) << "IPPATC::OnGotAuthTokens got " << tokens->size()
+          << " tokens for proxy "
+          << int(proxy_layer_);
   try_get_auth_tokens_after_ = base::Time();
 
   RemoveExpiredTokens();
diff --git a/components/module_installer/android/junit/src/org/chromium/components/module_installer/engine/SplitCompatEngineTest.java b/components/module_installer/android/junit/src/org/chromium/components/module_installer/engine/SplitCompatEngineTest.java
index d168f62..ece61a8 100644
--- a/components/module_installer/android/junit/src/org/chromium/components/module_installer/engine/SplitCompatEngineTest.java
+++ b/components/module_installer/android/junit/src/org/chromium/components/module_installer/engine/SplitCompatEngineTest.java
@@ -86,12 +86,8 @@
         // Arrange.
         String installedModule = "m1";
         String uninstalledModule = "m2";
-        Set<String> installedModules =
-                new HashSet<String>() {
-                    {
-                        add(installedModule);
-                    }
-                };
+        Set<String> installedModules = new HashSet<String>();
+        installedModules.add(installedModule);
         doReturn(installedModules).when(mManager).getInstalledModules();
 
         // Act & Assert.
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java
index d53b337..e8b4249 100644
--- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java
+++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java
@@ -509,6 +509,7 @@
     }
 
     @Override
+    @SuppressWarnings("LiteProtoToString")
     public String toString() {
         List<String> pieces =
                 Arrays.asList(
diff --git a/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameMediatorTest.java b/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameMediatorTest.java
index 76cc7d0..14543ea 100644
--- a/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameMediatorTest.java
+++ b/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameMediatorTest.java
@@ -341,9 +341,7 @@
         // we should have only one column.
         Bitmap[][] bitmapMatrix = mModel.get(PlayerFrameProperties.BITMAP_MATRIX);
         Assert.assertTrue(Arrays.deepEquals(bitmapMatrix, new Bitmap[4][1]));
-        Assert.assertEquals(
-                new ArrayList<Pair<View, Rect>>(),
-                mModel.get(PlayerFrameProperties.SUBFRAME_VIEWS));
+        Assert.assertEquals(List.of(), mModel.get(PlayerFrameProperties.SUBFRAME_VIEWS));
     }
 
     /**
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/JniPaymentApp.java b/components/payments/content/android/java/src/org/chromium/components/payments/JniPaymentApp.java
index 0bb4fd1..176e0bd5 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/JniPaymentApp.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/JniPaymentApp.java
@@ -235,6 +235,8 @@
         mNativeObject = 0;
     }
 
+    // TODO(crbug.com/40286193): Use an explicit destroy() method.
+    @SuppressWarnings("Finalize")
     @Override
     public void finalize() throws Throwable {
         dismissInstrument();
diff --git a/components/performance_manager/public/scenarios/loading_scenario_observer.h b/components/performance_manager/public/scenarios/loading_scenario_observer.h
index cd61194..b68eef62 100644
--- a/components/performance_manager/public/scenarios/loading_scenario_observer.h
+++ b/components/performance_manager/public/scenarios/loading_scenario_observer.h
@@ -5,7 +5,6 @@
 #ifndef COMPONENTS_PERFORMANCE_MANAGER_PUBLIC_SCENARIOS_LOADING_SCENARIO_OBSERVER_H_
 #define COMPONENTS_PERFORMANCE_MANAGER_PUBLIC_SCENARIOS_LOADING_SCENARIO_OBSERVER_H_
 
-#include "base/numerics/clamped_math.h"
 #include "base/sequence_checker.h"
 #include "components/performance_manager/public/graph/graph.h"
 #include "components/performance_manager/public/graph/page_node.h"
@@ -40,9 +39,9 @@
     LoadingScenario GetScenario() const;
 
    private:
-    base::ClampedNumeric<size_t> focused_loading_pages_;
-    base::ClampedNumeric<size_t> visible_loading_pages_;
-    base::ClampedNumeric<size_t> loading_pages_;
+    size_t focused_loading_pages_ = 0;
+    size_t visible_loading_pages_ = 0;
+    size_t loading_pages_ = 0;
   };
 
   LoadingScenarioObserver() = default;
diff --git a/components/performance_manager/scenarios/loading_scenario_observer.cc b/components/performance_manager/scenarios/loading_scenario_observer.cc
index af68b40..ea734a2 100644
--- a/components/performance_manager/scenarios/loading_scenario_observer.cc
+++ b/components/performance_manager/scenarios/loading_scenario_observer.cc
@@ -8,6 +8,7 @@
 
 #include "base/check_op.h"
 #include "base/notreached.h"
+#include "base/numerics/checked_math.h"
 #include "base/sequence_checker.h"
 #include "components/performance_manager/public/graph/graph.h"
 #include "components/performance_manager/public/graph/page_node.h"
@@ -31,6 +32,16 @@
   NOTREACHED();
 }
 
+// Increments `num` in-place, and CHECK's on overflow.
+void CheckIncrement(size_t& num) {
+  num = base::CheckAdd(num, 1).ValueOrDie();
+}
+
+// Decrements `num` in-place, and CHECK's on underflow.
+void CheckDecrement(size_t& num) {
+  num = base::CheckSub(num, 1).ValueOrDie();
+}
+
 }  // namespace
 
 LoadingScenario LoadingScenarioObserver::LoadingCounts::GetScenario() const {
@@ -49,27 +60,24 @@
 void LoadingScenarioObserver::LoadingCounts::IncrementLoadingPageCounts(
     bool visible,
     bool focused) {
-  loading_pages_++;
+  CheckIncrement(loading_pages_);
   if (visible) {
-    visible_loading_pages_++;
+    CheckIncrement(visible_loading_pages_);
   }
   if (focused) {
-    focused_loading_pages_++;
+    CheckIncrement(focused_loading_pages_);
   }
 }
 
 void LoadingScenarioObserver::LoadingCounts::DecrementLoadingPageCounts(
     bool visible,
     bool focused) {
-  CHECK_GT(loading_pages_.RawValue(), 0u);
-  loading_pages_--;
+  CheckDecrement(loading_pages_);
   if (visible) {
-    CHECK_GT(visible_loading_pages_.RawValue(), 0u);
-    visible_loading_pages_--;
+    CheckDecrement(visible_loading_pages_);
   }
   if (focused) {
-    CHECK_GT(focused_loading_pages_.RawValue(), 0u);
-    focused_loading_pages_--;
+    CheckDecrement(focused_loading_pages_);
   }
 }
 
diff --git a/components/privacy_sandbox/privacy_sandbox_features.cc b/components/privacy_sandbox/privacy_sandbox_features.cc
index fdfe248..44f7ad80 100644
--- a/components/privacy_sandbox/privacy_sandbox_features.cc
+++ b/components/privacy_sandbox/privacy_sandbox_features.cc
@@ -148,7 +148,7 @@
 
 BASE_FEATURE(kTrackingProtection3pcdUx,
              "TrackingProtection3pcdUx",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 BASE_FEATURE(kFingerprintingProtectionUserBypass,
              "FingerprintingProtectionUserBypass",
diff --git a/components/resources/OWNERS b/components/resources/OWNERS
index cff876a..ec153ba 100644
--- a/components/resources/OWNERS
+++ b/components/resources/OWNERS
@@ -13,7 +13,7 @@
 per-file offline_pages_resources.grdp=file://components/offline_pages/OWNERS
 per-file policy_resources.grdp=file://components/policy/OWNERS
 per-file printing_resources.grdp=file://printing/OWNERS
-per-file search_engine_choice_scaled_resources.grdp=file://components/search_engines/search_engine_choice/OWNERS
+per-file search_engine_choice_scaled_resources.grdp=file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
 per-file security_interstitials_dev_ui_resources.grdp=file://components/security_interstitials/OWNERS
 per-file security_interstitials_resources.grdp=file://components/security_interstitials/OWNERS
 per-file sync_driver_resources.grdp=file://components/sync/OWNERS
diff --git a/components/resources/default_100_percent/search_engine_choice/OWNERS b/components/resources/default_100_percent/search_engine_choice/OWNERS
index a8ff91d..c7aa42b 100644
--- a/components/resources/default_100_percent/search_engine_choice/OWNERS
+++ b/components/resources/default_100_percent/search_engine_choice/OWNERS
@@ -1 +1 @@
-file://components/search_engines/search_engine_choice/OWNERS
+file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
diff --git a/components/resources/default_200_percent/search_engine_choice/OWNERS b/components/resources/default_200_percent/search_engine_choice/OWNERS
index a8ff91d..c7aa42b 100644
--- a/components/resources/default_200_percent/search_engine_choice/OWNERS
+++ b/components/resources/default_200_percent/search_engine_choice/OWNERS
@@ -1 +1 @@
-file://components/search_engines/search_engine_choice/OWNERS
+file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
diff --git a/components/resources/default_300_percent/search_engine_choice/OWNERS b/components/resources/default_300_percent/search_engine_choice/OWNERS
index a8ff91d..c7aa42b 100644
--- a/components/resources/default_300_percent/search_engine_choice/OWNERS
+++ b/components/resources/default_300_percent/search_engine_choice/OWNERS
@@ -1 +1 @@
-file://components/search_engines/search_engine_choice/OWNERS
+file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
diff --git a/components/safe_browsing/android/remote_database_manager.cc b/components/safe_browsing/android/remote_database_manager.cc
index 525753a..ddb40db 100644
--- a/components/safe_browsing/android/remote_database_manager.cc
+++ b/components/safe_browsing/android/remote_database_manager.cc
@@ -55,83 +55,40 @@
 //
 class RemoteSafeBrowsingDatabaseManager::ClientRequest {
  public:
-  enum class CallbackType {
-    BROWSE_URL,
-    DOWNLOAD_URL,
-  };
-
   ClientRequest(Client* client,
-                CallbackType callback_type,
                 RemoteSafeBrowsingDatabaseManager* db_manager,
-                const std::vector<GURL>& urls);
+                const GURL& url);
+
   void OnRequestDone(SBThreatType matched_threat_type,
                      const ThreatMetadata& metadata);
-  void AddPendingCheck();
 
   // Accessors
   Client* client() const { return client_; }
-  const std::vector<GURL>& urls() const { return urls_; }
-  size_t pending_checks() const { return pending_checks_; }
+  const GURL& url() const { return url_; }
   base::WeakPtr<ClientRequest> GetWeakPtr() {
     return weak_factory_.GetWeakPtr();
   }
 
  private:
-  void CompleteCheck();
-
   raw_ptr<Client, DanglingUntriaged> client_;
-  CallbackType callback_type_;
   raw_ptr<RemoteSafeBrowsingDatabaseManager, DanglingUntriaged> db_manager_;
-  std::vector<GURL> urls_;
-  size_t pending_checks_ = 0;
-  SBThreatType most_severe_threat_type_ = SBThreatType::SB_THREAT_TYPE_SAFE;
-  ThreatMetadata most_severe_metadata_;
+  GURL url_;
   base::ElapsedTimer timer_;
   base::WeakPtrFactory<ClientRequest> weak_factory_{this};
 };
 
 RemoteSafeBrowsingDatabaseManager::ClientRequest::ClientRequest(
     Client* client,
-    CallbackType callback_type,
     RemoteSafeBrowsingDatabaseManager* db_manager,
-    const std::vector<GURL>& urls)
-    : client_(client),
-      callback_type_(callback_type),
-      db_manager_(db_manager),
-      urls_(urls) {}
+    const GURL& url)
+    : client_(client), db_manager_(db_manager), url_(url) {}
 
 void RemoteSafeBrowsingDatabaseManager::ClientRequest::OnRequestDone(
     SBThreatType matched_threat_type,
     const ThreatMetadata& metadata) {
   DVLOG(1) << "OnRequestDone took " << timer_.Elapsed().InMilliseconds()
-           << " ms for client " << client_;
-
-  if (most_severe_threat_type_ == SBThreatType::SB_THREAT_TYPE_SAFE) {
-    most_severe_threat_type_ = matched_threat_type;
-    most_severe_metadata_ = metadata;
-  }
-
-  --pending_checks_;
-
-  if (pending_checks_ == 0) {
-    CompleteCheck();
-  }
-}
-
-void RemoteSafeBrowsingDatabaseManager::ClientRequest::AddPendingCheck() {
-  ++pending_checks_;
-}
-
-void RemoteSafeBrowsingDatabaseManager::ClientRequest::CompleteCheck() {
-  switch (callback_type_) {
-    case CallbackType::BROWSE_URL:
-      client_->OnCheckBrowseUrlResult(urls_[0], most_severe_threat_type_,
-                                      most_severe_metadata_);
-      break;
-    case CallbackType::DOWNLOAD_URL:
-      client_->OnCheckDownloadUrlResult(urls_, most_severe_threat_type_);
-      break;
-  }
+           << " ms for client " << client_ << " and URL " << url_;
+  client_->OnCheckBrowseUrlResult(url_, matched_threat_type, metadata);
   UMA_HISTOGRAM_TIMES("SB2.RemoteCall.Elapsed", timer_.Elapsed());
   // CancelCheck() will delete *this.
   db_manager_->CancelCheck(client_);
@@ -155,6 +112,7 @@
   for (auto itr = current_requests_.begin(); itr != current_requests_.end();
        ++itr) {
     if ((*itr)->client() == client) {
+      DVLOG(2) << "Canceling check for URL " << (*itr)->url();
       current_requests_.erase(itr);
       return;
     }
@@ -184,14 +142,11 @@
     return true;  // Safe, continue right away.
   }
 
-  auto req = std::make_unique<ClientRequest>(
-      client, ClientRequest::CallbackType::BROWSE_URL, this,
-      std::vector<GURL>{url});
+  auto req = std::make_unique<ClientRequest>(client, this, url);
 
   DVLOG(1) << "Checking for client " << client << " and URL " << url;
-  SafeBrowsingApiHandlerBridge::ResponseCallback callback =
+  auto callback =
       base::BindOnce(&ClientRequest::OnRequestDone, req->GetWeakPtr());
-  req->AddPendingCheck();
   switch (check_type) {
     case CheckBrowseUrlType::kHashDatabase:
       SafeBrowsingApiHandlerBridge::GetInstance().StartHashDatabaseUrlCheck(
@@ -210,45 +165,8 @@
 bool RemoteSafeBrowsingDatabaseManager::CheckDownloadUrl(
     const std::vector<GURL>& url_chain,
     Client* client) {
-  DCHECK(ui_task_runner()->RunsTasksInCurrentSequence());
-
-  if (!enabled_) {
-    return true;
-  }
-
-  auto req = std::make_unique<ClientRequest>(
-      client, ClientRequest::CallbackType::DOWNLOAD_URL, this, url_chain);
-
-  // Must add pending checks in a separate loop so that synchronous responses
-  // from the SafeBrowsingApiHandlerBridge can't complete the check early.
-  for (const GURL& url : url_chain) {
-    if (!CanCheckUrl(url)) {
-      continue;
-    }
-    req->AddPendingCheck();
-  }
-
-  if (req->pending_checks() == 0) {
-    return true;
-  }
-
-  for (const GURL& url : url_chain) {
-    if (!CanCheckUrl(url)) {
-      continue;
-    }
-    DVLOG(1) << "Checking for client " << client << " and URL " << url;
-    auto callback = SafeBrowsingApiHandlerBridge::ResponseCallback(
-        base::BindOnce(&ClientRequest::OnRequestDone, req->GetWeakPtr()));
-    SafeBrowsingApiHandlerBridge::GetInstance().StartHashDatabaseUrlCheck(
-        std::move(callback), url,
-        CreateSBThreatTypeSet({SBThreatType::SB_THREAT_TYPE_URL_MALWARE,
-                               SBThreatType::SB_THREAT_TYPE_URL_UNWANTED}));
-  }
-
-  current_requests_.push_back(std::move(req));
-
-  // Defer the resource load.
-  return false;
+  NOTREACHED_IN_MIGRATION();
+  return true;
 }
 
 bool RemoteSafeBrowsingDatabaseManager::CheckExtensionIDs(
@@ -291,14 +209,11 @@
     return true;
   }
 
-  auto req = std::make_unique<ClientRequest>(
-      client, ClientRequest::CallbackType::BROWSE_URL, this,
-      std::vector<GURL>{url});
+  auto req = std::make_unique<ClientRequest>(client, this, url);
 
   DVLOG(1) << "Checking for client " << client << " and URL " << url;
-  auto callback = SafeBrowsingApiHandlerBridge::ResponseCallback(
-      base::BindOnce(&ClientRequest::OnRequestDone, req->GetWeakPtr()));
-  req->AddPendingCheck();
+  auto callback =
+      base::BindOnce(&ClientRequest::OnRequestDone, req->GetWeakPtr());
   SafeBrowsingApiHandlerBridge::GetInstance().StartHashDatabaseUrlCheck(
       std::move(callback), url,
       CreateSBThreatTypeSet({SBThreatType::SB_THREAT_TYPE_SUBRESOURCE_FILTER,
@@ -369,6 +284,7 @@
   std::vector<std::unique_ptr<ClientRequest>> to_callback(
       std::move(current_requests_));
   for (const std::unique_ptr<ClientRequest>& req : to_callback) {
+    DVLOG(1) << "Stopping: Invoking unfinished req for URL " << req->url();
     req->OnRequestDone(SBThreatType::SB_THREAT_TYPE_SAFE, ThreatMetadata());
   }
   SafeBrowsingApiHandlerBridge::GetInstance().ClearArtificialDatabase();
diff --git a/components/safe_browsing/android/remote_database_manager_unittest.cc b/components/safe_browsing/android/remote_database_manager_unittest.cc
index 846abd26..e992ea5 100644
--- a/components/safe_browsing/android/remote_database_manager_unittest.cc
+++ b/components/safe_browsing/android/remote_database_manager_unittest.cc
@@ -76,12 +76,6 @@
     is_callback_called_ = true;
   }
 
-  void OnCheckDownloadUrlResult(const std::vector<GURL>& url_chain,
-                                SBThreatType threat_type) override {
-    EXPECT_EQ(expected_threat_type_, threat_type);
-    is_callback_called_ = true;
-  }
-
   bool IsCallbackCalled() { return is_callback_called_; }
 
  private:
@@ -178,21 +172,4 @@
             db_->GetBrowseUrlThreatSource(CheckBrowseUrlType::kHashRealTime));
 }
 
-TEST_F(RemoteDatabaseManagerTest, CheckDownloadUrl) {
-  GURL url("https://example.com");
-  GURL referrer_url("https://unrelated.com");
-  url_interceptor_->SetSafeBrowsingThreatTypeForUrl(url,
-                                                    SB_THREAT_TYPE_URL_MALWARE);
-  url_interceptor_->SetSafeBrowsingThreatTypeForUrl(referrer_url,
-                                                    SB_THREAT_TYPE_SAFE);
-
-  TestClient client(db_, /*expected_url=*/url,
-                    /*expected_threat_type=*/SB_THREAT_TYPE_URL_MALWARE);
-
-  db_->CheckDownloadUrl({GURL("https://unrelated.com/"), url}, &client);
-
-  task_environment_.RunUntilIdle();
-  EXPECT_TRUE(client.IsCallbackCalled());
-}
-
 }  // namespace safe_browsing
diff --git a/components/search_engine_choice_strings_grdp/OWNERS b/components/search_engine_choice_strings_grdp/OWNERS
index a8ff91d..c7aa42b 100644
--- a/components/search_engine_choice_strings_grdp/OWNERS
+++ b/components/search_engine_choice_strings_grdp/OWNERS
@@ -1 +1 @@
-file://components/search_engines/search_engine_choice/OWNERS
+file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
diff --git a/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate.cc b/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate.cc
index 73a381c..e06cd7b 100644
--- a/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate.cc
+++ b/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate.cc
@@ -70,6 +70,9 @@
     case SourceForRefreshTokenOperation::
         kAccountReconcilor_RevokeTokensNotInCookies:
       return "AccountReconcilor::RevokeTokensNotInCookies";
+    case SourceForRefreshTokenOperation::
+        kEnterpriseForcedProfileCreation_UserDecline:
+      return "DiceWebSigninInterceptor::OnEnterpriseProfileCreationResult";
   }
 }
 
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountCapabilities.java b/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountCapabilities.java
index d710f7b..e8f6c67c 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountCapabilities.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountCapabilities.java
@@ -37,7 +37,7 @@
     }
 
     @VisibleForTesting
-    public AccountCapabilities(HashMap<String, Boolean> accountCapabilities) {
+    public AccountCapabilities(Map<String, Boolean> accountCapabilities) {
         mAccountCapabilities = accountCapabilities;
     }
 
@@ -49,7 +49,7 @@
             Map<String, Integer> capabilityResponses) {
         assert capabilityResponses.size()
                 == AccountCapabilitiesConstants.SUPPORTED_ACCOUNT_CAPABILITY_NAMES.size();
-        HashMap<String, Boolean> capabilities = new HashMap<>();
+        Map<String, Boolean> capabilities = new HashMap<>();
         for (String capabilityName :
                 AccountCapabilitiesConstants.SUPPORTED_ACCOUNT_CAPABILITY_NAMES) {
             assert capabilityResponses.containsKey(capabilityName);
diff --git a/components/signin/public/android/junit/src/org/chromium/components/signin/base/AccountCapabilitiesTest.java b/components/signin/public/android/junit/src/org/chromium/components/signin/base/AccountCapabilitiesTest.java
index 66a203b..e73a3156 100644
--- a/components/signin/public/android/junit/src/org/chromium/components/signin/base/AccountCapabilitiesTest.java
+++ b/components/signin/public/android/junit/src/org/chromium/components/signin/base/AccountCapabilitiesTest.java
@@ -27,6 +27,7 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /** Test class for {@link AccountCapabilities}. */
 @RunWith(ParameterizedRunner.class)
@@ -81,7 +82,7 @@
     }
 
     /** Populates all capabilities with the given response value. */
-    public static HashMap<String, Integer> populateCapabilitiesResponse(
+    public static Map<String, Integer> populateCapabilitiesResponse(
             @AccountManagerDelegate.CapabilityResponse int value) {
         HashMap<String, Integer> response = new HashMap<>();
         for (String capabilityName :
@@ -182,33 +183,21 @@
     @Test
     @ParameterAnnotations.UseMethodParameter(CapabilitiesTestParams.class)
     public void testCapabilityResponseException(String capabilityName) {
-        AccountCapabilities capabilities = new AccountCapabilities(new HashMap<>());
+        AccountCapabilities capabilities = new AccountCapabilities(Map.of());
         Assert.assertEquals(getCapability(capabilityName, capabilities), Tribool.UNKNOWN);
     }
 
     @Test
     @ParameterAnnotations.UseMethodParameter(CapabilitiesTestParams.class)
     public void testCapabilityResponseYes(String capabilityName) {
-        AccountCapabilities capabilities =
-                new AccountCapabilities(
-                        new HashMap<String, Boolean>() {
-                            {
-                                put(capabilityName, true);
-                            }
-                        });
+        AccountCapabilities capabilities = new AccountCapabilities(Map.of(capabilityName, true));
         Assert.assertEquals(getCapability(capabilityName, capabilities), Tribool.TRUE);
     }
 
     @Test
     @ParameterAnnotations.UseMethodParameter(CapabilitiesTestParams.class)
     public void testCapabilityResponseNo(String capabilityName) {
-        AccountCapabilities capabilities =
-                new AccountCapabilities(
-                        new HashMap<String, Boolean>() {
-                            {
-                                put(capabilityName, false);
-                            }
-                        });
+        AccountCapabilities capabilities = new AccountCapabilities(Map.of(capabilityName, false));
         Assert.assertEquals(getCapability(capabilityName, capabilities), Tribool.FALSE);
     }
 
diff --git a/components/signin/public/base/signin_metrics.h b/components/signin/public/base/signin_metrics.h
index 90216fe..a8eb61b 100644
--- a/components/signin/public/base/signin_metrics.h
+++ b/components/signin/public/base/signin_metrics.h
@@ -478,8 +478,9 @@
   kAccountReconcilor_RevokeTokensNotInCookies = 21,
   // DEPRECATED on 05/2024
   // kDiceResponseHandler_PasswordPromoSignin = 22,
+  kEnterpriseForcedProfileCreation_UserDecline = 23,
 
-  kMaxValue = kAccountReconcilor_RevokeTokensNotInCookies,
+  kMaxValue = kEnterpriseForcedProfileCreation_UserDecline,
 };
 
 // Different types of reporting. This is used as a histogram suffix.
diff --git a/components/signin/public/base/signin_switches.cc b/components/signin/public/base/signin_switches.cc
index 0550079..501f8235 100644
--- a/components/signin/public/base/signin_switches.cc
+++ b/components/signin/public/base/signin_switches.cc
@@ -179,12 +179,6 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
-// Enables showing the enterprise dialog after every signin into a managed
-// account.
-BASE_FEATURE(kShowEnterpriseDialogForAllManagedAccountsSignin,
-             "ShowEnterpriseDialogForAllManagedAccountsSignin",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 // Disables signout for enteprise managed profiles
 BASE_FEATURE(kDisallowManagedProfileSignout,
              "DisallowManagedProfileSignout",
diff --git a/components/signin/public/base/signin_switches.h b/components/signin/public/base/signin_switches.h
index fd0e55a..688b85a 100644
--- a/components/signin/public/base/signin_switches.h
+++ b/components/signin/public/base/signin_switches.h
@@ -158,9 +158,6 @@
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 COMPONENT_EXPORT(SIGNIN_SWITCHES)
-BASE_DECLARE_FEATURE(kShowEnterpriseDialogForAllManagedAccountsSignin);
-
-COMPONENT_EXPORT(SIGNIN_SWITCHES)
 BASE_DECLARE_FEATURE(kDisallowManagedProfileSignout);
 
 #if BUILDFLAG(ENABLE_MIRROR) && !BUILDFLAG(IS_IOS)
diff --git a/components/strings/OWNERS b/components/strings/OWNERS
index 44ecb6b6..09bc2d1a4 100644
--- a/components/strings/OWNERS
+++ b/components/strings/OWNERS
@@ -4,4 +4,4 @@
 # official Blink launch process.
 per-file components_locale_settings_*.xtb=file://third_party/blink/API_OWNERS
 
-per-file search_engine_descriptions_strings_*.xtb=file://components/search_engines/search_engine_choice/OWNERS
+per-file search_engine_descriptions_strings_*.xtb=file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
diff --git a/components/sync/service/backend_migrator.h b/components/sync/service/backend_migrator.h
index 897c255..af9e385 100644
--- a/components/sync/service/backend_migrator.h
+++ b/components/sync/service/backend_migrator.h
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "base/compiler_specific.h"
+#include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
diff --git a/components/sync/service/data_type_manager.h b/components/sync/service/data_type_manager.h
index 74f43a7c..ee995ce 100644
--- a/components/sync/service/data_type_manager.h
+++ b/components/sync/service/data_type_manager.h
@@ -8,19 +8,20 @@
 #include <set>
 #include <string>
 
+#include "base/functional/callback_forward.h"
 #include "base/values.h"
 #include "components/sync/base/data_type.h"
 #include "components/sync/base/sync_stop_metadata_fate.h"
 #include "components/sync/engine/configure_reason.h"
 #include "components/sync/model/sync_error.h"
-#include "components/sync/service/data_type_controller.h"
-#include "components/sync/service/data_type_status_table.h"
+#include "components/sync/model/type_entities_count.h"
 #include "components/sync/service/type_status_map_for_debugging.h"
 
 namespace syncer {
 
 struct ConfigureContext;
 class DataTypeConfigurer;
+class DataTypeController;
 struct LocalDataDescription;
 
 // This interface is for managing the start up and shut down life cycle
@@ -46,7 +47,6 @@
   struct ConfigureResult {
     ConfigureStatus status = ABORTED;
     DataTypeSet requested_types;
-    DataTypeStatusTable data_type_status_table;
   };
 
   virtual ~DataTypeManager() = default;
@@ -165,10 +165,7 @@
       base::RepeatingCallback<void(const TypeEntitiesCount&)> callback)
       const = 0;
 
-  // Exposes direct access to underlying controllers. Avoid using if possible,
-  // as DataTypeManager usually offers higher-level APIs.
-  // TODO(crbug.com/40901755): Remove this getter.
-  virtual const DataTypeController::TypeMap& GetControllerMap() const = 0;
+  virtual DataTypeController* GetControllerForTest(DataType type) = 0;
 };
 
 }  // namespace syncer
diff --git a/components/sync/service/data_type_manager_impl.cc b/components/sync/service/data_type_manager_impl.cc
index 87b9e6de..b6c705e6 100644
--- a/components/sync/service/data_type_manager_impl.cc
+++ b/components/sync/service/data_type_manager_impl.cc
@@ -473,6 +473,11 @@
   }
 }
 
+DataTypeController* DataTypeManagerImpl::GetControllerForTest(DataType type) {
+  CHECK(base::Contains(controllers_, type));
+  return controllers_.at(type).get();
+}
+
 // static
 DataTypeSet DataTypeManagerImpl::GetDataTypesInState(
     DataTypeConfigState state,
@@ -885,8 +890,7 @@
   base::TimeDelta configure_time = base::Time::Now() - last_restart_time_;
 
   ConfigureResult result = {.status = status,
-                            .requested_types = preferred_types_,
-                            .data_type_status_table = data_type_status_table_};
+                            .requested_types = preferred_types_};
 
   const std::string prefix_uma =
       (last_requested_context_.reason == CONFIGURE_REASON_NEW_CLIENT)
@@ -1023,11 +1027,6 @@
   }
 }
 
-const DataTypeController::TypeMap& DataTypeManagerImpl::GetControllerMap()
-    const {
-  return controllers_;
-}
-
 void DataTypeManagerImpl::TriggerLocalDataMigration(DataTypeSet types) {
   types.RetainAll(GetDataTypesWithLocalDataBatchUploader());
   // Only retain types that are not only preferred but also active, that is,
diff --git a/components/sync/service/data_type_manager_impl.h b/components/sync/service/data_type_manager_impl.h
index 63b9924..907a37a5 100644
--- a/components/sync/service/data_type_manager_impl.h
+++ b/components/sync/service/data_type_manager_impl.h
@@ -15,6 +15,7 @@
 #include "components/sync/service/configure_context.h"
 #include "components/sync/service/data_type_controller.h"
 #include "components/sync/service/data_type_manager.h"
+#include "components/sync/service/data_type_status_table.h"
 #include "components/sync/service/model_load_manager.h"
 
 namespace syncer {
@@ -71,7 +72,7 @@
   void GetEntityCountsForDebugging(
       base::RepeatingCallback<void(const TypeEntitiesCount&)> callback)
       const override;
-  const DataTypeController::TypeMap& GetControllerMap() const override;
+  DataTypeController* GetControllerForTest(DataType type) override;
 
   // `ModelLoadManagerDelegate` implementation.
   void OnAllDataTypesReadyForConfigure() override;
diff --git a/components/sync/service/data_type_manager_impl_unittest.cc b/components/sync/service/data_type_manager_impl_unittest.cc
index 898e024..127d33a 100644
--- a/components/sync/service/data_type_manager_impl_unittest.cc
+++ b/components/sync/service/data_type_manager_impl_unittest.cc
@@ -62,20 +62,13 @@
   MOCK_METHOD(void, OnConfigureStart, (), (override));
 };
 
-MATCHER_P(ConfigureSucceededWithFailedTypes, error_map, "") {
+MATCHER(ConfigureSucceeded, "") {
   if (arg.status != DataTypeManager::OK) {
     *result_listener << "Status not OK: "
                      << DataTypeManager::ConfigureStatusToString(arg.status);
     return false;
   }
-  return testing::ExplainMatchResult(
-      error_map, arg.data_type_status_table.GetAllErrors(), result_listener);
-}
-
-MATCHER(ConfigureSucceeded, "") {
-  return testing::ExplainMatchResult(
-      ConfigureSucceededWithFailedTypes(testing::IsEmpty()), arg,
-      result_listener);
+  return true;
 }
 
 MATCHER(ConfigureAborted, "") {
@@ -261,11 +254,8 @@
   // been previously added via InitDataTypeManager().
   FakeDataTypeController* GetController(DataType data_type) const {
     CHECK(dtm_);
-    auto it = dtm_->GetControllerMap().find(data_type);
-    if (it == dtm_->GetControllerMap().end()) {
-      return nullptr;
-    }
-    return static_cast<FakeDataTypeController*>(it->second.get());
+    return static_cast<FakeDataTypeController*>(
+        dtm_->GetControllerForTest(data_type));
   }
 
   // Gets the batch uploader for the given type, which should have
@@ -469,12 +459,13 @@
 
   // Step 4.
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(PASSWORDS, IsCryptoError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
   Configure({PASSWORDS});
   EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
   EXPECT_EQ(DataTypeSet(), FinishDownload());  // Control types.
   EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+  EXPECT_FALSE(dtm_->GetActiveDataTypes().Has(PASSWORDS));
+  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(PASSWORDS)->state());
 
   // Step 5.
   dtm_->Stop(SyncStopMetadataFate::KEEP_METADATA);
@@ -981,8 +972,7 @@
   // failure.
   testing::InSequence seq;
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(BOOKMARKS, IsDataTypeError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   // Initially only PRIORITY_PREFERENCES is configured.
   Configure({BOOKMARKS, PRIORITY_PREFERENCES});
@@ -1040,13 +1030,13 @@
   // Bookmarks is never started due to failing preconditions.
   testing::InSequence seq;
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(BOOKMARKS, IsUnreadyError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   Configure({BOOKMARKS});
   EXPECT_EQ(DataTypeSet(), FinishDownload());
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
   EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+  EXPECT_FALSE(dtm_->GetActiveDataTypes().Has(BOOKMARKS));
+  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
   EXPECT_EQ(0U, configurer_.connected_types().size());
 
   // Bookmarks should start normally now.
@@ -1079,14 +1069,14 @@
   // Bookmarks is never started due to failing preconditions.
   testing::InSequence seq;
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(BOOKMARKS, IsPolicyError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   Configure({BOOKMARKS});
   EXPECT_EQ(DataTypeSet(), FinishDownload());
 
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
   EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+  EXPECT_FALSE(dtm_->GetActiveDataTypes().Has(BOOKMARKS));
+  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
   EXPECT_EQ(0U, configurer_.connected_types().size());
 
   EXPECT_EQ(1, GetController(BOOKMARKS)->model()->clear_metadata_count());
@@ -1102,8 +1092,7 @@
   // Bookmarks is never started due to failing preconditions.
   testing::InSequence seq;
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(BOOKMARKS, IsUnreadyError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   Configure({BOOKMARKS});
   // Second Configure sets a flag to perform reconfiguration after the first one
@@ -1116,8 +1105,9 @@
   // Reconfiguration should update unready errors. Bookmarks shouldn't start.
   EXPECT_EQ(DataTypeSet(), FinishDownload());
   EXPECT_EQ(DataTypeSet(), FinishDownload());  // regular types
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
   EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+  EXPECT_FALSE(dtm_->GetActiveDataTypes().Has(BOOKMARKS));
+  EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
   EXPECT_EQ(0U, configurer_.connected_types().size());
 }
 
@@ -1129,13 +1119,13 @@
   // Bookmarks is never started due to failing preconditions.
   testing::InSequence seq;
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(BOOKMARKS, IsUnreadyError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   Configure({BOOKMARKS});
   EXPECT_EQ(DataTypeSet(), FinishDownload());
-  ASSERT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
   ASSERT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+  ASSERT_FALSE(dtm_->GetActiveDataTypes().Has(BOOKMARKS));
+  ASSERT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
   ASSERT_EQ(0U, configurer_.connected_types().size());
 
   // Bookmarks should start normally now.
@@ -1152,6 +1142,8 @@
   EXPECT_EQ(AddControlTypesTo({BOOKMARKS}), FinishDownload());
 
   EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+  EXPECT_TRUE(dtm_->GetActiveDataTypes().Has(BOOKMARKS));
+  EXPECT_EQ(DataTypeController::RUNNING, GetController(BOOKMARKS)->state());
   EXPECT_EQ(1U, configurer_.connected_types().size());
 }
 
@@ -1166,17 +1158,16 @@
   // Both types are never started due to failing preconditions.
   testing::InSequence seq;
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_,
-              OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                  UnorderedElementsAre(Pair(BOOKMARKS, IsUnreadyError()),
-                                       Pair(PREFERENCES, IsUnreadyError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   Configure({BOOKMARKS, PREFERENCES});
   EXPECT_EQ(DataTypeSet(), FinishDownload());
+  ASSERT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+  ASSERT_FALSE(dtm_->GetActiveDataTypes().Has(BOOKMARKS));
+  ASSERT_FALSE(dtm_->GetActiveDataTypes().Has(PREFERENCES));
   ASSERT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
   ASSERT_EQ(DataTypeController::NOT_RUNNING,
             GetController(PREFERENCES)->state());
-  ASSERT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
   ASSERT_EQ(0U, configurer_.connected_types().size());
 
   // Both types should start normally now.
@@ -1215,10 +1206,7 @@
   // Both types are never started due to failing preconditions.
   testing::InSequence seq;
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_,
-              OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                  UnorderedElementsAre(Pair(BOOKMARKS, IsUnreadyError()),
-                                       Pair(PREFERENCES, IsUnreadyError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   Configure({BOOKMARKS, PREFERENCES});
   EXPECT_EQ(DataTypeSet(), FinishDownload());
@@ -1238,9 +1226,7 @@
             GetController(PREFERENCES)->state());
 
   // Set the expectations for the reconfiguration - just prefs are unready now.
-  EXPECT_CALL(observer_,
-              OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                  ElementsAre(Pair(PREFERENCES, IsUnreadyError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   EXPECT_EQ(DataTypeSet(), FinishDownload());
   EXPECT_EQ(AddControlTypesTo({BOOKMARKS}), FinishDownload());
@@ -1258,8 +1244,7 @@
   // Bookmarks is never started due to failing preconditions.
   testing::InSequence seq;
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(BOOKMARKS, IsUnreadyError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   Configure({BOOKMARKS});
   EXPECT_EQ(DataTypeSet(), FinishDownload());
@@ -1303,13 +1288,13 @@
   // Bookmarks is never started due to hitting a model load error.
   testing::InSequence seq;
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(BOOKMARKS, IsDataTypeError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   Configure({BOOKMARKS});
   EXPECT_EQ(DataTypeSet(), FinishDownload());
   // No need to finish the download of BOOKMARKS since it was never started.
   EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+  EXPECT_FALSE(dtm_->GetActiveDataTypes().Has(BOOKMARKS));
   EXPECT_EQ(DataTypeController::FAILED, GetController(BOOKMARKS)->state());
 
   EXPECT_EQ(0U, configurer_.connected_types().size());
@@ -1337,11 +1322,11 @@
   EXPECT_CALL(observer_, OnConfigureStart());
   Configure({BOOKMARKS, PREFERENCES});
 
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(BOOKMARKS, IsDataTypeError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   EXPECT_EQ(DataTypeSet(), FinishDownload());
   EXPECT_EQ(AddControlTypesTo({PREFERENCES}), FinishDownload());
+  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
 
   EXPECT_TRUE(dtm_->GetActiveDataTypes().Has(PREFERENCES));
   EXPECT_FALSE(dtm_->GetActiveDataTypes().Has(BOOKMARKS));
@@ -1673,11 +1658,12 @@
   // Bookmarks is never started due to failing preconditions.
   testing::InSequence seq;
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(BOOKMARKS, IsPolicyError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   Configure({BOOKMARKS});
-  EXPECT_EQ(DataTypeSet(), FinishDownload());
+  ASSERT_EQ(DataTypeSet(), FinishDownload());
+  ASSERT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+
   // No need to finish the download of BOOKMARKS since it was never started.
   ASSERT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
 
@@ -1701,8 +1687,7 @@
       ModelError(FROM_HERE, "test error"));
   ASSERT_EQ(DataTypeController::FAILED, GetController(BOOKMARKS)->state());
 
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(BOOKMARKS, IsDataTypeError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   // Data type error should cause re-configuration.
   task_environment_.RunUntilIdle();
@@ -1727,8 +1712,7 @@
 
   testing::InSequence seq;
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(BOOKMARKS, IsDataTypeError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   Configure({BOOKMARKS, PREFERENCES});
 
@@ -1843,8 +1827,7 @@
   ASSERT_EQ(GetController(BOOKMARKS)->state(), DataTypeController::FAILED);
 
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(BOOKMARKS, IsDataTypeError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   // BOOKMARKS should not be started since it is in a FAILED state.
   Configure({BOOKMARKS});
@@ -1877,8 +1860,7 @@
 
   testing::InSequence seq;
   EXPECT_CALL(observer_, OnConfigureStart());
-  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceededWithFailedTypes(
-                             ElementsAre(Pair(BOOKMARKS, IsDataTypeError())))));
+  EXPECT_CALL(observer_, OnConfigureDone(ConfigureSucceeded()));
 
   // BOOKMARKS should not be started since it is in a FAILED state.
   Configure({BOOKMARKS});
diff --git a/components/sync/service/sync_service_impl.cc b/components/sync/service/sync_service_impl.cc
index 3590f8f..b72e1e5c 100644
--- a/components/sync/service/sync_service_impl.cc
+++ b/components/sync/service/sync_service_impl.cc
@@ -459,15 +459,20 @@
 }
 
 DataTypeSet SyncServiceImpl::GetRegisteredDataTypesForTest() const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CHECK_IS_TEST();
   return data_type_manager_->GetRegisteredDataTypes();
 }
 
 bool SyncServiceImpl::HasAnyDatatypeErrorForTest(DataTypeSet types) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  for (auto type : types) {
-    auto it = data_type_error_map_.find(type);
-    if (it != data_type_error_map_.end() &&
-        it->second.error_type() == syncer::SyncError::DATATYPE_ERROR) {
+  CHECK_IS_TEST();
+  CHECK(data_type_manager_);
+
+  for (DataType type : types) {
+    DataTypeController* controller =
+        data_type_manager_->GetControllerForTest(type);  // IN-TEST
+    if (controller && controller->state() == DataTypeController::FAILED) {
       return true;
     }
   }
@@ -477,12 +482,14 @@
 void SyncServiceImpl::GetThrottledDataTypesForTest(
     base::OnceCallback<void(DataTypeSet)> cb) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CHECK_IS_TEST();
+
   if (!engine_ || !engine_->IsInitialized()) {
     std::move(cb).Run(DataTypeSet());
     return;
   }
 
-  engine_->GetThrottledDataTypesForTest(std::move(cb));
+  engine_->GetThrottledDataTypesForTest(std::move(cb));  // IN-TEST
 }
 
 // static
@@ -1239,7 +1246,6 @@
 void SyncServiceImpl::OnConfigureDone(
     const DataTypeManager::ConfigureResult& result) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  data_type_error_map_ = result.data_type_status_table.GetAllErrors();
 
   DVLOG(1) << "SyncServiceImpl::OnConfigureDone called with status: "
            << result.status;
@@ -1493,17 +1499,18 @@
 
 SyncClient* SyncServiceImpl::GetSyncClientForTest() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CHECK_IS_TEST();
   return sync_client_.get();
 }
 
 void SyncServiceImpl::ReportDataTypeErrorForTest(DataType type) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   CHECK_IS_TEST();
-  CHECK(data_type_manager_->GetControllerMap().find(type) !=
-        data_type_manager_->GetControllerMap().end());
-  data_type_manager_->GetControllerMap()
-      .find(type)
-      ->second->ReportBridgeErrorForTest();  // IN-TEST
+
+  DataTypeController* controller =
+      data_type_manager_->GetControllerForTest(type);  // IN-TEST
+  CHECK(controller);
+  controller->ReportBridgeErrorForTest();  // IN-TEST
 }
 
 void SyncServiceImpl::AddObserver(SyncServiceObserver* observer) {
@@ -1720,13 +1727,15 @@
 void SyncServiceImpl::HasUnsyncedItemsForTest(
     base::OnceCallback<void(bool)> cb) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CHECK_IS_TEST();
   DCHECK(engine_);
   DCHECK(engine_->IsInitialized());
-  engine_->HasUnsyncedItemsForTest(std::move(cb));
+  engine_->HasUnsyncedItemsForTest(std::move(cb));  // IN-TEST
 }
 
 BackendMigrator* SyncServiceImpl::GetBackendMigratorForTest() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CHECK_IS_TEST();
   return migrator_.get();
 }
 
@@ -2112,11 +2121,13 @@
 
 bool SyncServiceImpl::IsRetryingAccessTokenFetchForTest() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return auth_manager_->IsRetryingAccessTokenFetchForTest();
+  CHECK_IS_TEST();
+  return auth_manager_->IsRetryingAccessTokenFetchForTest();  // IN-TEST
 }
 
 std::string SyncServiceImpl::GetAccessTokenForTest() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CHECK_IS_TEST();
   return auth_manager_->access_token();
 }
 
@@ -2159,7 +2170,7 @@
 
   // If a previous request (with the wrong callback) already failed, the next
   // one would be backed off, which breaks tests. So reset the backoff.
-  auth_manager_->ResetRequestAccessTokenBackoffForTest();
+  auth_manager_->ResetRequestAccessTokenBackoffForTest();  // IN-TEST
 
   create_http_post_provider_factory_cb_ = create_http_post_provider_factory_cb;
 
@@ -2176,6 +2187,7 @@
 
 SyncEncryptionHandler::Observer*
 SyncServiceImpl::GetEncryptionObserverForTest() {
+  CHECK_IS_TEST();
   return &crypto_;
 }
 
@@ -2250,6 +2262,7 @@
     DataTypeSet types,
     base::OnceCallback<void(std::map<DataType, LocalDataDescription>)>
         callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // Some code paths in GetLocalDataDescriptionsImpl() are synchronous, e.g.
   // if `types` have synchronous DataTypeLocalDataBatchUploader implementations.
   // Having an API that is sometime sync and sometimes async can be unexpected
diff --git a/components/sync/service/sync_service_impl.h b/components/sync/service/sync_service_impl.h
index 59b8e785..59fb52c8 100644
--- a/components/sync/service/sync_service_impl.h
+++ b/components/sync/service/sync_service_impl.h
@@ -466,10 +466,6 @@
   // an action set on it.
   SyncProtocolError last_actionable_error_;
 
-  // Tracks the set of failed data types (those that encounter an error
-  // or must delay loading for some reason).
-  DataTypeStatusTable::TypeErrorMap data_type_error_map_;
-
   CreateHttpPostProviderFactory create_http_post_provider_factory_cb_;
 
   std::unique_ptr<SyncStoppedReporter> sync_stopped_reporter_;
diff --git a/components/sync/test/data_type_manager_mock.h b/components/sync/test/data_type_manager_mock.h
index 8fa49b0..3daed8b3 100644
--- a/components/sync/test/data_type_manager_mock.h
+++ b/components/sync/test/data_type_manager_mock.h
@@ -5,7 +5,7 @@
 #ifndef COMPONENTS_SYNC_TEST_DATA_TYPE_MANAGER_MOCK_H_
 #define COMPONENTS_SYNC_TEST_DATA_TYPE_MANAGER_MOCK_H_
 
-#include "base/functional/callback_forward.h"
+#include "base/functional/callback.h"
 #include "components/sync/model/sync_error.h"
 #include "components/sync/service/data_type_manager.h"
 #include "components/sync/service/local_data_description.h"
@@ -71,10 +71,10 @@
               GetEntityCountsForDebugging,
               (base::RepeatingCallback<void(const TypeEntitiesCount&)>),
               (const override));
-  MOCK_METHOD(const DataTypeController::TypeMap&,
-              GetControllerMap,
-              (),
-              (const override));
+  MOCK_METHOD(DataTypeController*,
+              GetControllerForTest,
+              (DataType type),
+              (override));
 
  private:
   DataTypeManager::ConfigureResult result_;
diff --git a/components/viz/common/features.cc b/components/viz/common/features.cc
index 9e0c3bd..0fc8443 100644
--- a/components/viz/common/features.cc
+++ b/components/viz/common/features.cc
@@ -34,6 +34,10 @@
              "AndroidBrowserControlsInViz",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kAndroidBcivWithSimpleScheduler,
+             "AndroidBcivWithSimpleScheduler",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kAndroidBcivWithSuppression,
              "AndroidBcivWithSuppression",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/viz/common/features.h b/components/viz/common/features.h
index 2cb0335..414a4dc 100644
--- a/components/viz/common/features.h
+++ b/components/viz/common/features.h
@@ -19,6 +19,7 @@
 namespace features {
 
 #if BUILDFLAG(IS_ANDROID)
+VIZ_COMMON_EXPORT BASE_DECLARE_FEATURE(kAndroidBcivWithSimpleScheduler);
 VIZ_COMMON_EXPORT BASE_DECLARE_FEATURE(kAndroidBcivWithSuppression);
 VIZ_COMMON_EXPORT BASE_DECLARE_FEATURE(kAndroidBcivZeroBrowserFrames);
 VIZ_COMMON_EXPORT BASE_DECLARE_FEATURE(kAndroidBrowserControlsInViz);
diff --git a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
index c715f0a6..da234f8 100644
--- a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
+++ b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
@@ -1107,7 +1107,7 @@
   if (capture_texture_results) {
     TRACE_EVENT("gpu.capture", "PopulateBlitRequest");
 
-    auto& mailbox_holder = frame_capture.frame->mailbox_holder(0);
+    auto mailbox_holder = frame_capture.frame->mailbox_holder(0);
 
     // TODO(crbug.com/41350322): change the capturer to only request the
     // parts of the frame that have changed whenever possible.
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc
index eb58f7e1..69f085c 100644
--- a/content/browser/accessibility/browser_accessibility_manager_android.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -423,7 +423,7 @@
 }
 
 void BrowserAccessibilityManagerAndroid::SendLocationChangeEvents(
-    const std::vector<ui::AXLocationChanges>& changes) {
+    const std::vector<ui::AXLocationChange>& changes) {
   // Android is not very efficient at handling notifications, and location
   // changes in particular are frequent and not time-critical. If a lot of
   // nodes changed location, just send a single notification after a short
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.h b/content/browser/accessibility/browser_accessibility_manager_android.h
index 3a9097fd..86ae5ab 100644
--- a/content/browser/accessibility/browser_accessibility_manager_android.h
+++ b/content/browser/accessibility/browser_accessibility_manager_android.h
@@ -104,7 +104,7 @@
   // BrowserAccessibilityManager overrides.
   ui::BrowserAccessibility* GetFocus() const override;
   void SendLocationChangeEvents(
-      const std::vector<ui::AXLocationChanges>& changes) override;
+      const std::vector<ui::AXLocationChange>& changes) override;
   ui::AXNode* RetargetForEvents(ui::AXNode* node,
                                 RetargetEventType type) const override;
   void FireBlinkEvent(ax::mojom::Event event_type,
diff --git a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
index 1048796..ba330fb9 100644
--- a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
+++ b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
@@ -621,6 +621,188 @@
 }
 
 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
+                       EnsureVerticalScrollSendScrollUpdatesOnly) {
+  LoadInitialAccessibilityTreeFromHtml(R"HTML(
+      <!DOCTYPE html>
+      <html>
+      <head>
+        <style>
+          .container {
+            padding: 100px;
+            height: 900px;
+            overflow: scroll;
+          }
+
+          .bigbutton {
+            display: block;
+            width: 600px;
+            height: 600px;
+          }
+        </style>
+      </head>
+      <body>
+        <div id="container" class="container" role="group">
+          <button class="bigbutton">One</button>
+          <button class="bigbutton">Two</button>
+          <button class="bigbutton">Three</button>
+        </div>
+      </body>
+      </html>)HTML");
+
+  WaitForAccessibilityTreeToContainNodeWithName(shell()->web_contents(), "One");
+
+  const ui::BrowserAccessibility* root =
+      GetManager()->GetBrowserAccessibilityRoot();
+  ASSERT_EQ(1U, root->PlatformChildCount());
+  const ui::BrowserAccessibility* container = root->PlatformGetChild(0);
+
+  EXPECT_EQ(ax::mojom::Role::kGroup, container->GetRole());
+  ASSERT_EQ(3U, container->PlatformChildCount());
+  EXPECT_EQ(container->GetIntAttribute(ax::mojom::IntAttribute::kScrollY), 0);
+  EXPECT_FALSE(container->PlatformGetChild(0)->IsOffscreen());
+  EXPECT_TRUE(container->PlatformGetChild(2)->IsOffscreen());
+
+  // Even though SCROLL_VERTICAL_POSITION_CHANGED looks like a Blink event, it
+  // is not actually fired by Blink. Its now fired in the browser process.
+  AccessibilityNotificationWaiter waiter1(
+      shell()->web_contents(), ui::kAXModeComplete,
+      ui::AXEventGenerator::Event::SCROLL_VERTICAL_POSITION_CHANGED);
+
+  // Ensure a normal serialization doesn't happen.
+  // When something like only locations change in a document. We want to avoid
+  // full-scale serialization as it's not required. A lightweight locations-only
+  // serialization already occurs. This check below ensures a full serialization
+  // doesn't occur. Marking objects as dirty is pretty expensive and in
+  // cases of scroll changes, we don't need it while we already know what
+  // changed.
+  bool received_event = false;
+  base::RunLoop run_loop;
+  RenderFrameHostImpl* rfh_impl = static_cast<RenderFrameHostImpl*>(
+      shell()->web_contents()->GetPrimaryMainFrame());
+  rfh_impl->SetAccessibilityCallbackForTesting(base::BindLambdaForTesting(
+      [&](RenderFrameHostImpl* rfhi, ax::mojom::Event event_type,
+          int event_target_id) {
+        received_event = true;
+        run_loop.Quit();
+      }));
+
+  // Scroll the container to a location and expect a scroll update with new
+  // scroll.
+  ExecuteScript("document.querySelector('#container').scrollTop = 900;");
+  ASSERT_TRUE(waiter1.WaitForNotification());
+  EXPECT_EQ(container->GetIntAttribute(ax::mojom::IntAttribute::kScrollY), 900);
+  EXPECT_TRUE(container->PlatformGetChild(0)->IsOffscreen());
+  EXPECT_FALSE(container->PlatformGetChild(2)->IsOffscreen());
+
+  // Since we're expecting NO calls, we need a timer to avoid waiting too long.
+  // Five seconds should be enough to fail on some builds. It's ok if test
+  // passes incorrectly on slow ones. Waiting for (30 seconds) will
+  // cost a lot of wait-time.
+  base::OneShotTimer quit_timer;
+  quit_timer.Start(FROM_HERE, base::Milliseconds(5000),
+                   run_loop.QuitWhenIdleClosure());
+  run_loop.Run();
+
+  ASSERT_FALSE(received_event) << "Received accessibility event when scroll "
+                                  "changes shouldn't mark anything as dirty.";
+}
+
+IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
+                       EnsureHorizontalScrollSendScrollUpdatesOnly) {
+  LoadInitialAccessibilityTreeFromHtml(R"HTML(
+      <!DOCTYPE html>
+      <html>
+      <head>
+        <style>
+          .container {
+            padding: 100px;
+            height: 900px;
+            overflow: scroll;
+          }
+
+          .inner {
+            width: 2000px;
+          }
+
+          .bigbutton {
+            display:inline-block;
+            width: 600px;
+            height: 600px;
+          }
+        </style>
+      </head>
+      <body>
+        <div id="container" class="container">
+          <div class="inner">
+            <button class="bigbutton">One</button>
+            <button class="bigbutton">Two</button>
+            <button class="bigbutton">Three</button>
+          </div>
+        </div>
+      </body>
+      </html>)HTML");
+
+  WaitForAccessibilityTreeToContainNodeWithName(shell()->web_contents(), "One");
+
+  const ui::BrowserAccessibility* root =
+      GetManager()->GetBrowserAccessibilityRoot();
+  ASSERT_EQ(1U, root->PlatformChildCount());
+  const ui::BrowserAccessibility* container = root->PlatformGetChild(0);
+
+  EXPECT_EQ(ax::mojom::Role::kGenericContainer, container->GetRole());
+  ASSERT_EQ(1U, container->PlatformChildCount());
+  EXPECT_EQ(container->GetIntAttribute(ax::mojom::IntAttribute::kScrollX), 0);
+  const ui::BrowserAccessibility* parentOfItems =
+      container->PlatformGetChild(0);
+  EXPECT_FALSE(parentOfItems->PlatformGetChild(0)->IsOffscreen());
+  EXPECT_TRUE(parentOfItems->PlatformGetChild(2)->IsOffscreen());
+
+  // Even though SCROLL_HORIZONTAL_POSITION_CHANGED looks like a Blink event, it
+  // is not actually fired by Blink. Its now fired in the browser process.
+  AccessibilityNotificationWaiter waiter1(
+      shell()->web_contents(), ui::kAXModeComplete,
+      ui::AXEventGenerator::Event::SCROLL_HORIZONTAL_POSITION_CHANGED);
+
+  // Ensure a normal serialization doesn't happen.
+  // When something like only locations change in a document. We want to avoid
+  // full-scale serialization as it's not required. A lightweight locations-only
+  // serialization already occurs. This check below ensures a full serialization
+  // doesn't occur. Marking objects as dirty is pretty expensive and in
+  // cases of scroll changes, we don't need it while we already know what
+  // changed.
+  bool received_event = false;
+  base::RunLoop run_loop;
+  RenderFrameHostImpl* rfh_impl = static_cast<RenderFrameHostImpl*>(
+      shell()->web_contents()->GetPrimaryMainFrame());
+  rfh_impl->SetAccessibilityCallbackForTesting(base::BindLambdaForTesting(
+      [&](RenderFrameHostImpl* rfhi, ax::mojom::Event event_type,
+          int event_target_id) {
+        received_event = true;
+        run_loop.Quit();
+      }));
+
+  // Scroll the container to a location and expect a scroll update with new
+  // scroll.
+  ExecuteScript("document.querySelector('#container').scrollLeft = 900;");
+  ASSERT_TRUE(waiter1.WaitForNotification());
+  EXPECT_EQ(container->GetIntAttribute(ax::mojom::IntAttribute::kScrollX), 900);
+  EXPECT_TRUE(parentOfItems->PlatformGetChild(0)->IsOffscreen());
+  EXPECT_FALSE(parentOfItems->PlatformGetChild(2)->IsOffscreen());
+
+  // Since we're expecting NO calls, we need a timer to avoid waiting too long.
+  // Five seconds should be enough to fail on some builds. It's ok if test
+  // passes incorrectly on slow ones. Waiting for (30 seconds) will
+  // cost a lot of wait-time.
+  base::OneShotTimer quit_timer;
+  quit_timer.Start(FROM_HERE, base::Milliseconds(5000),
+                   run_loop.QuitWhenIdleClosure());
+  run_loop.Run();
+
+  ASSERT_FALSE(received_event) << "Received accessibility event when scroll "
+                                  "changes shouldn't mark anything as dirty.";
+}
+
+IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
                        PlatformIframeAccessibility) {
   LoadInitialAccessibilityTreeFromHtml(R"HTML(
       <!DOCTYPE html>
diff --git a/content/browser/accessibility/render_accessibility_host.cc b/content/browser/accessibility/render_accessibility_host.cc
index 952a94a..468d308 100644
--- a/content/browser/accessibility/render_accessibility_host.cc
+++ b/content/browser/accessibility/render_accessibility_host.cc
@@ -25,6 +25,7 @@
 
 void RenderAccessibilityHost::HandleAXEvents(
     const ui::AXUpdatesAndEvents& updates_and_events,
+    const ui::AXLocationAndScrollUpdates& location_and_scroll_updates,
     uint32_t reset_token,
     HandleAXEventsCallback callback) {
   NOTREACHED() << "Non-const ref version of this method should be used as a "
@@ -33,6 +34,7 @@
 
 void RenderAccessibilityHost::HandleAXEvents(
     ui::AXUpdatesAndEvents& updates_and_events,
+    ui::AXLocationAndScrollUpdates& location_and_scroll_updates,
     uint32_t reset_token,
     HandleAXEventsCallback callback) {
   // Post the HandleAXEvents task onto the UI thread, and then when that
@@ -42,13 +44,21 @@
       FROM_HERE,
       base::BindOnce(&RenderFrameHostImpl::HandleAXEvents,
                      render_frame_host_impl_, tree_id_,
-                     std::move(updates_and_events), reset_token,
+                     std::move(updates_and_events),
+                     std::move(location_and_scroll_updates), reset_token,
                      mojo::GetBadMessageCallback()),
       std::move(callback));
 }
 
 void RenderAccessibilityHost::HandleAXLocationChanges(
-    std::vector<blink::mojom::LocationChangesPtr> changes,
+    const ui::AXLocationAndScrollUpdates& changes,
+    uint32_t reset_token) {
+  NOTREACHED() << "Non-const ref version of this method should be used as a "
+                  "performance optimization.";
+}
+
+void RenderAccessibilityHost::HandleAXLocationChanges(
+    ui::AXLocationAndScrollUpdates& changes,
     uint32_t reset_token) {
   GetUIThreadTaskRunner({})->PostTask(
       FROM_HERE, base::BindOnce(&RenderFrameHostImpl::HandleAXLocationChanges,
diff --git a/content/browser/accessibility/render_accessibility_host.h b/content/browser/accessibility/render_accessibility_host.h
index 75d0ea5ce..e460b57 100644
--- a/content/browser/accessibility/render_accessibility_host.h
+++ b/content/browser/accessibility/render_accessibility_host.h
@@ -13,6 +13,7 @@
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "third_party/blink/public/mojom/render_accessibility.mojom.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_tree_id.h"
 #include "ui/accessibility/mojom/ax_updates_and_events.mojom.h"
 
@@ -51,16 +52,22 @@
 
   ~RenderAccessibilityHost() override;
 
-  void HandleAXEvents(const ui::AXUpdatesAndEvents& updates_and_events,
-                      uint32_t reset_token,
-                      HandleAXEventsCallback callback) override;
-  void HandleAXEvents(ui::AXUpdatesAndEvents& updates_and_events,
-                      uint32_t reset_token,
-                      HandleAXEventsCallback callback) override;
+  void HandleAXEvents(
+      const ui::AXUpdatesAndEvents& updates_and_events,
+      const ui::AXLocationAndScrollUpdates& location_and_scroll_updates,
+      uint32_t reset_token,
+      HandleAXEventsCallback callback) override;
+  void HandleAXEvents(
+      ui::AXUpdatesAndEvents& updates_and_events,
+      ui::AXLocationAndScrollUpdates& location_and_scroll_updates,
+      uint32_t reset_token,
+      HandleAXEventsCallback callback) override;
 
-  void HandleAXLocationChanges(
-      std::vector<blink::mojom::LocationChangesPtr> changes,
-      uint32_t reset_token) override;
+  void HandleAXLocationChanges(const ui::AXLocationAndScrollUpdates& changes,
+                               uint32_t reset_token) override;
+
+  void HandleAXLocationChanges(ui::AXLocationAndScrollUpdates& changes,
+                               uint32_t reset_token) override;
 
  private:
   base::WeakPtr<RenderFrameHostImpl> render_frame_host_impl_;
diff --git a/content/browser/back_forward_cache_internal_browsertest.cc b/content/browser/back_forward_cache_internal_browsertest.cc
index a4fc15674..c461dfaa 100644
--- a/content/browser/back_forward_cache_internal_browsertest.cc
+++ b/content/browser/back_forward_cache_internal_browsertest.cc
@@ -44,6 +44,7 @@
 #include "net/test/embedded_test_server/controllable_http_response.h"
 #include "third_party/blink/public/common/features.h"
 #include "ui/accessibility/ax_action_data.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_node_id_forward.h"
 #include "ui/accessibility/platform/browser_accessibility.h"
 
@@ -3848,7 +3849,8 @@
   // in the same task of |HandleAXEventsForTests()| and and result in a test
   // fail.
   rfh_a->HandleAXEventsForTests(rfh_a->GetAXTreeID(),
-                                std::move(updates_and_events));
+                                std::move(updates_and_events),
+                                ui::AXLocationAndScrollUpdates());
 
   // Reset the callback before restoring the page so that we will not fail when
   // events are generated.
@@ -3941,20 +3943,20 @@
       &location_change_counter_for_testing));
 
   // Generate a location change event.
-  std::vector<blink::mojom::LocationChangesPtr> changes_1;
+  ui::AXLocationAndScrollUpdates changes_1;
   ui::AXRelativeBounds relative_bounds_1;
   relative_bounds_1.bounds =
       gfx::RectF(/*x=*/1, /*y=*/2, /*width=*/3, /*height=*/4);
-  changes_1.push_back(blink::mojom::LocationChanges::New(0, relative_bounds_1));
+  changes_1.location_changes.emplace_back(0, relative_bounds_1);
   rfh_a->HandleAXLocationChanges(rfh_a->GetAXTreeID(), std::move(changes_1),
                                  /*reset_token=*/1, {});
 
   // Generate another location change event.
-  std::vector<blink::mojom::LocationChangesPtr> changes_2;
+  ui::AXLocationAndScrollUpdates changes_2;
   ui::AXRelativeBounds relative_bounds_2;
   relative_bounds_2.bounds =
       gfx::RectF(/*x=*/2, /*y=*/3, /*width=*/4, /*height=*/5);
-  changes_2.push_back(blink::mojom::LocationChanges::New(0, relative_bounds_2));
+  changes_2.location_changes.emplace_back(0, relative_bounds_2);
   rfh_a->HandleAXLocationChanges(rfh_a->GetAXTreeID(), std::move(changes_2),
                                  /*reset_token=*/1, {});
 
diff --git a/content/browser/indexed_db/instance/backing_store.cc b/content/browser/indexed_db/instance/backing_store.cc
index 235da93..45287b7 100644
--- a/content/browser/indexed_db/instance/backing_store.cc
+++ b/content/browser/indexed_db/instance/backing_store.cc
@@ -4114,6 +4114,13 @@
   return cursor;
 }
 
+void BackingStore::WriteToIndexedDBForTesting(const std::string& key,
+                                              const std::string& value) {
+  std::string value_copy = value;
+  Status s(db_->Put(key, &value_copy));
+  CHECK(s.ok()) << s.ToString();
+}
+
 bool BackingStore::IsBlobCleanupPending() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return journal_cleaning_timer_.IsRunning();
diff --git a/content/browser/indexed_db/instance/backing_store.h b/content/browser/indexed_db/instance/backing_store.h
index 06005e9..927b09a6 100644
--- a/content/browser/indexed_db/instance/backing_store.h
+++ b/content/browser/indexed_db/instance/backing_store.h
@@ -590,9 +590,6 @@
 
   const std::string& origin_identifier() { return origin_identifier_; }
 
-  // Returns true if a blob cleanup job is pending on journal_cleaning_timer_.
-  bool IsBlobCleanupPending();
-
   // Gets the total size of blobs and the database for in-memory backing stores.
   int64_t GetInMemorySize() const;
 
@@ -610,6 +607,11 @@
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     execute_journal_cleaning_on_no_txns_ = true;
   }
+  void WriteToIndexedDBForTesting(const std::string& key,
+                                  const std::string& value);
+
+  // Returns true if a blob cleanup job is pending on journal_cleaning_timer_.
+  bool IsBlobCleanupPending();
 
   // Stops the journal_cleaning_timer_ and runs its pending task.
   void ForceRunBlobCleanup();
diff --git a/content/browser/indexed_db/instance/bucket_context.cc b/content/browser/indexed_db/instance/bucket_context.cc
index 5239a52..427d363 100644
--- a/content/browser/indexed_db/instance/bucket_context.cc
+++ b/content/browser/indexed_db/instance/bucket_context.cc
@@ -104,6 +104,8 @@
 #include "third_party/blink/public/mojom/file_system_access/file_system_access_transfer_token.mojom.h"
 #include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-shared.h"
 #include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h"
+#include "third_party/leveldatabase/env_chromium.h"
+#include "third_party/leveldatabase/src/include/leveldb/status.h"
 
 namespace content::indexed_db {
 namespace {
@@ -955,11 +957,8 @@
 
 void BucketContext::WriteToIndexedDBForTesting(const std::string& key,
                                                const std::string& value) {
-  TransactionalLevelDBDatabase* db = backing_store_->db();
-  std::string value_copy = value;
-  Status s(db->Put(key, &value_copy));
-  CHECK(s.ok()) << s.ToString();
-  ForceClose(true);
+  backing_store_->WriteToIndexedDBForTesting(key, value);  // IN-TEST
+  ForceClose(/*doom=*/true);
 }
 
 void BucketContext::BindMockFailureSingletonForTesting(
@@ -1261,7 +1260,7 @@
   if (status.IsIOError()) {
     quota_manager_proxy_->OnClientWriteFailed(bucket_info_.storage_key);
   }
-  ForceClose(/*will_be_deleted=*/false);
+  ForceClose(/*doom=*/false);
 }
 
 bool BucketContext::OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
diff --git a/content/browser/indexed_db/instance/bucket_context.h b/content/browser/indexed_db/instance/bucket_context.h
index 3059711c..cebb4ba8 100644
--- a/content/browser/indexed_db/instance/bucket_context.h
+++ b/content/browser/indexed_db/instance/bucket_context.h
@@ -40,8 +40,6 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h"
-#include "third_party/leveldatabase/env_chromium.h"
-#include "third_party/leveldatabase/src/include/leveldb/status.h"
 
 namespace storage {
 class QuotaManagerProxy;
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc
index 0b532f5..bcc1cf99 100644
--- a/content/browser/interest_group/interest_group_browsertest.cc
+++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -23749,10 +23749,10 @@
       decisionLogicURL: 'https://test.com',
       sellerCurrency: 'currency is checked late',
       ignored: setTimeout(() => {console.log('I am a timer'); }, 1),
-      perBuyerTimeouts: { 'https://test.com': {
+      perBuyerTimeouts: Promise.resolve({ 'https://test.com': {
           valueOf: () => { console.log('I am a side effect!') }
         }
-      }
+      })
   })"));
   EXPECT_TRUE(console_observer.Wait());
   EXPECT_EQ("I am a timer", console_observer.GetMessageAt(0));
diff --git a/content/browser/navigation_transitions/back_forward_transition_animation_manager_android_browsertest.cc b/content/browser/navigation_transitions/back_forward_transition_animation_manager_android_browsertest.cc
index fd2f3f59..05ec112 100644
--- a/content/browser/navigation_transitions/back_forward_transition_animation_manager_android_browsertest.cc
+++ b/content/browser/navigation_transitions/back_forward_transition_animation_manager_android_browsertest.cc
@@ -54,6 +54,7 @@
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "third_party/blink/public/common/input/web_input_event.h"
 #include "third_party/blink/public/mojom/frame/frame.mojom-test-utils.h"
+#include "ui/android/fake_modal_dialog_manager_bridge.h"
 #include "ui/android/progress_bar_config.h"
 #include "ui/android/ui_android_features.h"
 #include "ui/android/window_android.h"
@@ -4349,4 +4350,134 @@
   EXPECT_EQ("[LivePage]", ChildrenInOrder(*GetViewLayer()));
 }
 
+namespace {
+
+using ModalDialogType = ui::ModalDialogManagerBridge::ModalDialogType;
+
+// Note: This set of tests are unittesting ModalDialogManager#suspendType()
+// and ModalDialogManager#resumeType(), as `ShellJavaScriptDialogManager` is
+// not wired to Java UI code.
+class BackForwardTransitionAnimationManagerBrowserTestSuspendDialog
+    : public BackForwardTransitionAnimationManagerBrowserTest {
+ public:
+  ~BackForwardTransitionAnimationManagerBrowserTestSuspendDialog() override =
+      default;
+
+  void SetUpOnMainThread() override {
+    BackForwardTransitionAnimationManagerBrowserTest::SetUpOnMainThread();
+    fake_dialog_manager_ = ui::FakeModalDialogManagerBridge::CreateForTab(
+        web_contents()->GetTopLevelNativeWindow(),
+        /*use_empty_java_presenter=*/true);
+  }
+
+  void TearDown() override {
+    EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kTab));
+    EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kApp));
+  }
+
+  ui::FakeModalDialogManagerBridge* fake_dialog_manager() {
+    return fake_dialog_manager_.get();
+  }
+
+ private:
+  std::unique_ptr<ui::FakeModalDialogManagerBridge> fake_dialog_manager_;
+};
+
+}  // namespace
+
+IN_PROC_BROWSER_TEST_F(
+    BackForwardTransitionAnimationManagerBrowserTestSuspendDialog,
+    JavascriptDialogSuspendedDuringTransition) {
+  DisableBackForwardCacheForTesting(
+      web_contents(),
+      BackForwardCache::DisableForTestingReason::TEST_REQUIRES_NO_CACHING);
+
+  TestNavigationManager back_nav_to_red(web_contents(), RedURL());
+
+  GetAnimationManager()->OnGestureStarted(ui::BackGestureEvent(0),
+                                          SwipeEdge::LEFT, NavType::kBackward);
+  EXPECT_EQ("[Screenshot[Scrim],LivePage]", ChildrenInOrder(*GetViewLayer()));
+
+  TestFuture<AnimatorForTesting::State> on_destroyed;
+  GetAnimator()->set_on_impl_destroyed(on_destroyed.GetCallback());
+  EXPECT_TRUE(fake_dialog_manager()->IsSuspend(ModalDialogType::kTab));
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kApp));
+
+  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6f));
+  EXPECT_TRUE(fake_dialog_manager()->IsSuspend(ModalDialogType::kTab));
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kApp));
+
+  GetAnimationManager()->OnGestureInvoked();
+  ASSERT_TRUE(back_nav_to_red.WaitForRequestStart());
+  EXPECT_TRUE(fake_dialog_manager()->IsSuspend(ModalDialogType::kTab));
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kApp));
+
+  ASSERT_TRUE(back_nav_to_red.WaitForNavigationFinished());
+  ASSERT_TRUE(back_nav_to_red.was_successful());
+  // The navigation has finished. Tab level dialogs are resumed immediately.
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kTab));
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kApp));
+  ASSERT_TRUE(on_destroyed.Wait());
+  EXPECT_EQ(on_destroyed.Get(), kAnimationFinished);
+}
+
+IN_PROC_BROWSER_TEST_F(
+    BackForwardTransitionAnimationManagerBrowserTestSuspendDialog,
+    JavascriptDialogResumedOnCancel) {
+  GetAnimationManager()->OnGestureStarted(ui::BackGestureEvent(0),
+                                          SwipeEdge::LEFT, NavType::kBackward);
+  EXPECT_EQ("[Screenshot[Scrim],LivePage]", ChildrenInOrder(*GetViewLayer()));
+
+  TestFuture<AnimatorForTesting::State> on_destroyed;
+  GetAnimator()->set_on_impl_destroyed(on_destroyed.GetCallback());
+  EXPECT_TRUE(fake_dialog_manager()->IsSuspend(ModalDialogType::kTab));
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kApp));
+
+  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6f));
+  EXPECT_TRUE(fake_dialog_manager()->IsSuspend(ModalDialogType::kTab));
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kApp));
+
+  GetAnimationManager()->OnGestureCancelled();
+  // Tab level dialogs are resumed immediately after the gesture is cancelled.
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kTab));
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kApp));
+  ASSERT_TRUE(on_destroyed.Wait());
+  EXPECT_EQ(on_destroyed.Get(), kAnimationFinished);
+}
+
+IN_PROC_BROWSER_TEST_F(
+    BackForwardTransitionAnimationManagerBrowserTestSuspendDialog,
+    JavascriptDialogResumedOnAbort) {
+  DisableBackForwardCacheForTesting(
+      web_contents(),
+      BackForwardCache::DisableForTestingReason::TEST_REQUIRES_NO_CACHING);
+
+  TestNavigationManager back_nav_to_red(web_contents(), RedURL());
+
+  GetAnimationManager()->OnGestureStarted(ui::BackGestureEvent(0),
+                                          SwipeEdge::LEFT, NavType::kBackward);
+  EXPECT_EQ("[Screenshot[Scrim],LivePage]", ChildrenInOrder(*GetViewLayer()));
+
+  TestFuture<AnimatorForTesting::State> on_destroyed;
+  GetAnimator()->set_on_impl_destroyed(on_destroyed.GetCallback());
+  EXPECT_TRUE(fake_dialog_manager()->IsSuspend(ModalDialogType::kTab));
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kApp));
+
+  GetAnimationManager()->OnGestureProgressed(ui::BackGestureEvent(0.6f));
+  EXPECT_TRUE(fake_dialog_manager()->IsSuspend(ModalDialogType::kTab));
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kApp));
+
+  GetAnimationManager()->OnGestureInvoked();
+  ASSERT_TRUE(back_nav_to_red.WaitForRequestStart());
+  EXPECT_TRUE(fake_dialog_manager()->IsSuspend(ModalDialogType::kTab));
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kApp));
+
+  GetAnimationManager()->OnDetachCompositor();
+  ASSERT_TRUE(on_destroyed.Wait());
+  EXPECT_EQ(on_destroyed.Get(), kAnimationAborted);
+  // Dialogs are resumed when the transition is aborted.
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kTab));
+  EXPECT_FALSE(fake_dialog_manager()->IsSuspend(ModalDialogType::kApp));
+}
+
 }  // namespace content
diff --git a/content/browser/navigation_transitions/back_forward_transition_animator.cc b/content/browser/navigation_transitions/back_forward_transition_animator.cc
index 1e926ab..c6088f8 100644
--- a/content/browser/navigation_transitions/back_forward_transition_animator.cc
+++ b/content/browser/navigation_transitions/back_forward_transition_animator.cc
@@ -352,6 +352,16 @@
       break;
   }
 
+  if (state_ == State::kAnimationFinished) {
+    // - Navigation committed (old page was unloaded).
+    // - Navigation cancelled or never started.
+    CHECK_EQ(deferred_dialog_token_,
+             ui::ModalDialogManagerBridge::kInvalidDialogToken);
+  } else {
+    // Transition was aborted.
+    ResumeDialogs();
+  }
+
   ResetTransformForLayer(animation_manager_->web_contents_view_android()
                              ->parent_for_web_page_widgets());
 
@@ -856,6 +866,12 @@
           return;
         }
 
+        // Resume the dialogs. When the transition starts we deferred the
+        // dialogs. Now the old page was unloaded and we need to resume the
+        // dialogs immediately so we don't accidentally defer the dialogs on the
+        // new page.
+        ResumeDialogs();
+
         // Before we display the crossfade animation to show the new page, we
         // need to check if the new page matches the origin of the screenshot.
         // We are not allowed to cross-fade from a screenshot of A.com to a page
@@ -1358,33 +1374,51 @@
 void BackForwardTransitionAnimator::ProcessState() {
   switch (state_) {
     case State::kStarted: {
+      DeferDialogs();
       break;
       // `this` will be waiting for the `OnGestureProgressed` call.
     }
     case State::kDisplayingCancelAnimation: {
-      if (navigation_state_ == NavigationState::kNotStarted) {
-        // When the user lifts the finger and signals not to start the
-        // navigation.
-        physics_model_.SwitchSpringForReason(
-            SwitchSpringReason::kGestureCancelled);
-      } else if (navigation_state_ ==
-                 NavigationState::kBeforeUnloadDispatched) {
-        // Notify the physics model we need to animate the active page back to
-        // the center of the viewport because the browser has asked the renderer
-        // to ack the BeforeUnload message. The renderer may need to show a
-        // prompt to ask for the user input.
-        physics_model_.SwitchSpringForReason(
-            SwitchSpringReason::kBeforeUnloadDispatched);
-      } else if (navigation_state_ == NavigationState::kCancelledBeforeStart) {
-        // The user has interacted with the prompt to not start the navigation.
-        // We are waiting for the ongoing cancel animation to finish.
-      } else if (navigation_state_ == NavigationState::kCancelled) {
-        // When the ongoing navigaion is cancelled because the user hits stop or
-        // the navigation was replaced by another navigation,
-        // `OnDidFinishNavigation()` has already notified the physics model to
-        // switch to the cancel spring.
-      } else {
-        NOTREACHED_IN_MIGRATION() << NavigationStateToString(navigation_state_);
+      switch (navigation_state_) {
+        case NavigationState::kNotStarted: {
+          // When the user lifts the finger and signals not to start the
+          // navigation.
+          physics_model_.SwitchSpringForReason(
+              SwitchSpringReason::kGestureCancelled);
+          ResumeDialogs();
+          break;
+        }
+        case NavigationState::kBeforeUnloadDispatched: {
+          // Notify the physics model we need to animate the active page back to
+          // the center of the viewport because the browser has asked the
+          // renderer to ack the BeforeUnload message. The renderer may need to
+          // show a prompt to ask for the user input.
+          physics_model_.SwitchSpringForReason(
+              SwitchSpringReason::kBeforeUnloadDispatched);
+          // We don't resume the TAB dialog if there is a BeforeUnload pending.
+          break;
+        }
+        case NavigationState::kCancelledBeforeStart: {
+          // The user has interacted with the prompt to not start the
+          // navigation. We are waiting for the ongoing cancel animation to
+          // finish.
+          ResumeDialogs();
+          break;
+        }
+        case NavigationState::kCancelled: {
+          // When the ongoing navigation is cancelled because the user hits stop
+          // or the navigation was replaced by another navigation,
+          // `OnDidFinishNavigation()` has already notified the physics model to
+          // switch to the cancel spring.
+          ResumeDialogs();
+          break;
+        }
+        case NavigationState::kBeforeUnloadAckedProceed:
+        case NavigationState::kStarted:
+        case NavigationState::kCommitted:
+          NOTREACHED_IN_MIGRATION()
+              << NavigationStateToString(navigation_state_);
+          break;
       }
       CHECK(animation_manager_->web_contents_view_android()
                 ->GetTopLevelNativeWindow());
@@ -2105,4 +2139,35 @@
       .width();
 }
 
+void BackForwardTransitionAnimator::DeferDialogs() {
+  CHECK_EQ(deferred_dialog_token_,
+           ui::ModalDialogManagerBridge::kInvalidDialogToken);
+  auto* dialog_manager = animation_manager_->web_contents_view_android()
+                             ->GetNativeView()
+                             ->GetWindowAndroid()
+                             ->GetModalDialogManagerBridge();
+  // We don't always have a dialog manager (i.e., content_browsertests).
+  if (dialog_manager) {
+    deferred_dialog_token_ = dialog_manager->SuspendModalDialog(
+        ui::ModalDialogManagerBridge::ModalDialogType::kTab);
+  }
+}
+
+void BackForwardTransitionAnimator::ResumeDialogs() {
+  if (deferred_dialog_token_ ==
+      ui::ModalDialogManagerBridge::kInvalidDialogToken) {
+    return;
+  }
+  auto* dialog_manager = animation_manager_->web_contents_view_android()
+                             ->GetNativeView()
+                             ->GetWindowAndroid()
+                             ->GetModalDialogManagerBridge();
+  if (dialog_manager) {
+    dialog_manager->ResumeModalDialog(
+        ui::ModalDialogManagerBridge::ModalDialogType::kTab,
+        deferred_dialog_token_);
+  }
+  deferred_dialog_token_ = ui::ModalDialogManagerBridge::kInvalidDialogToken;
+}
+
 }  // namespace content
diff --git a/content/browser/navigation_transitions/back_forward_transition_animator.h b/content/browser/navigation_transitions/back_forward_transition_animator.h
index d79880e..97e6061 100644
--- a/content/browser/navigation_transitions/back_forward_transition_animator.h
+++ b/content/browser/navigation_transitions/back_forward_transition_animator.h
@@ -13,6 +13,7 @@
 #include "content/public/browser/render_frame_metadata_provider.h"
 #include "content/public/browser/render_widget_host_observer.h"
 #include "content/public/browser/web_contents_observer.h"
+#include "ui/android/modal_dialog_manager_bridge.h"
 #include "ui/android/view_android_observer.h"
 #include "ui/android/window_android_observer.h"
 #include "ui/events/back_gesture_event.h"
@@ -409,6 +410,9 @@
 
   int DipToPx(int dip) const;
 
+  void DeferDialogs();
+  void ResumeDialogs();
+
   const BackForwardTransitionAnimationManager::NavigationDirection
       nav_direction_;
 
@@ -556,6 +560,14 @@
   IgnoringInputReason ignoring_input_reason_ =
       IgnoringInputReason::kNoOccurrence;
 
+  // Stores the token that identify the deferred dialogs. During the animated
+  // transition, the live page could show the user some permission prompts or
+  // alerts before unloaded. We suppress these dialogs during the transition.
+  // These dialogs will be re-presented if the swipe gesture does not unload the
+  // live page.
+  int deferred_dialog_token_ =
+      ui::ModalDialogManagerBridge::kInvalidDialogToken;
+
   base::WeakPtrFactory<BackForwardTransitionAnimator> weak_ptr_factory_{this};
 };
 
diff --git a/content/browser/preloading/prefetch/no_vary_search_helper.h b/content/browser/preloading/prefetch/no_vary_search_helper.h
index 944a285..e00f2dc0 100644
--- a/content/browser/preloading/prefetch/no_vary_search_helper.h
+++ b/content/browser/preloading/prefetch/no_vary_search_helper.h
@@ -69,8 +69,11 @@
   // URL is exactly the same.
   kExact,
 
-  // URL is equivalent due to the received No-Vary-Search data.
-  kNoVarySearch,
+  // URL is equivalent due to the received No-Vary-Search header.
+  kNoVarySearchHeader,
+
+  // URL is equivalent due to the No-Vary-Search hint.
+  kNoVarySearchHint,
 
   // The non-ref/query parts of URL are the same.
   kOther
@@ -156,9 +159,19 @@
       continue;
     }
 
-    const auto match_type = it->second->IsNoVarySearchHeaderMatch(key_url)
-                                ? MatchType::kNoVarySearch
-                                : MatchType::kOther;
+    const MatchType match_type = [&]() {
+      const auto& prefetch_container = it->second;
+      if (prefetch_container->IsNoVarySearchHeaderMatch(key_url)) {
+        return MatchType::kNoVarySearchHeader;
+      } else if (prefetch_container->ShouldWaitForNoVarySearchHeader(key_url)) {
+        return MatchType::kNoVarySearchHint;
+      } else {
+        return MatchType::kOther;
+      }
+
+      NOTREACHED();
+    }();
+
     if (callback.Run(it->second, match_type) ==
         IterateCandidateResult::kFinish) {
       break;
@@ -182,13 +195,14 @@
              const Value& prefetch_container, MatchType match_type) {
             switch (match_type) {
               case MatchType::kExact:
-              case MatchType::kNoVarySearch:
+              case MatchType::kNoVarySearchHeader:
                 // TODO(crbug.com/40064891): Revisit which PrefetchContainer to
                 // return when there are multiple candidates. Currently we
                 // return the first PrefetchContainer in URL lexicographic
                 // order.
                 *result = prefetch_container->GetWeakPtr();
                 return IterateCandidateResult::kFinish;
+              case MatchType::kNoVarySearchHint:
               case MatchType::kOther:
                 return IterateCandidateResult::kContinue;
             }
diff --git a/content/browser/preloading/prefetch/prefetch_match_resolver.h b/content/browser/preloading/prefetch/prefetch_match_resolver.h
index 8d5d24c..776c77ed 100644
--- a/content/browser/preloading/prefetch/prefetch_match_resolver.h
+++ b/content/browser/preloading/prefetch/prefetch_match_resolver.h
@@ -261,6 +261,47 @@
       ostream << t;
     };
 
+// Do not use it outside of this header.
+//
+// Collects "potentially matching" `PrefetchContainer`s.
+//
+// "potentially matching" is either:
+//
+// - Exact match
+// - No-Vary-Search header match.
+// - No-Vary-Search hint match and non redirect header is not still arrived.
+template <class T>
+  requires MatchCandidate<T>
+std::vector<T*> CollectPotentialMatchPrefetchContainers(
+    const std::map<PrefetchContainer::Key, std::unique_ptr<T>>& prefetches,
+    const PrefetchContainer::Key& navigated_key) {
+  std::vector<T*> result;
+
+  // Note that exact match one is at the head if exists by the property of
+  // `IterateCandidates()`.
+  no_vary_search::IterateCandidates(
+      navigated_key, prefetches,
+      base::BindRepeating(
+          [](const PrefetchContainer::Key& navigated_key,
+             std::vector<T*>* result,
+             const std::unique_ptr<T>& prefetch_container,
+             no_vary_search::MatchType match_type) {
+            switch (match_type) {
+              case no_vary_search::MatchType::kExact:
+              case no_vary_search::MatchType::kNoVarySearchHeader:
+              case no_vary_search::MatchType::kNoVarySearchHint:
+                result->push_back(prefetch_container.get());
+                break;
+              case no_vary_search::MatchType::kOther:
+                break;
+            }
+            return no_vary_search::IterateCandidateResult::kContinue;
+          },
+          navigated_key, base::Unretained(&result)));
+
+  return result;
+}
+
 // Collects `PrefetchContainer`s that are expected to match to `navigated_key`.
 //
 // This is defined with the template for testing the first phase of
@@ -272,43 +313,15 @@
     const PrefetchContainer::Key& navigated_key,
     base::WeakPtr<PrefetchServingPageMetricsContainer>
         serving_page_metrics_container) {
-  std::vector<T*> matches;
-  std::vector<T*> hint_matches;
-  DVLOG(1) << "CollectMatchCandidatesGeneric(" << navigated_key << ")";
-  // Search for an exact or No-Vary-Search match first.
-  no_vary_search::IterateCandidates(
-      navigated_key, prefetches,
-      base::BindRepeating(
-          [](const PrefetchContainer::Key& navigated_key,
-             std::vector<T*>* matches, std::vector<T*>* hint_matches,
-             const std::unique_ptr<T>& prefetch_container,
-             no_vary_search::MatchType match_type) {
-            switch (match_type) {
-              case no_vary_search::MatchType::kExact:
-              case no_vary_search::MatchType::kNoVarySearch:
-                matches->push_back(prefetch_container.get());
-                break;
-              case no_vary_search::MatchType::kOther:
-                if (prefetch_container->ShouldWaitForNoVarySearchHeader(
-                        navigated_key.url())) {
-                  hint_matches->push_back(prefetch_container.get());
-                }
-                break;
-            }
-            return no_vary_search::IterateCandidateResult::kContinue;
-          },
-          navigated_key, base::Unretained(&matches),
-          base::Unretained(&hint_matches)));
+  std::vector<T*> candidates =
+      CollectPotentialMatchPrefetchContainers(prefetches, navigated_key);
 
-  // Insert the No-Vary-Search hint matches at the end of `matches`.
-  matches.insert(matches.end(), hint_matches.begin(), hint_matches.end());
-
-  for (T* prefetch_container : matches) {
+  for (T* prefetch_container : candidates) {
     prefetch_container->SetServingPageMetrics(serving_page_metrics_container);
     prefetch_container->UpdateServingPageMetrics();
   }
 
-  std::erase_if(matches, [](const auto* prefetch_container) {
+  std::erase_if(candidates, [](const auto* prefetch_container) {
     if (prefetch_container->HasPrefetchBeenConsideredToServe()) {
       DVLOG(1) << "CollectMatchCandidatesGeneric: skipped "
                << "because already considered to serve: "
@@ -355,7 +368,7 @@
     return false;
   });
 
-  return matches;
+  return candidates;
 }
 
 }  // namespace content
diff --git a/content/browser/renderer_host/render_frame_host_delegate.h b/content/browser/renderer_host/render_frame_host_delegate.h
index 7e692e6b..7777f63 100644
--- a/content/browser/renderer_host/render_frame_host_delegate.h
+++ b/content/browser/renderer_host/render_frame_host_delegate.h
@@ -100,7 +100,7 @@
 namespace ui {
 class ClipboardFormatType;
 struct AXUpdatesAndEvents;
-struct AXLocationChanges;
+struct AXLocationAndScrollUpdates;
 }  // namespace ui
 
 namespace content {
@@ -302,7 +302,8 @@
   virtual void ProcessAccessibilityUpdatesAndEvents(
       ui::AXUpdatesAndEvents& details) {}
   virtual void AccessibilityLocationChangesReceived(
-      const std::vector<ui::AXLocationChanges>& details) {}
+      const ui::AXTreeID& tree_id,
+      ui::AXLocationAndScrollUpdates& details) {}
 
   // Indicates an unrecoverable error in accessibility. Gracefully turns off
   // accessibility in all frames.
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index df184d09..86c862d 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -279,6 +279,7 @@
 #include "ui/accessibility/accessibility_features.h"
 #include "ui/accessibility/ax_action_handler_registry.h"
 #include "ui/accessibility/ax_common.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_tree_update.h"
 #include "ui/accessibility/ax_updates_and_events.h"
 #include "ui/accessibility/platform/browser_accessibility_manager.h"
@@ -10435,6 +10436,7 @@
 void RenderFrameHostImpl::HandleAXEvents(
     const ui::AXTreeID& tree_id,
     ui::AXUpdatesAndEvents updates_and_events,
+    ui::AXLocationAndScrollUpdates location_and_scroll_updates,
     uint32_t reset_token,
     mojo::ReportBadMessageCallback report_bad_message_callback) {
   TRACE_EVENT0("accessibility", "RenderFrameHostImpl::HandleAXEvents");
@@ -10511,6 +10513,16 @@
 
   GetOrCreateBrowserAccessibilityManager();
 
+  if (!location_and_scroll_updates.location_changes.empty() ||
+      !location_and_scroll_updates.scroll_changes.empty()) {
+    HandleAXLocationChanges(
+        tree_id, std::move(location_and_scroll_updates), reset_token,
+        std::move(report_bad_message_callback));  // There's no calls to
+                                                  // report_bad_message_callback
+                                                  // below this line so should
+                                                  // be safe to move it.
+  }
+
   for (auto& update : updates_and_events.updates) {
     if (update.has_tree_data) {
       DCHECK_EQ(tree_id, update.tree_data.tree_id);
@@ -10568,7 +10580,7 @@
 
 void RenderFrameHostImpl::HandleAXLocationChanges(
     const ui::AXTreeID& tree_id,
-    std::vector<blink::mojom::LocationChangesPtr> changes,
+    ui::AXLocationAndScrollUpdates changes,
     uint32_t reset_token,
     mojo::ReportBadMessageCallback report_bad_message_callback) {
   if (tree_id != GetAXTreeID()) {
@@ -10598,23 +10610,13 @@
     }
   }
 
-  // Send the updates to the automation extension API.
-  std::vector<ui::AXLocationChanges> details;
-  details.reserve(changes.size());
-  for (auto& change : changes) {
-    ui::AXLocationChanges detail;
-    detail.id = change->id;
-    detail.ax_tree_id = GetAXTreeID();
-    detail.new_location = change->new_location;
-    details.push_back(detail);
-  }
   ui::BrowserAccessibilityManager* manager =
       GetOrCreateBrowserAccessibilityManager();
   if (manager) {
-    manager->OnLocationChanges(details);
+    manager->OnLocationChanges(changes);
   }
 
-  delegate_->AccessibilityLocationChangesReceived(details);
+  delegate_->AccessibilityLocationChangesReceived(tree_id, changes);
 }
 
 void RenderFrameHostImpl::ResetWaitingState() {
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index c5098ac8d..7d0860c4 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -2881,9 +2881,12 @@
                                  JavaScriptResultAndTypeCallback callback);
 
   // Call |HandleAXEvents()| for tests.
-  void HandleAXEventsForTests(const ui::AXTreeID& tree_id,
-                              ui::AXUpdatesAndEvents updates_and_events) {
+  void HandleAXEventsForTests(
+      const ui::AXTreeID& tree_id,
+      ui::AXUpdatesAndEvents updates_and_events,
+      ui::AXLocationAndScrollUpdates location_and_scroll_updates) {
     HandleAXEvents(tree_id, std::move(updates_and_events),
+                   std::move(location_and_scroll_updates),
                    *accessibility_reset_token_, {});
   }
 
@@ -3460,11 +3463,12 @@
   void HandleAXEvents(
       const ui::AXTreeID& tree_id,
       ui::AXUpdatesAndEvents updates_and_events,
+      ui::AXLocationAndScrollUpdates location_and_scroll_updates,
       uint32_t reset_token,
       mojo::ReportBadMessageCallback report_bad_message_callback);
   void HandleAXLocationChanges(
       const ui::AXTreeID& tree_id,
-      std::vector<blink::mojom::LocationChangesPtr> changes,
+      ui::AXLocationAndScrollUpdates changes,
       uint32_t reset_token,
       mojo::ReportBadMessageCallback report_bad_message_callback);
 
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc
index f53b59e..52a933c1 100644
--- a/content/browser/renderer_host/render_frame_host_manager.cc
+++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -4146,13 +4146,14 @@
       // Then we should remove the null-check for the RenderWidgetHostView in
       // RenderWidgetHostImpl::RendererWidgetCreated().
       delegate_->CreateRenderWidgetHostViewForRenderManager(render_view_host);
-      // If we are recovering a crashed frame in the same SiteInstance and we
-      // are not skipping early commit then we will create a proxy and that will
-      // prevent the regular outer delegate reattach path in
+      // If we are recovering a crashed frame in the same SiteInstanceGroup and
+      // we are not skipping early commit then we will create a proxy and that
+      // will prevent the regular outer delegate reattach path in
       // CreateRenderViewForRenderManager() from working.
       if (recovering_without_early_commit &&
-          render_frame_host_->GetSiteInstance() == instance)
+          render_frame_host_->GetSiteInstance()->group() == instance->group()) {
         delegate_->ReattachOuterDelegateIfNeeded();
+      }
     }
     // And since we are reusing the RenderViewHost make sure it is hidden, like
     // a new RenderViewHost would be, until navigation commits.
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 0478cc0..005138e 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -5304,11 +5304,13 @@
 }
 
 void WebContentsImpl::AccessibilityLocationChangesReceived(
-    const std::vector<ui::AXLocationChanges>& details) {
+    const ui::AXTreeID& tree_id,
+    ui::AXLocationAndScrollUpdates& details) {
   OPTIONAL_TRACE_EVENT0(
       "content", "WebContentsImpl::AccessibilityLocationChangesReceived");
   observers_.NotifyObservers(
-      &WebContentsObserver::AccessibilityLocationChangesReceived, details);
+      &WebContentsObserver::AccessibilityLocationChangesReceived, tree_id,
+      details);
 }
 
 ui::AXNode* WebContentsImpl::GetAccessibilityRootNode() {
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 8f4686f..978d1b7 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -81,6 +81,7 @@
 #include "third_party/blink/public/mojom/page/display_cutout.mojom-shared.h"
 #include "third_party/blink/public/mojom/page/draggable_region.mojom-forward.h"
 #include "third_party/blink/public/mojom/page/page_visibility_state.mojom-shared.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_mode.h"
 #include "ui/accessibility/ax_node.h"
 #include "ui/accessibility/platform/inspect/ax_event_recorder.h"
@@ -714,7 +715,8 @@
   void ProcessAccessibilityUpdatesAndEvents(
       ui::AXUpdatesAndEvents& details) override;
   void AccessibilityLocationChangesReceived(
-      const std::vector<ui::AXLocationChanges>& details) override;
+      const ui::AXTreeID& tree_id,
+      ui::AXLocationAndScrollUpdates& details) override;
   ui::AXNode* GetAccessibilityRootNode() override;
   std::string DumpAccessibilityTree(
       bool internal,
diff --git a/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePort.java b/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePort.java
index acb5947..effa1a66 100644
--- a/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePort.java
+++ b/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePort.java
@@ -215,17 +215,18 @@
     }
 
     /**
-     * A finalizer is required to ensure that the native object associated with
-     * this descriptor gets torn down, otherwise there would be a memory leak.
+     * A finalizer is required to ensure that the native object associated with this descriptor gets
+     * torn down, otherwise there would be a memory leak.
      *
-     * This is safe because posting a task is fast.
+     * <p>This is safe because posting a task is fast.
      *
-     * TODO(chrisha): Chase down the existing offenders that don't call close,
-     * and flip this to use LifetimeAssert.
+     * <p>TODO(chrisha): Chase down the existing offenders that don't call close, and flip this to
+     * use LifetimeAssert. (also: https://crbug.com/40286193)
      *
      * @see java.lang.Object#finalize()
      */
     @Override
+    @SuppressWarnings("Finalize")
     protected void finalize() throws Throwable {
         try {
             if (mNativeAppWebMessagePort == 0L) return;
diff --git a/content/public/android/java/src/org/chromium/content/browser/sms/SmsVerificationReceiver.java b/content/public/android/java/src/org/chromium/content/browser/sms/SmsVerificationReceiver.java
index 072fafcb..6261478 100644
--- a/content/public/android/java/src/org/chromium/content/browser/sms/SmsVerificationReceiver.java
+++ b/content/public/android/java/src/org/chromium/content/browser/sms/SmsVerificationReceiver.java
@@ -11,6 +11,8 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 
+import androidx.annotation.IntDef;
+
 import com.google.android.gms.auth.api.phone.SmsCodeBrowserClient;
 import com.google.android.gms.auth.api.phone.SmsCodeRetriever;
 import com.google.android.gms.auth.api.phone.SmsRetriever;
@@ -27,13 +29,14 @@
 import org.chromium.content.browser.sms.Wrappers.WebOTPServiceContext;
 import org.chromium.ui.base.WindowAndroid;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
 /**
- * Encapsulates logic to retrieve OTP code via SMS Browser Code API.
- * See also:
+ * Encapsulates logic to retrieve OTP code via SMS Browser Code API. See also:
  * https://developers.google.com/android/reference/com/google/android/gms/auth/api/phone/SmsCodeBrowserClient
  *
- * TODO(majidvp): rename legacy Verification name to more appropriate name (
- *  e.g., BrowserCode.
+ * <p>TODO(majidvp): rename legacy Verification name to more appropriate name ( e.g., BrowserCode.
  */
 public class SmsVerificationReceiver extends BroadcastReceiver {
     private static final int CODE_PERMISSION_REQUEST = 1;
@@ -43,12 +46,19 @@
     private boolean mDestroyed;
     private Wrappers.WebOTPServiceContext mContext;
 
-    private enum BackendAvailability {
-        AVAILABLE,
-        API_NOT_CONNECTED,
-        PLATFORM_NOT_SUPPORTED,
-        API_NOT_AVAILABLE,
-        NUM_ENTRIES
+    @IntDef({
+        BackendAvailability.AVAILABLE,
+        BackendAvailability.API_NOT_CONNECTED,
+        BackendAvailability.PLATFORM_NOT_SUPPORTED,
+        BackendAvailability.API_NOT_AVAILABLE
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface BackendAvailability {
+        int AVAILABLE = 0;
+        int API_NOT_CONNECTED = 1;
+        int PLATFORM_NOT_SUPPORTED = 2;
+        int API_NOT_AVAILABLE = 3;
+        int NUM_ENTRIES = 4;
     }
 
     public SmsVerificationReceiver(SmsProviderGms provider, WebOTPServiceContext context) {
@@ -210,12 +220,10 @@
         if (DEBUG) Log.d(TAG, "Installed task");
     }
 
-    public void reportBackendAvailability(BackendAvailability availability) {
-        if (DEBUG) Log.d(TAG, "Backend availability: %d", availability.ordinal());
+    public void reportBackendAvailability(@BackendAvailability int availability) {
+        if (DEBUG) Log.d(TAG, "Backend availability: %d", availability);
         RecordHistogram.recordEnumeratedHistogram(
-                "Blink.Sms.BackendAvailability",
-                availability.ordinal(),
-                BackendAvailability.NUM_ENTRIES.ordinal());
+                "Blink.Sms.BackendAvailability", availability, BackendAvailability.NUM_ENTRIES);
     }
 
     // Handles the case when the backend is available but user has previously denied to grant the
diff --git a/content/public/android/java/src/org/chromium/content/browser/webid/IdentityCredentialsDelegate.java b/content/public/android/java/src/org/chromium/content/browser/webid/IdentityCredentialsDelegate.java
index d507009..b9fc2adf 100644
--- a/content/public/android/java/src/org/chromium/content/browser/webid/IdentityCredentialsDelegate.java
+++ b/content/public/android/java/src/org/chromium/content/browser/webid/IdentityCredentialsDelegate.java
@@ -97,22 +97,14 @@
                                 Log.d(TAG, "Sending an intent for sender");
                                 Log.d(TAG, request);
                                 startIntentSenderForResult(
-                                        /** activity= */
-                                        window,
-                                        /** intent= */
-                                        response.getPendingIntent().getIntentSender(),
-                                        /** requestCode= */
-                                        777,
-                                        /** fillInIntent= */
-                                        null,
-                                        /** flagsMask= */
-                                        0,
-                                        /** flagsValues= */
-                                        0,
-                                        /** extraFlags= */
-                                        0,
-                                        /** options= */
-                                        null);
+                                        /* activity= */ window,
+                                        /* intent= */ response.getPendingIntent().getIntentSender(),
+                                        /* requestCode= */ 777,
+                                        /* fillInIntent= */ null,
+                                        /* flagsMask= */ 0,
+                                        /* flagsValues= */ 0,
+                                        /* extraFlags= */ 0,
+                                        /* options= */ null);
                             } catch (SendIntentException e) {
                                 Log.e(TAG, "Sending an intent for sender failed");
                                 result.reject(e);
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewLocationTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewLocationTest.java
index b5d4f624..4d67bc5 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewLocationTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewLocationTest.java
@@ -105,7 +105,7 @@
             mActivityTestRule.launchContentShellWithUrlSync(
                     "content/test/data/android/geolocation.html");
         } catch (Throwable t) {
-            Assert.fail();
+            throw new RuntimeException(t);
         }
 
         mTestCallbackHelperContainer =
diff --git a/content/public/browser/web_contents_observer.h b/content/public/browser/web_contents_observer.h
index 2c6a8fd..58e3918 100644
--- a/content/public/browser/web_contents_observer.h
+++ b/content/public/browser/web_contents_observer.h
@@ -35,6 +35,7 @@
 #include "third_party/blink/public/mojom/loader/resource_load_info.mojom-forward.h"
 #include "third_party/blink/public/mojom/media/capture_handle_config.mojom-forward.h"
 #include "third_party/skia/include/core/SkColor.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/base/page_transition_types.h"
 #include "ui/base/window_open_disposition.h"
 
@@ -53,7 +54,7 @@
 
 namespace ui {
 struct AXUpdatesAndEvents;
-struct AXLocationChanges;
+struct AXLocationAndScrollUpdates;
 namespace mojom {
 enum class VirtualKeyboardMode;
 }  // namespace mojom
@@ -818,7 +819,8 @@
   virtual void AccessibilityEventReceived(
       const ui::AXUpdatesAndEvents& details) {}
   virtual void AccessibilityLocationChangesReceived(
-      const std::vector<ui::AXLocationChanges>& details) {}
+      const ui::AXTreeID& tree_id,
+      ui::AXLocationAndScrollUpdates& details) {}
 
   // Invoked when theme color is changed.
   virtual void DidChangeThemeColor() {}
diff --git a/content/public/test/mock_web_contents_observer.h b/content/public/test/mock_web_contents_observer.h
index 5599e827..dcfff35c 100644
--- a/content/public/test/mock_web_contents_observer.h
+++ b/content/public/test/mock_web_contents_observer.h
@@ -255,7 +255,8 @@
               (override));
   MOCK_METHOD(void,
               AccessibilityLocationChangesReceived,
-              (const std::vector<ui::AXLocationChanges>& details),
+              (const ui::AXTreeID& tree_id,
+               ui::AXLocationAndScrollUpdates& details),
               (override));
   MOCK_METHOD(void, DidChangeThemeColor, (), (override));
   MOCK_METHOD(void, OnBackgroundColorChanged, (), (override));
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc
index 03b6464..e15ea01a 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -470,6 +470,7 @@
 bool RenderAccessibilityImpl::SendAccessibilitySerialization(
     std::vector<ui::AXTreeUpdate> updates,
     std::vector<ui::AXEvent> events,
+    ui::AXLocationAndScrollUpdates location_and_scroll_updates,
     bool had_load_complete_messages) {
   if (had_load_complete_messages) {
     loading_stage_ = LoadingStage::kLoadCompleted;
@@ -550,7 +551,7 @@
   CHECK(!weak_factory_for_pending_events_.HasWeakPtrs());
   CHECK(reset_token_);
   render_accessibility_manager_->HandleAccessibilityEvents(
-      updates_and_events, *reset_token_,
+      updates_and_events, location_and_scroll_updates, *reset_token_,
       base::BindOnce(&RenderAccessibilityImpl::OnSerializationReceived,
                      weak_factory_for_pending_events_.GetWeakPtr()));
 
diff --git a/content/renderer/accessibility/render_accessibility_impl.h b/content/renderer/accessibility/render_accessibility_impl.h
index 1368f686..a6d0f4ee 100644
--- a/content/renderer/accessibility/render_accessibility_impl.h
+++ b/content/renderer/accessibility/render_accessibility_impl.h
@@ -135,9 +135,11 @@
     ax::mojom::Event event_type = ax::mojom::Event::kNone);
   // Called when it is safe to begin a serialization.
   // Returns true if a serialization occurs.
-  bool SendAccessibilitySerialization(std::vector<ui::AXTreeUpdate> updates,
-                                      std::vector<ui::AXEvent> events,
-                                      bool had_load_complete_messages);
+  bool SendAccessibilitySerialization(
+      std::vector<ui::AXTreeUpdate> updates,
+      std::vector<ui::AXEvent> events,
+      ui::AXLocationAndScrollUpdates location_and_scroll_updates,
+      bool had_load_complete_messages);
 
   // Returns the main top-level document for this page, or NULL if there's
   // no view or frame.
diff --git a/content/renderer/accessibility/render_accessibility_impl_browsertest.cc b/content/renderer/accessibility/render_accessibility_impl_browsertest.cc
index ece1157..ee8e7cb1 100644
--- a/content/renderer/accessibility/render_accessibility_impl_browsertest.cc
+++ b/content/renderer/accessibility/render_accessibility_impl_browsertest.cc
@@ -21,6 +21,7 @@
 #include "third_party/blink/public/web/web_testing_support.h"
 #include "third_party/blink/public/web/web_view.h"
 #include "ui/accessibility/ax_action_target.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/null_ax_action_target.h"
 #include "ui/native_theme/native_theme_features.h"
 
@@ -249,10 +250,10 @@
   EXPECT_EQ(root_obj.AxID(), update.nodes[0].id);
 
   // Make sure that a location change is sent for the fixed-positioned node.
-  std::vector<blink::mojom::LocationChangesPtr>& changes = GetLocationChanges();
+  std::vector<ui::AXLocationChange>& changes = GetLocationChanges();
   EXPECT_EQ(changes.size(), 1u);
-  EXPECT_EQ(changes[0]->id, expected_id);
-  EXPECT_EQ(changes[0]->new_location, expected_bounds);
+  EXPECT_EQ(changes[0].id, expected_id);
+  EXPECT_EQ(changes[0].new_location, expected_bounds);
 }
 
 // Tests if the bounds are updated when it has multiple fixed nodes.
@@ -313,12 +314,12 @@
   EXPECT_EQ(root_obj.AxID(), update.nodes[0].id);
 
   // Make sure that a location change is sent for the fixed-positioned node.
-  std::vector<blink::mojom::LocationChangesPtr>& changes = GetLocationChanges();
+  std::vector<ui::AXLocationChange>& changes = GetLocationChanges();
   EXPECT_EQ(changes.size(), 2u);
   for (auto& change : changes) {
-    auto search = expected.find(change->id);
+    auto search = expected.find(change.id);
     EXPECT_NE(search, expected.end());
-    EXPECT_EQ(search->second, change->new_location);
+    EXPECT_EQ(search->second, change.new_location);
   }
 }
 
diff --git a/content/renderer/accessibility/render_accessibility_impl_test.cc b/content/renderer/accessibility/render_accessibility_impl_test.cc
index 49284d9..a5414e5 100644
--- a/content/renderer/accessibility/render_accessibility_impl_test.cc
+++ b/content/renderer/accessibility/render_accessibility_impl_test.cc
@@ -13,6 +13,8 @@
 #include "third_party/blink/public/web/web_ax_object.h"
 #include "third_party/blink/public/web/web_document.h"
 #include "third_party/blink/public/web/web_testing_support.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
+#include "ui/accessibility/ax_updates_and_events.h"
 
 #if defined(LEAK_SANITIZER)
 #include <sanitizer/lsan_interface.h>
@@ -55,28 +57,39 @@
         base::Unretained(&receiver_)));
   }
 
-  void HandleAXEvents(const ui::AXUpdatesAndEvents& updates_and_events,
-                      uint32_t reset_token,
-                      HandleAXEventsCallback callback) override {
+  void HandleAXEvents(
+      const ui::AXUpdatesAndEvents& updates_and_events,
+      const ui::AXLocationAndScrollUpdates& location_and_scroll_updates,
+      uint32_t reset_token,
+      HandleAXEventsCallback callback) override {
     NOTREACHED();
   }
-  void HandleAXEvents(ui::AXUpdatesAndEvents& updates_and_events,
-                      uint32_t reset_token,
-                      HandleAXEventsCallback callback) override {
+  void HandleAXEvents(
+      ui::AXUpdatesAndEvents& updates_and_events,
+      ui::AXLocationAndScrollUpdates& location_and_scroll_updates,
+      uint32_t reset_token,
+      HandleAXEventsCallback callback) override {
     handled_updates_.insert(handled_updates_.end(),
                             updates_and_events.updates.begin(),
                             updates_and_events.updates.end());
+    for (auto& change : location_and_scroll_updates.location_changes) {
+      location_changes_.emplace_back(std::move(change));
+    }
     std::move(callback).Run();
   }
 
-  void HandleAXLocationChanges(
-      std::vector<blink::mojom::LocationChangesPtr> changes,
-      uint32_t reset_token) override {
-    for (auto& change : changes) {
+  void HandleAXLocationChanges(ui::AXLocationAndScrollUpdates& changes,
+                               uint32_t reset_token) override {
+    for (auto& change : changes.location_changes) {
       location_changes_.emplace_back(std::move(change));
     }
   }
 
+  void HandleAXLocationChanges(const ui::AXLocationAndScrollUpdates& changes,
+                               uint32_t reset_token) override {
+    NOTREACHED();
+  }
+
   ui::AXTreeUpdate& last_update() {
     CHECK_GE(handled_updates_.size(), 1U);
     return handled_updates_.back();
@@ -86,7 +99,7 @@
     return handled_updates_;
   }
 
-  std::vector<blink::mojom::LocationChangesPtr>& location_changes() {
+  std::vector<ui::AXLocationChange>& location_changes() {
     return location_changes_;
   }
 
@@ -99,7 +112,7 @@
   mojo::Remote<blink::mojom::RenderAccessibilityHost> local_frame_host_remote_;
 
   std::vector<::ui::AXTreeUpdate> handled_updates_;
-  std::vector<blink::mojom::LocationChangesPtr> location_changes_;
+  std::vector<ui::AXLocationChange> location_changes_;
 };
 
 class RenderAccessibilityTestRenderFrame : public TestRenderFrame {
@@ -123,7 +136,7 @@
     render_accessibility_host_->ClearHandledUpdates();
   }
 
-  std::vector<blink::mojom::LocationChangesPtr>& LocationChanges() {
+  std::vector<ui::AXLocationChange>& LocationChanges() {
     return render_accessibility_host_->location_changes();
   }
 
@@ -226,7 +239,7 @@
       ->ClearHandledUpdates();
 }
 
-std::vector<blink::mojom::LocationChangesPtr>&
+std::vector<ui::AXLocationChange>&
 RenderAccessibilityImplTest::GetLocationChanges() {
   return static_cast<RenderAccessibilityTestRenderFrame*>(frame())
       ->LocationChanges();
diff --git a/content/renderer/accessibility/render_accessibility_impl_test.h b/content/renderer/accessibility/render_accessibility_impl_test.h
index 95d1095..e9a715c6 100644
--- a/content/renderer/accessibility/render_accessibility_impl_test.h
+++ b/content/renderer/accessibility/render_accessibility_impl_test.h
@@ -11,6 +11,7 @@
 #include "content/public/test/render_view_test.h"
 #include "third_party/blink/public/mojom/render_accessibility.mojom.h"
 #include "third_party/blink/public/web/web_ax_object.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_tree_update_forward.h"
 
 namespace content {
@@ -47,7 +48,7 @@
   const std::vector<ui::AXTreeUpdate>& GetHandledAccUpdates();
   void ClearHandledUpdates();
 
-  std::vector<blink::mojom::LocationChangesPtr>& GetLocationChanges();
+  std::vector<ui::AXLocationChange>& GetLocationChanges();
 
   int CountAccessibilityNodesSentToBrowser();
 
diff --git a/content/renderer/accessibility/render_accessibility_manager.cc b/content/renderer/accessibility/render_accessibility_manager.cc
index 21005d7..d4e61fe 100644
--- a/content/renderer/accessibility/render_accessibility_manager.cc
+++ b/content/renderer/accessibility/render_accessibility_manager.cc
@@ -110,11 +110,13 @@
 
 void RenderAccessibilityManager::HandleAccessibilityEvents(
     ui::AXUpdatesAndEvents& updates_and_events,
+    ui::AXLocationAndScrollUpdates& location_and_scroll_updates,
     uint32_t reset_token,
     blink::mojom::RenderAccessibilityHost::HandleAXEventsCallback callback) {
   CHECK(reset_token);
   GetOrCreateRemoteRenderAccessibilityHost()->HandleAXEvents(
-      updates_and_events, reset_token, std::move(callback));
+      updates_and_events, location_and_scroll_updates, reset_token,
+      std::move(callback));
 }
 
 mojo::Remote<blink::mojom::RenderAccessibilityHost>&
diff --git a/content/renderer/accessibility/render_accessibility_manager.h b/content/renderer/accessibility/render_accessibility_manager.h
index bb7471f..09a78c49 100644
--- a/content/renderer/accessibility/render_accessibility_manager.h
+++ b/content/renderer/accessibility/render_accessibility_manager.h
@@ -79,6 +79,7 @@
   // Communication with the browser process.
   void HandleAccessibilityEvents(
       ui::AXUpdatesAndEvents& updates_and_events,
+      ui::AXLocationAndScrollUpdates& location_and_scroll_updates,
       uint32_t reset_token,
       blink::mojom::RenderAccessibilityHost::HandleAXEventsCallback callback);
 
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index edcc9e2..6a69e53 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -780,62 +780,6 @@
       frame_token_to_local_path_;
 };
 
-// Implementation of WebFrameSerializer::MHTMLPartsGenerationDelegate that
-// 1. Bases shouldSkipResource and getContentID responses on contents of
-//    SerializeAsMHTMLParams.
-// 2. Stores digests of urls of serialized resources (i.e. urls reported via
-//    shouldSkipResource) into |serialized_resources_uri_digests| passed
-//    to the constructor.
-class MHTMLPartsGenerationDelegate
-    : public WebFrameSerializer::MHTMLPartsGenerationDelegate {
- public:
-  MHTMLPartsGenerationDelegate(
-      const mojom::SerializeAsMHTMLParams& params,
-      std::unordered_set<std::string>* serialized_resources_uri_digests)
-      : params_(params),
-        serialized_resources_uri_digests_(serialized_resources_uri_digests) {
-    DCHECK(serialized_resources_uri_digests_);
-    // Digests must be sorted for binary search.
-    DCHECK(std::is_sorted(params_->digests_of_uris_to_skip.begin(),
-                          params_->digests_of_uris_to_skip.end()));
-    // URLs are not duplicated.
-    DCHECK(base::ranges::adjacent_find(params_->digests_of_uris_to_skip) ==
-           params_->digests_of_uris_to_skip.end());
-  }
-
-  MHTMLPartsGenerationDelegate(const MHTMLPartsGenerationDelegate&) = delete;
-  MHTMLPartsGenerationDelegate& operator=(const MHTMLPartsGenerationDelegate&) =
-      delete;
-
-  bool ShouldSkipResource(const WebURL& url) override {
-    std::string digest =
-        crypto::SHA256HashString(params_->salt + GURL(url).spec());
-
-    // Skip if the |url| already covered by serialization of an *earlier* frame.
-    if (std::binary_search(params_->digests_of_uris_to_skip.begin(),
-                           params_->digests_of_uris_to_skip.end(), digest)) {
-      return true;
-    }
-
-    // Let's record |url| as being serialized for the *current* frame.
-    auto pair = serialized_resources_uri_digests_->insert(digest);
-    bool insertion_took_place = pair.second;
-    DCHECK(insertion_took_place);  // Blink should dedupe within a frame.
-
-    return false;
-  }
-
-  bool UseBinaryEncoding() override { return params_->mhtml_binary_encoding; }
-
-  bool RemovePopupOverlay() override {
-    return params_->mhtml_popup_overlay_removal;
-  }
-
- private:
-  const raw_ref<const mojom::SerializeAsMHTMLParams> params_;
-  raw_ptr<std::unordered_set<std::string>> serialized_resources_uri_digests_;
-};
-
 bool IsHttpPost(const blink::WebURLRequest& request) {
   return request.HttpMethod().Utf8() == "POST";
 }
@@ -1344,6 +1288,66 @@
 
 }  // namespace
 
+// Implementation of WebFrameSerializer::MHTMLPartsGenerationDelegate that
+// 1. Bases shouldSkipResource and getContentID responses on contents of
+//    SerializeAsMHTMLParams.
+// 2. Stores digests of urls of serialized resources (i.e. urls reported via
+//    shouldSkipResource) into |serialized_resources_uri_digests| passed
+//    to the constructor.
+class MHTMLPartsGenerationDelegateImpl final
+    : public WebFrameSerializer::MHTMLPartsGenerationDelegate {
+ public:
+  explicit MHTMLPartsGenerationDelegateImpl(
+      mojom::SerializeAsMHTMLParamsPtr params)
+      : params_(std::move(params)) {
+    // Digests must be sorted for binary search.
+    DCHECK(std::is_sorted(params_->digests_of_uris_to_skip.begin(),
+                          params_->digests_of_uris_to_skip.end()));
+    // URLs are not duplicated.
+    DCHECK(base::ranges::adjacent_find(params_->digests_of_uris_to_skip) ==
+           params_->digests_of_uris_to_skip.end());
+  }
+
+  MHTMLPartsGenerationDelegateImpl(const MHTMLPartsGenerationDelegateImpl&) =
+      delete;
+  MHTMLPartsGenerationDelegateImpl& operator=(
+      const MHTMLPartsGenerationDelegateImpl&) = delete;
+
+  bool ShouldSkipResource(const WebURL& url) override {
+    std::string digest =
+        crypto::SHA256HashString(params_->salt + GURL(url).spec());
+
+    // Skip if the |url| already covered by serialization of an *earlier* frame.
+    if (std::binary_search(params_->digests_of_uris_to_skip.begin(),
+                           params_->digests_of_uris_to_skip.end(), digest)) {
+      return true;
+    }
+
+    // Let's record |url| as being serialized for the *current* frame.
+    auto pair = serialized_resources_uri_digests_.insert(digest);
+    bool insertion_took_place = pair.second;
+    DCHECK(insertion_took_place);  // Blink should dedupe within a frame.
+
+    return false;
+  }
+
+  bool UseBinaryEncoding() override { return params_->mhtml_binary_encoding; }
+
+  bool RemovePopupOverlay() override {
+    return params_->mhtml_popup_overlay_removal;
+  }
+
+  std::unordered_set<std::string> TakeSerializedResourcesUriDigests() {
+    return std::move(serialized_resources_uri_digests_);
+  }
+  mojom::SerializeAsMHTMLParamsPtr TakeParams() { return std::move(params_); }
+
+ private:
+  std::vector<std::string> digests_of_uris_to_skip_;
+  mojom::SerializeAsMHTMLParamsPtr params_;
+  std::unordered_set<std::string> serialized_resources_uri_digests_;
+};
+
 RenderFrameImpl::AssertNavigationCommits::AssertNavigationCommits(
     RenderFrameImpl* frame)
     : AssertNavigationCommits(frame, false) {}
@@ -4880,12 +4884,14 @@
 bool RenderFrameImpl::SendAccessibilitySerialization(
     std::vector<ui::AXTreeUpdate> updates,
     std::vector<ui::AXEvent> events,
+    ui::AXLocationAndScrollUpdates location_and_scroll_updates,
     bool had_load_complete_messages) {
   // This function should never be called from a11y unless it's enabled.
   CHECK(IsAccessibilityEnabled());
 
   return render_accessibility_manager_->GetRenderAccessibilityImpl()
       ->SendAccessibilitySerialization(std::move(updates), std::move(events),
+                                       std::move(location_and_scroll_updates),
                                        had_load_complete_messages);
 }
 
@@ -5795,12 +5801,8 @@
   // Holds WebThreadSafeData instances for some or all of header, contents and
   // footer.
   std::vector<WebThreadSafeData> mhtml_contents;
-  std::unordered_set<std::string> serialized_resources_uri_digests;
-  MHTMLPartsGenerationDelegate delegate(*params,
-                                        &serialized_resources_uri_digests);
-
-  mojom::MhtmlSaveStatus save_status = mojom::MhtmlSaveStatus::kSuccess;
-  bool has_some_data = false;
+  auto delegate =
+      std::make_unique<MHTMLPartsGenerationDelegateImpl>(std::move(params));
 
   // Generate MHTML header if needed.
   if (IsMainFrame()) {
@@ -5809,37 +5811,54 @@
     // The returned data can be empty if the main frame should be skipped. If
     // the main frame is skipped, then the whole archive is bad.
     mhtml_contents.emplace_back(WebFrameSerializer::GenerateMHTMLHeader(
-        mhtml_boundary, GetWebFrame(), &delegate));
-    has_some_data = true;
+        mhtml_boundary, GetWebFrame(), delegate.get()));
   }
 
   // Generate MHTML parts.  Note that if this is not the main frame, then even
   // skipping the whole parts generation step is not an error - it simply
   // results in an omitted resource in the final file.
-  if (save_status == mojom::MhtmlSaveStatus::kSuccess) {
-    TRACE_EVENT0("page-serialization",
-                 "RenderFrameImpl::SerializeAsMHTML parts serialization");
-    // The returned data can be empty if the frame should be skipped, but this
-    // is OK.
-    mhtml_contents.emplace_back(WebFrameSerializer::GenerateMHTMLParts(
-        mhtml_boundary, GetWebFrame(), &delegate));
-    has_some_data |= !mhtml_contents.back().IsEmpty();
+  TRACE_EVENT0("page-serialization",
+               "RenderFrameImpl::SerializeAsMHTML parts serialization");
+  MHTMLPartsGenerationDelegateImpl* delegate_ptr = delegate.get();
+  WebFrameSerializer::GenerateMHTMLParts(
+      mhtml_boundary, GetWebFrame(), delegate_ptr,
+      base::BindOnce(&RenderFrameImpl::OnSerializeMHTMLComplete,
+                     weak_factory_.GetWeakPtr(), std::move(delegate),
+                     std::move(callback), std::move(mhtml_contents)));
+}
+
+void RenderFrameImpl::OnSerializeMHTMLComplete(
+    std::unique_ptr<MHTMLPartsGenerationDelegateImpl> delegate,
+    SerializeAsMHTMLCallback callback,
+    std::vector<blink::WebThreadSafeData> mhtml_contents,
+    blink::WebThreadSafeData frame_mhtml_data) {
+  TRACE_EVENT0("page-serialization",
+               "RenderFrameImpl::SerializeAsMHTML parts serialization");
+  // The returned data can be empty if the frame should be skipped, but this
+  // is OK.
+  mhtml_contents.emplace_back(frame_mhtml_data);
+  bool has_some_data = false;
+  for (const auto& c : mhtml_contents) {
+    if (!c.IsEmpty()) {
+      has_some_data = true;
+      break;
+    }
   }
 
   // Note: the MHTML footer is written by the browser process, after the last
   // frame is serialized by a renderer process.
 
   MHTMLHandleWriterDelegate handle_delegate(
-      *params,
+      *delegate->TakeParams(),
       base::BindOnce(&RenderFrameImpl::OnWriteMHTMLComplete,
                      weak_factory_.GetWeakPtr(), std::move(callback),
-                     std::move(serialized_resources_uri_digests)),
+                     delegate->TakeSerializedResourcesUriDigests()),
       GetTaskRunner(blink::TaskType::kInternalDefault));
 
-  if (save_status == mojom::MhtmlSaveStatus::kSuccess && has_some_data) {
+  if (has_some_data) {
     handle_delegate.WriteContents(mhtml_contents);
   } else {
-    handle_delegate.Finish(save_status);
+    handle_delegate.Finish(mojom::MhtmlSaveStatus::kSuccess);
   }
 }
 
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index a62e8a8..7cbbc9c 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -103,11 +103,13 @@
 #include "third_party/blink/public/platform/browser_interface_broker_proxy.h"
 #include "third_party/blink/public/platform/child_url_loader_factory_bundle.h"
 #include "third_party/blink/public/platform/web_media_player.h"
+#include "third_party/blink/public/platform/web_thread_safe_data.h"
 #include "third_party/blink/public/platform/web_url.h"
 #include "third_party/blink/public/platform/websocket_handshake_throttle_provider.h"
 #include "third_party/blink/public/web/web_ax_object.h"
 #include "third_party/blink/public/web/web_document_loader.h"
 #include "third_party/blink/public/web/web_frame_load_type.h"
+#include "third_party/blink/public/web/web_frame_serializer.h"
 #include "third_party/blink/public/web/web_frame_serializer_client.h"
 #include "third_party/blink/public/web/web_history_commit_type.h"
 #include "third_party/blink/public/web/web_link_preview_triggerer.h"
@@ -169,6 +171,7 @@
 class BlinkInterfaceRegistryImpl;
 class DocumentState;
 class MediaPermissionDispatcher;
+class MHTMLPartsGenerationDelegateImpl;
 class NavigationClient;
 class PepperPluginInstanceImpl;
 class RendererPpapiHost;
@@ -659,9 +662,11 @@
   bool AllowContentInitiatedDataUrlNavigations(
       const blink::WebURL& url) override;
   void PostAccessibilityEvent(const ui::AXEvent& event) override;
-  bool SendAccessibilitySerialization(std::vector<ui::AXTreeUpdate> updates,
-                                      std::vector<ui::AXEvent> events,
-                                      bool had_load_complete_messages) override;
+  bool SendAccessibilitySerialization(
+      std::vector<ui::AXTreeUpdate> updates,
+      std::vector<ui::AXEvent> events,
+      ui::AXLocationAndScrollUpdates location_and_scroll_updates,
+      bool had_load_complete_messages) override;
   void CheckIfAudioSinkExistsAndIsAuthorized(
       const blink::WebString& sink_id,
       blink::WebSetSinkIdCompleteCallback callback) override;
@@ -948,6 +953,12 @@
       mojo::PendingRemote<mojom::FrameHTMLSerializerHandler> handler_remote)
       override;
 
+  void OnSerializeMHTMLComplete(
+      std::unique_ptr<MHTMLPartsGenerationDelegateImpl> delegate,
+      SerializeAsMHTMLCallback callback,
+      std::vector<blink::WebThreadSafeData> mhtml_contents,
+      blink::WebThreadSafeData frame_mhtml_data);
+
   // Callback scheduled from SerializeAsMHTML for when writing serialized
   // MHTML to the handle has been completed in the file thread.
   void OnWriteMHTMLComplete(
diff --git a/content/shell/android/browsertests/src/org/chromium/content_shell/browsertests/ContentShellBrowserTestActivity.java b/content/shell/android/browsertests/src/org/chromium/content_shell/browsertests/ContentShellBrowserTestActivity.java
index 7f32045..e37e513 100644
--- a/content/shell/android/browsertests/src/org/chromium/content_shell/browsertests/ContentShellBrowserTestActivity.java
+++ b/content/shell/android/browsertests/src/org/chromium/content_shell/browsertests/ContentShellBrowserTestActivity.java
@@ -102,13 +102,13 @@
                         });
     }
 
-    @Override
     /**
      * Ensure that the user data directory gets overridden to getPrivateDataDirectory() (which is
      * cleared at the start of every run); the directory that ANDROID_APP_DATA_DIR is set to in the
-     * context of Java browsertests is not cleared as it also holds persistent state, which
-     * causes test failures due to state bleedthrough. See crbug.com/617734 for details.
+     * context of Java browsertests is not cleared as it also holds persistent state, which causes
+     * test failures due to state bleedthrough. See crbug.com/617734 for details.
      */
+    @Override
     protected String getUserDataDirectoryCommandLineSwitch() {
         return "user-data-dir";
     }
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 0d78858..2cfb947 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -2158,6 +2158,7 @@
       "//testing/android/native_test:native_test_support",
       "//ui/accessibility:ax_base_android",
       "//ui/android:android",
+      "//ui/android:test_support",
       "//ui/touch_selection:touch_selection",
     ]
     android_manifest =
diff --git a/content/test/data/accessibility/event/scroll-horizontal-scroll-percent-change-expected-win.txt b/content/test/data/accessibility/event/scroll-horizontal-scroll-percent-change-expected-win.txt
index 0a43393..98e4c5a6 100644
--- a/content/test/data/accessibility/event/scroll-horizontal-scroll-percent-change-expected-win.txt
+++ b/content/test/data/accessibility/event/scroll-horizontal-scroll-percent-change-expected-win.txt
@@ -1,4 +1,3 @@
 EVENT_SYSTEM_SCROLLINGEND on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE
 EVENT_SYSTEM_SCROLLINGEND on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE
 EVENT_SYSTEM_SCROLLINGEND on <div#div> role=ROLE_SYSTEM_GROUPING name="overflow div" FOCUSABLE
-EVENT_SYSTEM_SCROLLINGEND on <div#div> role=ROLE_SYSTEM_GROUPING name="overflow div" FOCUSABLE
diff --git a/content/test/data/accessibility/event/scroll-vertical-scroll-percent-change-expected-win.txt b/content/test/data/accessibility/event/scroll-vertical-scroll-percent-change-expected-win.txt
index 0a43393..98e4c5a6 100644
--- a/content/test/data/accessibility/event/scroll-vertical-scroll-percent-change-expected-win.txt
+++ b/content/test/data/accessibility/event/scroll-vertical-scroll-percent-change-expected-win.txt
@@ -1,4 +1,3 @@
 EVENT_SYSTEM_SCROLLINGEND on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE
 EVENT_SYSTEM_SCROLLINGEND on <#document> role=ROLE_SYSTEM_DOCUMENT value~=[doc-url] FOCUSED,FOCUSABLE
 EVENT_SYSTEM_SCROLLINGEND on <div#div> role=ROLE_SYSTEM_GROUPING name="overflow div" FOCUSABLE
-EVENT_SYSTEM_SCROLLINGEND on <div#div> role=ROLE_SYSTEM_GROUPING name="overflow div" FOCUSABLE
diff --git a/content/test/gpu/gpu_tests/test_expectations/expected_color_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/expected_color_expectations.txt
index 375a2d9..c72a11f 100644
--- a/content/test/gpu/gpu_tests/test_expectations/expected_color_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/expected_color_expectations.txt
@@ -118,7 +118,6 @@
 
 
 # Longstanding flaking test - page reported failure
-crbug.com/40877266 [ amd-0x7340 angle-d3d11 graphite-enabled passthrough release-x64 win10 ] ExpectedColor_MediaRecorderFromVideoElementWithOoprCanvasDisabled [ Failure ]
 crbug.com/40877266 [ android android-shield-android-tv ] ExpectedColor_MediaRecorderFromVideoElement [ RetryOnFailure ]
 
 # Tests are hitting an assertion, root cause needs to be tracked down.
diff --git a/content/utility/BUILD.gn b/content/utility/BUILD.gn
index 1d8b9034..964de52b7 100644
--- a/content/utility/BUILD.gn
+++ b/content/utility/BUILD.gn
@@ -79,11 +79,12 @@
     "//url",
   ]
 
+  if (is_linux) {
+    deps += [ "//services/video_effects:sandbox_hook" ]
+  }
+
   if (enable_video_effects) {
     deps += [ "//services/video_effects:service" ]
-    if (is_linux) {
-      deps += [ "//services/video_effects:sandbox_hook" ]
-    }
   }
 
   # When library CDMs are supported, we support running the CDM in the utility
diff --git a/content/utility/utility_main.cc b/content/utility/utility_main.cc
index de14a93..7d651e746 100644
--- a/content/utility/utility_main.cc
+++ b/content/utility/utility_main.cc
@@ -299,10 +299,8 @@
 #endif
 #if BUILDFLAG(IS_LINUX)
     case sandbox::mojom::Sandbox::kVideoEffects:
-#if BUILDFLAG(ENABLE_VIDEO_EFFECTS)
       pre_sandbox_hook =
           base::BindOnce(&video_effects::VideoEffectsPreSandboxHook);
-#endif  // BUILDFLAG(ENABLE_VIDEO_EFFECTS)
       break;
 #endif  // BUILDFLAG(IS_LINUX)
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/docs/updater/functional_spec.md b/docs/updater/functional_spec.md
index f101f55..8751ded 100644
--- a/docs/updater/functional_spec.md
+++ b/docs/updater/functional_spec.md
@@ -1442,9 +1442,10 @@
 out of eula-required mode and begin normal operation.
 
 On Windows, applications can signal the updater that the user has accepted Terms
-of Service by writing `HKCU\SOFTWARE\{Company}\Update\ClientState\{AppID}` →
-`usagestats` (DWORD): `1`. The updater will then transition out of eula-required
-mode and begin normal operation the next time it runs periodic tasks.
+of Service by writing
+`HKLM\SOFTWARE\{Company}\Update\ClientStateMedium\{AppID}` → `eulaaccepted`
+(DWORD): `1`. The updater will then transition out of eula-required mode and
+begin normal operation the next time it runs periodic tasks.
 
 Once operating normally, the updater only returns to eula-required mode when
 it is uninstalled and then reinstalled with `--eularequired`.
diff --git a/extensions/browser/api/automation_internal/automation_event_router.cc b/extensions/browser/api/automation_internal/automation_event_router.cc
index 4411c03..1a1dad9 100644
--- a/extensions/browser/api/automation_internal/automation_event_router.cc
+++ b/extensions/browser/api/automation_internal/automation_event_router.cc
@@ -96,14 +96,15 @@
 }
 
 void AutomationEventRouter::DispatchAccessibilityLocationChange(
-    const ui::AXLocationChanges& details) {
+    const ui::AXTreeID& tree_id,
+    const ui::AXLocationChange& details) {
   if (remote_router_) {
-    remote_router_->DispatchAccessibilityLocationChange(details);
+    remote_router_->DispatchAccessibilityLocationChange(tree_id, details);
     return;
   }
 
   for (const auto& remote : automation_remote_set_) {
-    remote->DispatchAccessibilityLocationChange(details.ax_tree_id, details.id,
+    remote->DispatchAccessibilityLocationChange(tree_id, details.id,
                                                 details.new_location);
   }
 }
diff --git a/extensions/browser/api/automation_internal/automation_event_router.h b/extensions/browser/api/automation_internal/automation_event_router.h
index 26d1266..5ce6a26 100644
--- a/extensions/browser/api/automation_internal/automation_event_router.h
+++ b/extensions/browser/api/automation_internal/automation_event_router.h
@@ -27,6 +27,7 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
 #include "services/accessibility/public/mojom/automation.mojom.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_tree_id.h"
 #include "ui/accessibility/ax_updates_and_events.h"
 
@@ -100,7 +101,8 @@
       const gfx::Point& mouse_location,
       const std::vector<ui::AXEvent>& events) override;
   void DispatchAccessibilityLocationChange(
-      const ui::AXLocationChanges& details) override;
+      const ui::AXTreeID& tree_id,
+      const ui::AXLocationChange& details) override;
   void DispatchTreeDestroyedEvent(ui::AXTreeID tree_id) override;
   void DispatchActionResult(
       const ui::AXActionData& data,
diff --git a/extensions/browser/api/automation_internal/automation_event_router_interface.h b/extensions/browser/api/automation_internal/automation_event_router_interface.h
index f3ddbc9..7f07946 100644
--- a/extensions/browser/api/automation_internal/automation_event_router_interface.h
+++ b/extensions/browser/api/automation_internal/automation_event_router_interface.h
@@ -11,6 +11,7 @@
 
 #include "extensions/common/api/automation_internal.h"
 #include "extensions/common/extension_id.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_updates_and_events.h"
 
 namespace content {
@@ -31,7 +32,8 @@
       const gfx::Point& mouse_location,
       const std::vector<ui::AXEvent>& events) = 0;
   virtual void DispatchAccessibilityLocationChange(
-      const ui::AXLocationChanges& details) = 0;
+      const ui::AXTreeID& tree_id,
+      const ui::AXLocationChange& details) = 0;
 
   // Notify all automation extensions that an accessibility tree was
   // destroyed. If |browser_context| is null, use the currently active context.
diff --git a/extensions/browser/api/automation_internal/automation_internal_api.cc b/extensions/browser/api/automation_internal/automation_internal_api.cc
index a99e740e..74698f3 100644
--- a/extensions/browser/api/automation_internal/automation_internal_api.cc
+++ b/extensions/browser/api/automation_internal/automation_internal_api.cc
@@ -43,6 +43,7 @@
 #include "ui/accessibility/ax_action_handler_base.h"
 #include "ui/accessibility/ax_action_handler_registry.h"
 #include "ui/accessibility/ax_enum_util.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_updates_and_events.h"
 
 #if defined(USE_AURA)
@@ -353,10 +354,11 @@
   }
 
   void AccessibilityLocationChangesReceived(
-      const std::vector<ui::AXLocationChanges>& details) override {
+      const ui::AXTreeID& tree_id,
+      ui::AXLocationAndScrollUpdates& details) override {
     AutomationEventRouter* router = AutomationEventRouter::GetInstance();
-    for (const auto& src : details) {
-      router->DispatchAccessibilityLocationChange(src);
+    for (const auto& src : details.location_changes) {
+      router->DispatchAccessibilityLocationChange(tree_id, src);
     }
   }
 
diff --git a/extensions/browser/api/lock_screen_data/data_item.cc b/extensions/browser/api/lock_screen_data/data_item.cc
index 0fab5eae..f3ec57c 100644
--- a/extensions/browser/api/lock_screen_data/data_item.cc
+++ b/extensions/browser/api/lock_screen_data/data_item.cc
@@ -43,7 +43,7 @@
 
 // Encrypts |data| with AES key |raw_key|. Returns whether the encryption was
 // successful, in which case |*result| will be set to the encrypted data.
-bool EncryptData(const std::vector<char> data,
+bool EncryptData(const std::vector<char>& data,
                  const std::string& raw_key,
                  std::string* result) {
   std::string initialization_vector(kAesInitializationVectorLength, ' ');
@@ -56,7 +56,7 @@
   if (!encryptor.Init(key.get(), crypto::Encryptor::CBC, initialization_vector))
     return false;
 
-  return encryptor.Encrypt(std::string(data.data(), data.size()), result);
+  return encryptor.Encrypt(std::string_view(data.data(), data.size()), result);
 }
 
 // Decrypts |data| content using AES key |raw_key|. Returns the operation result
diff --git a/extensions/common/extension_features.cc b/extensions/common/extension_features.cc
index b7c5cbc..531017a 100644
--- a/extensions/common/extension_features.cc
+++ b/extensions/common/extension_features.cc
@@ -190,4 +190,8 @@
              "DeclarativeNetRequestHeaderSubstitution",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kSilentDebuggerExtensionAPI,
+             "SilentDebuggerExtensionAPI",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 }  // namespace extensions_features
diff --git a/extensions/common/extension_features.h b/extensions/common/extension_features.h
index 24adc57..62734dd 100644
--- a/extensions/common/extension_features.h
+++ b/extensions/common/extension_features.h
@@ -230,6 +230,8 @@
 // type for modifying headers.
 BASE_DECLARE_FEATURE(kDeclarativeNetRequestHeaderSubstitution);
 
+// Show no warning banner when an extension uses CDP's `chrome.debugger`.
+BASE_DECLARE_FEATURE(kSilentDebuggerExtensionAPI);
 }  // namespace extensions_features
 
 #endif  // EXTENSIONS_COMMON_EXTENSION_FEATURES_H_
diff --git a/gpu/command_buffer/service/shared_image/shared_image_manager.cc b/gpu/command_buffer/service/shared_image/shared_image_manager.cc
index 8a321c4..16421a5 100644
--- a/gpu/command_buffer/service/shared_image/shared_image_manager.cc
+++ b/gpu/command_buffer/service/shared_image/shared_image_manager.cc
@@ -57,9 +57,12 @@
 namespace {
 
 #if BUILDFLAG(IS_OZONE)
+// TODO(crbug.com/330865436): It turns out that `supports_overlays` is
+// currently set only in the browser process; we need to ensure that it is set
+// in the GPU process before we can re-enable this feature.
 BASE_FEATURE(kSupportScanoutOnOzoneOnlyIfOverlaysSupported,
              "SupportScanoutOnOzoneOnlyIfOverlaysSupported",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+             base::FEATURE_DISABLED_BY_DEFAULT);
 #endif
 
 // `DCHECKS` and dumps without crashing that `backing`'s usage overlaps with
diff --git a/infra/config/generated/builders/ci/mac-official/gn-args.json b/infra/config/generated/builders/ci/mac-official/gn-args.json
index 6f38c92..62eae43a 100644
--- a/infra/config/generated/builders/ci/mac-official/gn-args.json
+++ b/infra/config/generated/builders/ci/mac-official/gn-args.json
@@ -1,6 +1,7 @@
 {
   "gn_args": {
     "is_official_build": true,
+    "save_reproducers_on_lld_crash": true,
     "target_cpu": "arm64",
     "target_os": "mac",
     "use_remoteexec": true,
diff --git a/infra/config/generated/builders/try/build-size/gn-args.json b/infra/config/generated/builders/try/build-size/gn-args.json
index 258295d..3e8ad10c 100644
--- a/infra/config/generated/builders/try/build-size/gn-args.json
+++ b/infra/config/generated/builders/try/build-size/gn-args.json
@@ -4,6 +4,7 @@
     "is_component_build": false,
     "is_debug": false,
     "symbol_level": 0,
+    "system_headers_in_deps": true,
     "target_cpu": "x64",
     "target_os": "linux",
     "use_remoteexec": true,
diff --git a/infra/config/generated/builders/try/mac-official/gn-args.json b/infra/config/generated/builders/try/mac-official/gn-args.json
index bab93dc..c009db7 100644
--- a/infra/config/generated/builders/try/mac-official/gn-args.json
+++ b/infra/config/generated/builders/try/mac-official/gn-args.json
@@ -2,6 +2,7 @@
   "gn_args": {
     "dcheck_always_on": true,
     "is_official_build": true,
+    "save_reproducers_on_lld_crash": true,
     "symbol_level": 1,
     "target_cpu": "arm64",
     "target_os": "mac",
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index f27d57c..79c25f8c 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -97368,14 +97368,6 @@
         '      "test_names": ['
         '        "url_unittests"'
         '      ]'
-        '    },'
-        '    {'
-        '      "bucket": "ci",'
-        '      "build_dir": "out/linux-rel",'
-        '      "builder_name": "Linux Tests",'
-        '      "test_names": ['
-        '        "telemetry_gpu_unittests"'
-        '      ]'
         '    }'
         '  ],'
         '  "cq": "path-based",'
diff --git a/infra/config/gn_args/gn_args.star b/infra/config/gn_args/gn_args.star
index 504cfa5a..129ce56 100644
--- a/infra/config/gn_args/gn_args.star
+++ b/infra/config/gn_args/gn_args.star
@@ -1208,6 +1208,13 @@
 )
 
 gn_args.config(
+    name = "save_lld_reproducers",
+    args = {
+        "save_reproducers_on_lld_crash": True,
+    },
+)
+
+gn_args.config(
     name = "skip_generate_fuzzer_owners",
     args = {
         "generate_fuzzer_owners": False,
@@ -1250,6 +1257,13 @@
 )
 
 gn_args.config(
+    name = "system_headers_in_deps",
+    args = {
+        "system_headers_in_deps": True,
+    },
+)
+
+gn_args.config(
     name = "full_mte",
     args = {
         "use_full_mte": True,
diff --git a/infra/config/lib/targets-internal/pyl-generators.star b/infra/config/lib/targets-internal/pyl-generators.star
index 91a854b..aa0a71f4 100644
--- a/infra/config/lib/targets-internal/pyl-generators.star
+++ b/infra/config/lib/targets-internal/pyl-generators.star
@@ -329,9 +329,16 @@
 
         _generate_mixin_values(formatter, mixin, generate_skylab_container = True)
 
-        if n.props.mixins:
+        mixins = []
+
+        # The order that mixins are declared is significant,
+        # DEFINITION_ORDER preserves the order that the edges were added
+        # from the parent to the child
+        for mixin in graph.children(n.key, _targets_nodes.MIXIN.kind, graph.DEFINITION_ORDER):
+            mixins.append(mixin.key.id)
+        if mixins:
             formatter.open_scope("'mixins': [")
-            for m in n.props.mixins:
+            for m in mixins:
                 formatter.add_line("'{}',".format(m))
             formatter.close_scope("],")
 
diff --git a/infra/config/lib/targets.star b/infra/config/lib/targets.star
index 940c4ca..cf7e32d 100644
--- a/infra/config/lib/targets.star
+++ b/infra/config/lib/targets.star
@@ -547,15 +547,20 @@
     """
     if enabled == None:
         enabled = True
-    key = _targets_nodes.VARIANT.add(name, props = dict(
+    variant_key = _targets_nodes.VARIANT.add(name, props = dict(
         identifier = identifier,
         enabled = enabled,
-        mixins = mixins,
         mixin_values = _mixin_values(**kwargs),
     ))
 
+    for m in mixins or []:
+        if generate_pyl_entry and type(m) != type(""):
+            fail("variants used by //testing/buildbot cannot use anonymous mixins", trace = stacktrace(skip = 2))
+        mixin_key = _targets_nodes.MIXIN.key(m)
+        graph.add_edge(variant_key, mixin_key)
+
     if generate_pyl_entry:
-        graph.add_edge(keys.project(), key)
+        graph.add_edge(keys.project(), variant_key)
 
 def _bundle(*, name = None, additional_compile_targets = None, targets = None, mixins = None, variants = None, per_test_modifications = None):
     """Define a targets bundle.
diff --git a/infra/config/subprojects/chromium/ci/chromium.star b/infra/config/subprojects/chromium/ci/chromium.star
index 11a31eb0..f69248f 100644
--- a/infra/config/subprojects/chromium/ci/chromium.star
+++ b/infra/config/subprojects/chromium/ci/chromium.star
@@ -637,6 +637,7 @@
             "remoteexec",
             "mac",
             "arm64",
+            "save_lld_reproducers",
         ],
     ),
     targets = targets.bundle(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.infra.star b/infra/config/subprojects/chromium/try/tryserver.chromium.infra.star
index eb2e5d2..4b83bec 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.infra.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.infra.star
@@ -140,14 +140,6 @@
                 ],
                 "build_dir": "out/linux-rel",
             },
-            {
-                "bucket": "ci",
-                "builder_name": "Linux Tests",
-                "test_names": [
-                    "telemetry_gpu_unittests",
-                ],
-                "build_dir": "out/linux-rel",
-            },
         ],
     },
     service_account = try_.DEFAULT_SERVICE_ACCOUNT,
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
index 68bf0f4e..93603eb 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
@@ -43,6 +43,7 @@
         configs = [
             "release_try_builder",
             "remoteexec",
+            "system_headers_in_deps",
             "dcheck_off",
             "linux",
             "x64",
diff --git a/infra/inclusive_language_presubmit_exempt_dirs.txt b/infra/inclusive_language_presubmit_exempt_dirs.txt
index f790eab..7470ff58 100644
--- a/infra/inclusive_language_presubmit_exempt_dirs.txt
+++ b/infra/inclusive_language_presubmit_exempt_dirs.txt
@@ -653,7 +653,7 @@
 third_party/rust/chromium_crates_io/vendor/anyhow-1.0.89/.github/workflows 3 1
 third_party/rust/chromium_crates_io/vendor/base64-0.13.1 1 1
 third_party/rust/chromium_crates_io/vendor/byteorder-1.5.0/.github/workflows 5 1
-third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/.github/workflows 3 1
+third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/.github/workflows 3 1
 third_party/rust/chromium_crates_io/vendor/cfg-if-1.0.0/.github/workflows 4 1
 third_party/rust/chromium_crates_io/vendor/clap-4.5.17 2 1
 third_party/rust/chromium_crates_io/vendor/clap-4.5.17/src 4 2
@@ -669,7 +669,7 @@
 third_party/rust/chromium_crates_io/vendor/cxx-1.0.128/.github/workflows 4 3
 third_party/rust/chromium_crates_io/vendor/cxx-1.0.128/src 4 1
 third_party/rust/chromium_crates_io/vendor/either-1.13.0/.github/workflows 1 1
-third_party/rust/chromium_crates_io/vendor/flate2-1.0.33 33 2
+third_party/rust/chromium_crates_io/vendor/flate2-1.0.34 33 2
 third_party/rust/chromium_crates_io/vendor/getrandom-0.2.15 5 1
 third_party/rust/chromium_crates_io/vendor/glob-0.3.1/.github/workflows 1 1
 third_party/rust/chromium_crates_io/vendor/hex-0.4.3 1 1
@@ -694,7 +694,7 @@
 third_party/rust/chromium_crates_io/vendor/rand_core-0.6.4 4 1
 third_party/rust/chromium_crates_io/vendor/rand_core-0.6.4/src 3 1
 third_party/rust/chromium_crates_io/vendor/rand_pcg-0.3.1 4 1
-third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables 3 2
+third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables 3 2
 third_party/rust/chromium_crates_io/vendor/regex-1.10.6 1 1
 third_party/rust/chromium_crates_io/vendor/regex-1.10.6/src 1 1
 third_party/rust/chromium_crates_io/vendor/regex-1.10.6/tests 7 6
diff --git a/internal b/internal
index ee6b0d65..882104e 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit ee6b0d656f2c6feb3d3e4b3a7371439443e87957
+Subproject commit 882104e8ef00c37b322eb765dca65f7220a7a854
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client.mm b/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client.mm
index 3a6f827c..5d5b4ba8 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client.mm
+++ b/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client.mm
@@ -237,7 +237,7 @@
     const AutocompleteMatch& match,
     const AutocompleteMatch& alternative_nav_match,
     IDNA2008DeviationCharacter deviation_char_in_hostname) {
-  [delegate_ omniboxDidAcceptText:text
+  [delegate_ omniboxDidAcceptText:match.fill_into_edit
                    destinationURL:destination_url
                  thumbnailRemoved:thumbnail_removed_in_session_];
 }
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client_unittest.mm b/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client_unittest.mm
index 6eeac257..8e80905 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client_unittest.mm
+++ b/ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client_unittest.mm
@@ -83,9 +83,10 @@
   AutocompleteMatch match{/*provider=*/nullptr, /*relevance=*/1000,
                           /*deletable=*/false,
                           /*type=*/AutocompleteMatchType::SEARCH_SUGGEST};
+  match.fill_into_edit = input_text;
   match.destination_url = GURL("https://www.google.com/search?q=search+terms");
 
-  OCMExpect([mock_delegate_ omniboxDidAcceptText:input_text
+  OCMExpect([mock_delegate_ omniboxDidAcceptText:match.fill_into_edit
                                   destinationURL:match.destination_url
                                 thumbnailRemoved:NO]);
   UseAutocompleteMatch(input_text, match);
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_coordinator.mm b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_coordinator.mm
index 04070b5..f234cc3 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_coordinator.mm
+++ b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_coordinator.mm
@@ -76,6 +76,12 @@
 
 const CGFloat kSelectionOffsetPadding = 100.0f;
 
+// The expected number of animations happening at the same time when exiting.
+const int kExpectedExitAnimationCount = 2;
+
+// The duration of the dismiss animation when exiting the selection UI.
+const CGFloat kSelectionViewDismissAnimationDuration = 0.2f;
+
 NSString* const kCustomConsentSheetDetentIdentifier =
     @"kCustomConsentSheetDetentIdentifier";
 
@@ -138,6 +144,8 @@
   BOOL _searchPerformedInSession;
   /// Whether the first interaction has been recorded.
   BOOL _firstInteractionRecorded;
+  /// Indicates the Lens Overlay is in the exit flow.
+  BOOL _isExiting;
 }
 
 #pragma mark - public
@@ -370,6 +378,12 @@
 
 - (void)destroyLensUI:(BOOL)animated
                reason:(lens::LensOverlayDismissalSource)dismissalSource {
+  if (_isExiting) {
+    return;
+  }
+
+  _isExiting = YES;
+
   RecordAction(base::UserMetricsAction("Mobile.LensOverlay.Closed"));
   [self recordDismissalMetrics:dismissalSource];
 
@@ -381,25 +395,101 @@
     _associatedTabHelper = nil;
   }
 
+  if (!animated) {
+    [self exitWithoutAnimation];
+    return;
+  }
+
   // Taking the screenshot triggered fullscreen mode. Ensure it's reverted in
   // the cleanup process. Exiting fullscreen has to happen on destruction to
   // ensure a smooth transition back to the content.
-  __weak UIViewController* presentingViewController =
+  __weak __typeof(self) weakSelf = self;
+  __block int completionCount = 0;
+  void (^onAnimationFinished)() = ^{
+    completionCount++;
+    if (completionCount == kExpectedExitAnimationCount) {
+      [weakSelf dismissLensOverlayWithCompletion:^{
+        [weakSelf destroyViewControllersAndMediators];
+      }];
+    }
+  };
+
+  [self animateBottomSheetExitWithCompletion:onAnimationFinished];
+  [self animateSelectionUIExitWithCompletion:onAnimationFinished];
+}
+
+#pragma mark - Exit animations
+
+- (void)exitWithoutAnimation {
+  __weak __typeof(self) weakSelf = self;
+  void (^completion)() = ^{
+    [weakSelf exitFullscreenAnimated:NO];
+    [weakSelf destroyViewControllersAndMediators];
+  };
+
+  UIViewController* presentingViewController =
       _containerViewController.presentingViewController;
-  if (presentingViewController) {
-    __weak __typeof(self) weakSelf = self;
-    [_selectionViewController resetSelectionAreaToInitialPosition:^{
-      [presentingViewController
-          dismissViewControllerAnimated:animated
-                             completion:^{
-                               [weakSelf exitFullscreenAnimated:animated];
-                               [weakSelf destroyViewControllersAndMediators];
-                             }];
-    }];
-  } else {
-    [self exitFullscreenAnimated:NO];
-    [self destroyViewControllersAndMediators];
+
+  if (!presentingViewController) {
+    completion();
+    return;
   }
+
+  [presentingViewController dismissViewControllerAnimated:NO
+                                               completion:completion];
+}
+
+- (void)animateBottomSheetExitWithCompletion:(void (^)())completion {
+  UIViewController* presentedViewController =
+      _containerViewController.presentedViewController;
+  if (!presentedViewController) {
+    completion();
+    return;
+  }
+
+  [presentedViewController
+      dismissViewControllerAnimated:YES
+                         completion:^{
+                           base::SequencedTaskRunner::GetCurrentDefault()
+                               ->PostTask(FROM_HERE,
+                                          base::BindOnce(completion));
+                         }];
+}
+
+- (void)animateSelectionUIExitWithCompletion:(void (^)())completion {
+  __weak __typeof(self) weakSelf = self;
+  [_selectionViewController resetSelectionAreaToInitialPosition:^{
+    [weakSelf exitFullscreenAnimated:YES];
+    [UIView animateWithDuration:kSelectionViewDismissAnimationDuration
+        animations:^{
+          __typeof(self) strongSelf = weakSelf;
+          if (!strongSelf) {
+            return;
+          }
+          strongSelf->_selectionViewController.view.alpha = 0;
+        }
+        completion:^(BOOL status) {
+          base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+              FROM_HERE, base::BindOnce(completion));
+        }];
+  }];
+}
+
+- (void)dismissLensOverlayWithCompletion:(void (^)())completion {
+  UIViewController* presentingViewController =
+      _containerViewController.presentingViewController;
+  if (!presentingViewController) {
+    completion();
+    return;
+  }
+
+  [presentingViewController
+      dismissViewControllerAnimated:NO
+                         completion:^{
+                           base::SequencedTaskRunner::GetCurrentDefault()
+                               ->PostTask(FROM_HERE,
+                                          base::BindOnce(completion));
+                         }];
 }
 
 #pragma mark - UISheetPresentationControllerDelegate
@@ -712,6 +802,7 @@
   _selectionViewController = nil;
   _mediator = nil;
   _consentViewController = nil;
+  _isExiting = NO;
 }
 
 // The tab helper for the active web state.
diff --git a/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.mm b/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.mm
index 981675d2..dfacf03 100644
--- a/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.mm
+++ b/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.mm
@@ -29,7 +29,7 @@
 - (void)viewDidLoad {
   [super viewDidLoad];
 
-  self.view.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5];
+  self.view.backgroundColor = [UIColor clearColor];
   self.view.accessibilityIdentifier = kLenscontainerViewAccessibilityIdentifier;
 
   if (!self.selectionViewController) {
diff --git a/ios/chrome/browser/push_notification/model/push_notification_settings_util_unittest.mm b/ios/chrome/browser/push_notification/model/push_notification_settings_util_unittest.mm
index b66c77f..4c98b2a 100644
--- a/ios/chrome/browser/push_notification/model/push_notification_settings_util_unittest.mm
+++ b/ios/chrome/browser/push_notification/model/push_notification_settings_util_unittest.mm
@@ -111,7 +111,8 @@
 // When 0 clients are enabled, the state is DISABLED.
 // When `enabled` >= 1 AND `disabled` >= 1, the state is INDETERMINANT
 // When `enabled` >=1 and `disabled` == 0, then state is ENABLED.
-TEST_F(PushNotificationSettingsUtilTest, TestPermissionState) {
+// TODO(crbug.com/370742354): re-enable
+TEST_F(PushNotificationSettingsUtilTest, DISABLED_TestPermissionState) {
   // Enable Notifications in random order.
   ClientPermissionState state = GetNotificationPermissionState(
       base::SysNSStringToUTF8(fake_id_.gaiaID), pref_service_);
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm
index 9387d47..fce7320f2 100644
--- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm
+++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm
@@ -103,25 +103,22 @@
       dismissButton;
 
   // Initialize and configure RecentTabsMediator. Make sure to use the
-  // OriginalChromeBrowserState since the mediator services need a SignIn
-  // manager which is not present in an OffTheRecord BrowserState.
+  // OriginalProfile since the mediator services need a SignIn
+  // manager which is not present in an OffTheRecord Profile.
   DCHECK(!self.mediator);
-  ChromeBrowserState* browserState = self.browser->GetBrowserState();
+  ProfileIOS* profile = self.browser->GetProfile();
   sync_sessions::SessionSyncService* syncService =
-      SessionSyncServiceFactory::GetForBrowserState(browserState);
+      SessionSyncServiceFactory::GetForProfile(profile);
   signin::IdentityManager* identityManager =
-      IdentityManagerFactory::GetForProfile(browserState);
+      IdentityManagerFactory::GetForProfile(profile);
   sessions::TabRestoreService* restoreService =
-      IOSChromeTabRestoreServiceFactory::GetForBrowserState(browserState);
+      IOSChromeTabRestoreServiceFactory::GetForProfile(profile);
   FaviconLoader* faviconLoader =
-      IOSChromeFaviconLoaderFactory::GetForBrowserState(browserState);
-  syncer::SyncService* service =
-      SyncServiceFactory::GetForBrowserState(browserState);
-  BrowserList* browserList =
-      BrowserListFactory::GetForBrowserState(browserState);
+      IOSChromeFaviconLoaderFactory::GetForProfile(profile);
+  syncer::SyncService* service = SyncServiceFactory::GetForProfile(profile);
+  BrowserList* browserList = BrowserListFactory::GetForProfile(profile);
   SceneState* currentSceneState = self.browser->GetSceneState();
-  BOOL isDisabled =
-      IsIncognitoModeForced(self.browser->GetBrowserState()->GetPrefs());
+  BOOL isDisabled = IsIncognitoModeForced(profile->GetPrefs());
   self.mediator = [[RecentTabsMediator alloc]
       initWithSessionSyncService:syncService
                  identityManager:identityManager
@@ -132,7 +129,7 @@
                       sceneState:currentSceneState
                 disabledByPolicy:isDisabled
                engagementTracker:feature_engagement::TrackerFactory::
-                                     GetForBrowserState(browserState)
+                                     GetForProfile(profile)
                       modeHolder:nil];
 
   // Set the consumer first before calling [self.mediator initObservers] and
@@ -194,7 +191,7 @@
       "Mobile.RecentTabsManager.TotalTabsFromOtherDevicesOpenAll",
       session->tabs.size());
 
-  BOOL inIncognito = self.browser->GetBrowserState()->IsOffTheRecord();
+  BOOL inIncognito = self.browser->GetProfile()->IsOffTheRecord();
   UrlLoadingBrowserAgent* URLLoader =
       UrlLoadingBrowserAgent::FromBrowser(self.browser);
   OpenDistantSessionInBackground(session, inIncognito,
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm
index 13aa0d88..5f04964 100644
--- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm
@@ -140,47 +140,43 @@
   void SetUp() override {
     BlockCleanupTest::SetUp();
 
-    TestChromeBrowserState::Builder test_cbs_builder;
-    test_cbs_builder.AddTestingFactory(
-        ios::FaviconServiceFactory::GetInstance(),
-        ios::FaviconServiceFactory::GetDefaultFactory());
-    test_cbs_builder.AddTestingFactory(
+    TestProfileIOS::Builder builder;
+    builder.AddTestingFactory(ios::FaviconServiceFactory::GetInstance(),
+                              ios::FaviconServiceFactory::GetDefaultFactory());
+    builder.AddTestingFactory(
         AuthenticationServiceFactory::GetInstance(),
         AuthenticationServiceFactory::GetDefaultFactory());
-    test_cbs_builder.AddTestingFactory(
+    builder.AddTestingFactory(
         IOSChromeLargeIconServiceFactory::GetInstance(),
         IOSChromeLargeIconServiceFactory::GetDefaultFactory());
-    test_cbs_builder.AddTestingFactory(
+    builder.AddTestingFactory(
         IOSChromeFaviconLoaderFactory::GetInstance(),
         IOSChromeFaviconLoaderFactory::GetDefaultFactory());
-    test_cbs_builder.AddTestingFactory(
-        ios::HistoryServiceFactory::GetInstance(),
-        ios::HistoryServiceFactory::GetDefaultFactory());
+    builder.AddTestingFactory(ios::HistoryServiceFactory::GetInstance(),
+                              ios::HistoryServiceFactory::GetDefaultFactory());
 
-    test_cbs_builder.AddTestingFactory(
+    builder.AddTestingFactory(
         SyncServiceFactory::GetInstance(),
         base::BindRepeating(&BuildFakeSyncServiceFactory));
 
-    test_cbs_builder.AddTestingFactory(
+    builder.AddTestingFactory(
         SessionSyncServiceFactory::GetInstance(),
         base::BindRepeating(
             &BuildMockSessionSyncServiceForRecentTabsTableCoordinator));
-    test_cbs_builder.AddTestingFactory(
+    builder.AddTestingFactory(
         IOSChromeTabRestoreServiceFactory::GetInstance(),
         IOSChromeTabRestoreServiceFactory::GetDefaultFactory());
-    chrome_browser_state_ = std::move(test_cbs_builder).Build();
+    profile_ = std::move(builder).Build();
 
-    AuthenticationServiceFactory::CreateAndInitializeForBrowserState(
-        chrome_browser_state_.get(),
-        std::make_unique<FakeAuthenticationServiceDelegate>());
+    AuthenticationServiceFactory::CreateAndInitializeForProfile(
+        profile_.get(), std::make_unique<FakeAuthenticationServiceDelegate>());
 
     FakeStartupInformation* startup_information_ =
         [[FakeStartupInformation alloc] init];
     app_state_ =
         [[AppState alloc] initWithStartupInformation:startup_information_];
     scene_state_ = [[SceneState alloc] initWithAppState:app_state_];
-    browser_ = std::make_unique<TestBrowser>(chrome_browser_state_.get(),
-                                             scene_state_);
+    browser_ = std::make_unique<TestBrowser>(profile_.get(), scene_state_);
   }
 
   void TearDown() override {
@@ -196,11 +192,10 @@
                       BOOL has_foreign_sessions) {
     SessionSyncServiceMockForRecentTabsTableCoordinator* session_sync_service =
         static_cast<SessionSyncServiceMockForRecentTabsTableCoordinator*>(
-            SessionSyncServiceFactory::GetForBrowserState(
-                chrome_browser_state_.get()));
+            SessionSyncServiceFactory::GetForProfile(profile_.get()));
 
     sync_service_ = static_cast<syncer::TestSyncService*>(
-        SyncServiceFactory::GetForBrowserState(chrome_browser_state_.get()));
+        SyncServiceFactory::GetForProfile(profile_.get()));
 
     if (!signed_in) {
       CHECK(!sync_enabled);
@@ -227,8 +222,7 @@
 
     if (signed_in) {
       AuthenticationService* authentication_service =
-          AuthenticationServiceFactory::GetForBrowserState(
-              chrome_browser_state_.get());
+          AuthenticationServiceFactory::GetForProfile(profile_.get());
 
       FakeSystemIdentity* identity = [FakeSystemIdentity fakeIdentity1];
 
@@ -297,7 +291,7 @@
   syncer::FakeDataTypeControllerDelegate fake_controller_delegate_;
   testing::NiceMock<OpenTabsUIDelegateMock> open_tabs_ui_delegate_;
   testing::NiceMock<GlobalIdMapperMock> global_id_mapper_;
-  std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
   std::unique_ptr<Browser> browser_;
   AppState* app_state_;
   SceneState* scene_state_;
@@ -313,7 +307,7 @@
   sessions::SessionTab open_tab_;
   std::vector<const sessions::SessionTab*> open_tabs_;
 
-  // Must be declared *after* `chrome_browser_state_` so it can outlive it.
+  // Must be declared *after* `profile_` so it can outlive it.
   RecentTabsCoordinator* coordinator_;
   id<ApplicationCommands> mock_application_commands_handler_;
   id<SettingsCommands> mock_settings_commands_handler_;
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
index b797549..87cd6d3 100644
--- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
+++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
@@ -180,7 +180,7 @@
 @property(nonatomic, strong) SigninPromoViewMediator* signinPromoViewMediator;
 // The browser state used for many operations, derived from the one provided by
 // `self.browser`.
-@property(nonatomic, readonly) ChromeBrowserState* browserState;
+@property(nonatomic, readonly) ProfileIOS* profile;
 // YES if this ViewController is being presented on incognito mode.
 @property(nonatomic, readonly, getter=isIncognito) BOOL incognito;
 // Convenience getter for `self.browser`'s WebStateList
@@ -238,14 +238,14 @@
 - (void)setBrowser:(Browser*)browser {
   _browser = browser;
   if (browser) {
-    ChromeBrowserState* browserState = browser->GetBrowserState();
+    ProfileIOS* profile = browser->GetProfile();
     // Some RecentTabs services depend on objects not present in the
-    // OffTheRecord BrowserState, in order to prevent crashes set
-    // `_browserState` to `browserState->OriginalChromeBrowserState`. While
+    // OffTheRecord profile, in order to prevent crashes set
+    // `_profile` to `profile->OriginalProfile`. While
     // doing this check if incognito or not so that pages are loaded
     // accordingly.
-    _browserState = browserState->GetOriginalChromeBrowserState();
-    _incognito = browserState->IsOffTheRecord();
+    _profile = profile->GetOriginalProfile();
+    _incognito = profile->IsOffTheRecord();
     _syncObserver.reset(new SyncObserverBridge(self, self.syncService));
   } else {
     _syncObserver.reset();
@@ -269,8 +269,8 @@
 }
 
 - (syncer::SyncService*)syncService {
-  DCHECK(_browserState);
-  return SyncServiceFactory::GetForBrowserState(_browserState);
+  DCHECK(_profile);
+  return SyncServiceFactory::GetForProfile(_profile);
 }
 
 // Returns YES if the user cannot turn on sync for enterprise policy reasons.
@@ -291,9 +291,9 @@
     return YES;
   }
 
-  DCHECK(self.browserState);
+  DCHECK(self.profile);
   AuthenticationService* authService =
-      AuthenticationServiceFactory::GetForBrowserState(self.browserState);
+      AuthenticationServiceFactory::GetForProfile(self.profile);
   DCHECK(authService);
   // Return NO is sign-in is disabled by the BrowserSignin policy.
   return authService->GetServiceStatus() ==
@@ -603,7 +603,7 @@
 // Adds Other Devices Section and its header.
 - (void)addOtherDevicesSectionForState:(SessionsSyncUserState)state {
   AuthenticationService* authService =
-      AuthenticationServiceFactory::GetForBrowserState(self.browserState);
+      AuthenticationServiceFactory::GetForProfile(self.profile);
   const AuthenticationService::ServiceStatus authServiceStatus =
       authService->GetServiceStatus();
   // If sign-in is disabled through user Settings, do not show Other Devices
@@ -721,13 +721,13 @@
 
 - (void)addSigninPromoViewItem {
   // Init `_signinPromoViewMediator` if nil.
-  if (!self.signinPromoViewMediator && self.browserState) {
+  if (!self.signinPromoViewMediator && self.profile) {
     self.signinPromoViewMediator = [[SigninPromoViewMediator alloc]
         initWithAccountManagerService:ChromeAccountManagerServiceFactory::
-                                          GetForBrowserState(self.browserState)
+                                          GetForProfile(self.profile)
                           authService:AuthenticationServiceFactory::
-                                          GetForBrowserState(self.browserState)
-                          prefService:self.browserState->GetPrefs()
+                                          GetForProfile(self.profile)
+                          prefService:self.profile->GetPrefs()
                           syncService:self.syncService
                           accessPoint:signin_metrics::AccessPoint::
                                           ACCESS_POINT_RECENT_TABS
@@ -891,7 +891,7 @@
     return;
 
   TabsSearchService* search_service =
-      TabsSearchServiceFactory::GetForBrowserState(self.browserState);
+      TabsSearchServiceFactory::GetForProfile(self.profile);
   __weak RecentTabsTableViewController* weakSelf = self;
   const std::u16string& search_terms =
       base::SysNSStringToUTF16(self.searchTerms);
@@ -975,7 +975,7 @@
 
 // Helper for removeSessionAtTableSectionWithIdentifier
 - (void)deleteSession:(std::string)sessionTag {
-  SessionSyncServiceFactory::GetForBrowserState(self.browserState)
+  SessionSyncServiceFactory::GetForProfile(self.profile)
       ->GetOpenTabsUIDelegate()
       ->DeleteForeignSession(sessionTag);
 }
@@ -1012,7 +1012,7 @@
     // A manual item refresh is necessary when tab search is disabled or there
     // is no search term.
     sync_sessions::SessionSyncService* syncService =
-        SessionSyncServiceFactory::GetForBrowserState(self.browserState);
+        SessionSyncServiceFactory::GetForProfile(self.profile);
     auto syncedSessions =
         std::make_unique<synced_sessions::SyncedSessions>(syncService);
 
@@ -1231,7 +1231,7 @@
   // Update the history search result count once available.
   if (itemTypeSelected == ItemTypeSuggestedActionSearchHistory) {
     TabsSearchService* search_service =
-        TabsSearchServiceFactory::GetForBrowserState(self.browserState);
+        TabsSearchServiceFactory::GetForProfile(self.profile);
     __weak TableViewTabsSearchSuggestedHistoryCell* weakCell =
         base::apple::ObjCCastStrict<TableViewTabsSearchSuggestedHistoryCell>(
             cell);
@@ -1519,7 +1519,7 @@
     return;
 
   sync_sessions::OpenTabsUIDelegate* openTabs =
-      SessionSyncServiceFactory::GetForBrowserState(self.browserState)
+      SessionSyncServiceFactory::GetForProfile(self.profile)
           ->GetOpenTabsUIDelegate();
   const sessions::SessionTab* toLoad = nullptr;
   if (openTabs->GetForeignTab(distantTab->session_tag, distantTab->tab_id,
@@ -1544,7 +1544,7 @@
         new_tab_page_uma::ACTION_OPENED_FOREIGN_SESSION);
     std::unique_ptr<web::WebState> web_state =
         session_util::CreateWebStateWithNavigationEntries(
-            self.browserState, toLoad->current_navigation_index,
+            self.profile, toLoad->current_navigation_index,
             toLoad->navigations);
     if (IsNTPWithoutHistory(currentWebState)) {
       self.webStateList->ReplaceWebStateAt(self.webStateList->active_index(),
@@ -1609,7 +1609,7 @@
       base::UserMetricsAction("TabsSearch.SuggestedActions.SearchOnWeb"));
 
   TemplateURLService* templateURLService =
-      ios::TemplateURLServiceFactory::GetForBrowserState(self.browserState);
+      ios::TemplateURLServiceFactory::GetForProfile(self.profile);
 
   const TemplateURL* defaultURL =
       templateURLService->GetDefaultSearchProvider();
@@ -1621,7 +1621,7 @@
   GURL searchUrl(defaultURL->url_ref().ReplaceSearchTerms(
       search_args, templateURLService->search_terms_data()));
 
-  web::WebState::CreateParams params(self.browserState);
+  web::WebState::CreateParams params(self.profile);
   auto webState = web::WebState::Create(params);
   web::WebState* webStatePtr = webState.get();
 
@@ -1882,7 +1882,7 @@
 // ViewController.
 - (BOOL)shouldShowHistorySyncOnPromoAction {
   AuthenticationService* authenticationService =
-      AuthenticationServiceFactory::GetForBrowserState(_browserState);
+      AuthenticationServiceFactory::GetForProfile(_profile);
   // TODO(crbug.com/40276546): Delete the usage of ConsentLevel::kSync after
   // Phase 2 on iOS is launched. See ConsentLevel::kSync documentation for
   // details.
@@ -1896,7 +1896,7 @@
   HistorySyncSkipReason skipReason = [HistorySyncCoordinator
       getHistorySyncOptInSkipReason:self.syncService
               authenticationService:authenticationService
-                        prefService:_browserState->GetPrefs()
+                        prefService:_profile->GetPrefs()
               isHistorySyncOptional:NO];
   return skipReason == HistorySyncSkipReason::kNone;
 }
diff --git a/ios/chrome/browser/ui/save_to_photos/save_to_photos_coordinator.mm b/ios/chrome/browser/ui/save_to_photos/save_to_photos_coordinator.mm
index f372d120..a220861 100644
--- a/ios/chrome/browser/ui/save_to_photos/save_to_photos_coordinator.mm
+++ b/ios/chrome/browser/ui/save_to_photos/save_to_photos_coordinator.mm
@@ -80,14 +80,13 @@
       HandlerForProtocol(dispatcher, ManageStorageAlertCommands);
   id<ApplicationCommands> applicationHandler =
       HandlerForProtocol(dispatcher, ApplicationCommands);
-  ChromeBrowserState* browserState = self.browser->GetBrowserState();
-  PhotosService* photosService =
-      PhotosServiceFactory::GetForProfile(browserState);
-  PrefService* prefService = browserState->GetPrefs();
+  ProfileIOS* profile = self.browser->GetProfile();
+  PhotosService* photosService = PhotosServiceFactory::GetForProfile(profile);
+  PrefService* prefService = profile->GetPrefs();
   ChromeAccountManagerService* accountManagerService =
-      ChromeAccountManagerServiceFactory::GetForBrowserState(browserState);
+      ChromeAccountManagerServiceFactory::GetForProfile(profile);
   signin::IdentityManager* identityManager =
-      IdentityManagerFactory::GetForProfile(browserState);
+      IdentityManagerFactory::GetForProfile(profile);
   _mediator = [[SaveToPhotosMediator alloc]
           initWithPhotosService:photosService
                     prefService:prefService
diff --git a/ios/chrome/browser/ui/save_to_photos/save_to_photos_coordinator_unittest.mm b/ios/chrome/browser/ui/save_to_photos/save_to_photos_coordinator_unittest.mm
index b48ad662..0f580b9 100644
--- a/ios/chrome/browser/ui/save_to_photos/save_to_photos_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/save_to_photos/save_to_photos_coordinator_unittest.mm
@@ -55,13 +55,13 @@
  protected:
   void SetUp() final {
     PlatformTest::SetUp();
-    TestChromeBrowserState::Builder builder;
+    TestProfileIOS::Builder builder;
     builder.AddTestingFactory(
         IdentityManagerFactory::GetInstance(),
         base::BindRepeating(IdentityTestEnvironmentBrowserStateAdaptor::
                                 BuildIdentityManagerForTests));
-    browser_state_ = std::move(builder).Build();
-    browser_ = std::make_unique<TestBrowser>(browser_state_.get());
+    profile_ = std::move(builder).Build();
+    browser_ = std::make_unique<TestBrowser>(profile_.get());
     std::unique_ptr<web::FakeWebState> web_state =
         std::make_unique<web::FakeWebState>();
     browser_->GetWebStateList()->InsertWebState(
@@ -155,7 +155,7 @@
   }
 
   base::test::TaskEnvironment task_environment_;
-  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
   std::unique_ptr<TestBrowser> browser_;
   FakeUIViewController* base_view_controller_;
 
@@ -173,13 +173,12 @@
   SaveToPhotosCoordinator* coordinator = CreateSaveToPhotosCoordinator();
 
   PhotosService* photosService =
-      PhotosServiceFactory::GetForProfile(browser_state_.get());
-  PrefService* prefService = browser_state_->GetPrefs();
+      PhotosServiceFactory::GetForProfile(profile_.get());
+  PrefService* prefService = profile_->GetPrefs();
   ChromeAccountManagerService* accountManagerService =
-      ChromeAccountManagerServiceFactory::GetForBrowserState(
-          browser_state_.get());
+      ChromeAccountManagerServiceFactory::GetForProfile(profile_.get());
   signin::IdentityManager* identityManager =
-      IdentityManagerFactory::GetForProfile(browser_state_.get());
+      IdentityManagerFactory::GetForProfile(profile_.get());
 
   OCMExpect([mock_save_to_photos_mediator_ alloc])
       .andReturn(mock_save_to_photos_mediator_);
diff --git a/ios/chrome/browser/ui/save_to_photos/save_to_photos_mediator_unittest.mm b/ios/chrome/browser/ui/save_to_photos/save_to_photos_mediator_unittest.mm
index 1057a6c..86f81821 100644
--- a/ios/chrome/browser/ui/save_to_photos/save_to_photos_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/save_to_photos/save_to_photos_mediator_unittest.mm
@@ -119,13 +119,13 @@
 class SaveToPhotosMediatorTest : public PlatformTest {
  protected:
   void SetUp() final {
-    TestChromeBrowserState::Builder builder;
+    TestProfileIOS::Builder builder;
     builder.AddTestingFactory(
         IdentityManagerFactory::GetInstance(),
         base::BindRepeating(IdentityTestEnvironmentBrowserStateAdaptor::
                                 BuildIdentityManagerForTests));
-    browser_state_ = std::move(builder).Build();
-    browser_ = std::make_unique<TestBrowser>(browser_state_.get());
+    profile_ = std::move(builder).Build();
+    browser_ = std::make_unique<TestBrowser>(profile_.get());
     web_state_ = std::make_unique<web::FakeWebState>();
     FakeImageFetchTabHelper::CreateForWebState(web_state_.get());
     fake_identity_ = [FakeSystemIdentity fakeIdentity1];
@@ -165,13 +165,12 @@
   // Create a SaveToPhotosMediator with services from the test browser state.
   SaveToPhotosMediator* CreateSaveToPhotosMediator() {
     PhotosService* photos_service =
-        PhotosServiceFactory::GetForProfile(browser_state_.get());
-    PrefService* pref_service = browser_state_->GetPrefs();
+        PhotosServiceFactory::GetForProfile(profile_.get());
+    PrefService* pref_service = profile_->GetPrefs();
     ChromeAccountManagerService* account_manager_service =
-        ChromeAccountManagerServiceFactory::GetForBrowserState(
-            browser_state_.get());
+        ChromeAccountManagerServiceFactory::GetForProfile(profile_.get());
     signin::IdentityManager* identity_manager =
-        IdentityManagerFactory::GetForProfile(browser_state_.get());
+        IdentityManagerFactory::GetForProfile(profile_.get());
     return [[SaveToPhotosMediator alloc]
             initWithPhotosService:photos_service
                       prefService:pref_service
@@ -184,7 +183,7 @@
   // Sign-in with a fake account.
   void SignIn() {
     signin::MakePrimaryAccountAvailable(
-        IdentityManagerFactory::GetForProfile(browser_state_.get()),
+        IdentityManagerFactory::GetForProfile(profile_.get()),
         base::SysNSStringToUTF8(fake_identity_.userEmail),
         signin::ConsentLevel::kSignin);
   }
@@ -192,7 +191,7 @@
   // Returns the TestPhotosService tied to the browser state.
   TestPhotosService* GetTestPhotosService() {
     return static_cast<TestPhotosService*>(
-        PhotosServiceFactory::GetForProfile(browser_state_.get()));
+        PhotosServiceFactory::GetForProfile(profile_.get()));
   }
 
   // Returns the FakeImageFetchTabHelper tied to the WebState.
@@ -202,7 +201,7 @@
   }
 
   base::test::TaskEnvironment task_environment_;
-  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
   std::unique_ptr<TestBrowser> browser_;
   std::unique_ptr<web::FakeWebState> web_state_;
   id mock_application_;
@@ -234,9 +233,8 @@
   SignIn();
 
   // This test assumes there is no default account memorized for Save to Photos.
-  browser_state_->GetPrefs()->ClearPref(prefs::kIosSaveToPhotosDefaultGaiaId);
-  browser_state_->GetPrefs()->ClearPref(
-      prefs::kIosSaveToPhotosSkipAccountPicker);
+  profile_->GetPrefs()->ClearPref(prefs::kIosSaveToPhotosDefaultGaiaId);
+  profile_->GetPrefs()->ClearPref(prefs::kIosSaveToPhotosSkipAccountPicker);
 
   // Create a mediator and set up with mock delegate.
   SaveToPhotosMediator* mediator = CreateSaveToPhotosMediator();
@@ -291,11 +289,11 @@
 
   // This test assumes there is a default account memorized for Save to Photos
   // and that the user opted-in skipping the account picker.
-  browser_state_->GetPrefs()->SetString(
+  profile_->GetPrefs()->SetString(
       prefs::kIosSaveToPhotosDefaultGaiaId,
       base::SysNSStringToUTF8(fake_identity_.gaiaID).c_str());
-  browser_state_->GetPrefs()->SetBoolean(
-      prefs::kIosSaveToPhotosSkipAccountPicker, true);
+  profile_->GetPrefs()->SetBoolean(prefs::kIosSaveToPhotosSkipAccountPicker,
+                                   true);
 
   // Create a mediator and set up with mock delegate.
   SaveToPhotosMediator* mediator = CreateSaveToPhotosMediator();
@@ -338,9 +336,8 @@
   SignIn();
 
   // This test assumes there is no default account memorized for Save to Photos.
-  browser_state_->GetPrefs()->ClearPref(prefs::kIosSaveToPhotosDefaultGaiaId);
-  browser_state_->GetPrefs()->ClearPref(
-      prefs::kIosSaveToPhotosSkipAccountPicker);
+  profile_->GetPrefs()->ClearPref(prefs::kIosSaveToPhotosDefaultGaiaId);
+  profile_->GetPrefs()->ClearPref(prefs::kIosSaveToPhotosSkipAccountPicker);
 
   // Create a mediator and set up with mock delegate.
   SaveToPhotosMediator* mediator = CreateSaveToPhotosMediator();
@@ -411,9 +408,8 @@
   SignIn();
 
   // This test assumes there is no default account memorized for Save to Photos.
-  browser_state_->GetPrefs()->ClearPref(prefs::kIosSaveToPhotosDefaultGaiaId);
-  browser_state_->GetPrefs()->ClearPref(
-      prefs::kIosSaveToPhotosSkipAccountPicker);
+  profile_->GetPrefs()->ClearPref(prefs::kIosSaveToPhotosDefaultGaiaId);
+  profile_->GetPrefs()->ClearPref(prefs::kIosSaveToPhotosSkipAccountPicker);
 
   // Create a mediator and set up with mock delegate.
   SaveToPhotosMediator* mediator = CreateSaveToPhotosMediator();
diff --git a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.mm b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.mm
index b93ee7e..ad90efa9 100644
--- a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.mm
+++ b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.mm
@@ -251,8 +251,7 @@
 
 - (void)sendTabToTargetDeviceCacheGUID:(NSString*)cacheGUID
                       targetDeviceName:(NSString*)deviceName {
-  SendTabToSelfSyncServiceFactory::GetForProfile(
-      self.browser->GetBrowserState())
+  SendTabToSelfSyncServiceFactory::GetForProfile(self.browser->GetProfile())
       ->GetSendTabToSelfModel()
       ->AddEntry(self.url, base::SysNSStringToUTF8(self.title),
                  base::SysNSStringToUTF8(cacheGUID));
@@ -288,17 +287,17 @@
   switch (*displayReason) {
     case send_tab_to_self::EntryPointDisplayReason::kInformNoTargetDevice:
     case send_tab_to_self::EntryPointDisplayReason::kOfferFeature: {
-      ChromeBrowserState* browserState = self.browser->GetBrowserState();
+      ProfileIOS* profile = self.browser->GetProfile();
       send_tab_to_self::SendTabToSelfSyncService* syncService =
-          SendTabToSelfSyncServiceFactory::GetForProfile(browserState);
+          SendTabToSelfSyncServiceFactory::GetForProfile(profile);
       // This modal should not be launched in incognito mode where syncService
       // is undefined.
       DCHECK(syncService);
       ChromeAccountManagerService* accountManagerService =
-          ChromeAccountManagerServiceFactory::GetForBrowserState(browserState);
+          ChromeAccountManagerServiceFactory::GetForProfile(profile);
       DCHECK(accountManagerService);
       id<SystemIdentity> account =
-          AuthenticationServiceFactory::GetForBrowserState(browserState)
+          AuthenticationServiceFactory::GetForProfile(profile)
               ->GetPrimaryIdentity(signin::ConsentLevel::kSignin);
       DCHECK(account) << "The user must be signed in to share a tab";
       self.sendTabToSelfViewController =
@@ -352,7 +351,7 @@
   }
   __weak __typeof(self) weakSelf = self;
   _targetDeviceListWaiter = std::make_unique<TargetDeviceListWaiter>(
-      SyncServiceFactory::GetForBrowserState(self.browser->GetBrowserState()),
+      SyncServiceFactory::GetForProfile(self.browser->GetProfile()),
       base::BindRepeating(
           [](__typeof(self) strongSelf) { return [strongSelf displayReason]; },
           weakSelf),
@@ -371,7 +370,7 @@
 - (std::optional<send_tab_to_self::EntryPointDisplayReason>)displayReason {
   send_tab_to_self::SendTabToSelfSyncService* service =
       SendTabToSelfSyncServiceFactory::GetForProfile(
-          self.browser->GetBrowserState());
+          self.browser->GetProfile());
   return service ? service->GetEntryPointDisplayReason(_url) : std::nullopt;
 }
 
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_coordinator.mm
index ae209f50..6dde9c0 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_coordinator.mm
@@ -191,7 +191,7 @@
                            forProtocol:@protocol(TabGroupsCommands)];
 
   self.mediator.tabGroupsHandler = self;
-  if (!self.browser->GetBrowserState()->IsOffTheRecord()) {
+  if (!self.browser->GetProfile()->IsOffTheRecord()) {
     self.mediator.tabGridToolbarHandler =
         HandlerForProtocol(dispatcher, TabGridToolbarCommands);
   }
@@ -322,14 +322,14 @@
 - (void)showTabGridTabGroupSnackbarAfterClosingGroups:
     (int)numberOfClosedGroups {
   if (!IsTabGroupSyncEnabled() ||
-      self.browser->GetBrowserState()->IsOffTheRecord()) {
+      self.browser->GetProfile()->IsOffTheRecord()) {
     return;
   }
 
   // Don't show the snackbar if the IPH will be presented.
   feature_engagement::Tracker* tracker =
-      feature_engagement::TrackerFactory::GetForBrowserState(
-          self.browser->GetBrowserState());
+      feature_engagement::TrackerFactory::GetForProfile(
+          self.browser->GetProfile());
   if (tracker->WouldTriggerHelpUI(
           feature_engagement::kIPHiOSSavedTabGroupClosed)) {
     return;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_mediator.mm
index 551609b..0984ef6 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_mediator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_mediator.mm
@@ -133,8 +133,8 @@
 @interface BaseGridMediator () <CRWWebStateObserver,
                                 SnapshotStorageObserver,
                                 TabGridModeObserving>
-// The browser state from the browser.
-@property(nonatomic, readonly) ChromeBrowserState* browserState;
+// The profile from the browser.
+@property(nonatomic, readonly) ProfileIOS* profile;
 
 @end
 
@@ -197,7 +197,7 @@
   }
 
   _webStateList = browser ? browser->GetWebStateList() : nullptr;
-  _browserState = browser ? browser->GetBrowserState() : nullptr;
+  _profile = browser ? browser->GetProfile() : nullptr;
 
   [self.snapshotStorage addObserver:self];
 
@@ -227,7 +227,7 @@
 
 - (void)disconnect {
   _browser.reset();
-  _browserState = nil;
+  _profile = nil;
   _consumer = nil;
   _delegate = nil;
   _toolbarsMutator = nil;
@@ -338,9 +338,9 @@
 
 - (void)insertNewWebStateAtGridIndex:(int)index withURL:(const GURL&)newTabURL {
   // The incognito mediator's Browser is briefly set to nil after the last
-  // incognito tab is closed.  This occurs because the incognito BrowserState
+  // incognito tab is closed.  This occurs because the incognito profile
   // needs to be destroyed to correctly clear incognito browsing data.  Don't
-  // attempt to create a new WebState with a nil BrowserState.
+  // attempt to create a new WebState with a nil profile.
   if (!self.browser) {
     return;
   }
@@ -355,8 +355,8 @@
     return;
   }
 
-  DCHECK(self.browserState);
-  web::WebState::CreateParams params(self.browserState);
+  DCHECK(self.profile);
+  web::WebState::CreateParams params(self.profile);
   std::unique_ptr<web::WebState> webState = web::WebState::Create(params);
 
   int webStateListIndex =
@@ -457,8 +457,8 @@
   if (IsTabGroupSyncEnabled() && !deleteGroup) {
     [self showTabGroupSnackbarOrIPH:1];
     tab_groups::TabGroupSyncService* syncService =
-        tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
-            self.browser->GetBrowserState());
+        tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+            self.browser->GetProfile());
     tab_groups::utils::CloseTabGroupLocally(group, groupWebStateList,
                                             syncService);
   } else {
@@ -499,7 +499,7 @@
 }
 
 - (BOOL)canHandleTabGroupDrop:(TabGroupInfo*)tabGroupInfo {
-  return self.browserState->IsOffTheRecord() == tabGroupInfo.incognito;
+  return self.profile->IsOffTheRecord() == tabGroupInfo.incognito;
 }
 
 - (void)recordExternalURLDropped {
@@ -849,9 +849,9 @@
     return NO;
   }
 
-  if (self.browserState &&
-      !IsAddNewTabAllowedByPolicy(self.browserState->GetPrefs(),
-                                  self.browserState->IsOffTheRecord())) {
+  if (self.profile &&
+      !IsAddNewTabAllowedByPolicy(self.profile->GetPrefs(),
+                                  self.profile->IsOffTheRecord())) {
     return NO;
   }
 
@@ -879,10 +879,9 @@
     // If this is a search result, it may contain items from other windows or
     // from the inactive browser - check inactive browser and other windows
     // before giving up.
-    BrowserList* browserList =
-        BrowserListFactory::GetForBrowserState(self.browserState);
+    BrowserList* browserList = BrowserListFactory::GetForProfile(self.profile);
     Browser* browser = GetBrowserForNonPinnedTabWithId(
-        browserList, itemID, self.browserState->IsOffTheRecord());
+        browserList, itemID, self.profile->IsOffTheRecord());
 
     if (!browser) {
       return;
@@ -976,11 +975,10 @@
     return;
   }
 
-  BOOL incognito = self.browserState->IsOffTheRecord();
+  BOOL incognito = self.profile->IsOffTheRecord();
   // If this is a search result, it may contain items from other windows or
   // from the inactive browser - check other windows before giving up.
-  BrowserList* browserList =
-      BrowserListFactory::GetForBrowserState(self.browserState);
+  BrowserList* browserList = BrowserListFactory::GetForProfile(self.profile);
   Browser* browser = GetBrowserForGroup(browserList, tabGroup, incognito);
 
   if (!browser) {
@@ -1062,10 +1060,9 @@
   base::RecordAction(
       base::UserMetricsAction("MobileTabGridSearchCloseTabFromAnotherWindow"));
 
-  BrowserList* browserList =
-      BrowserListFactory::GetForBrowserState(self.browserState);
+  BrowserList* browserList = BrowserListFactory::GetForProfile(self.profile);
   Browser* browser = GetBrowserForNonPinnedTabWithId(
-      browserList, itemID, self.browserState->IsOffTheRecord());
+      browserList, itemID, self.profile->IsOffTheRecord());
 
   // If this tab is still associated with another browser, remove it from the
   // associated web state list.
@@ -1092,8 +1089,8 @@
   if (closedGroupsCount > 0) {
     tab_groups::TabGroupSyncService* syncService = nil;
     if (IsTabGroupSyncEnabled()) {
-      syncService = tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
-          self.browser->GetBrowserState());
+      syncService = tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+          self.browser->GetProfile());
     }
 
     // Find and close all groups in `groupIDs`.
@@ -1126,7 +1123,7 @@
 
   const bool allTabsClosed = webStateList->empty();
   if (allTabsClosed) {
-    if (!self.browserState->IsOffTheRecord()) {
+    if (!self.profile->IsOffTheRecord()) {
       base::RecordAction(base::UserMetricsAction(
           "MobileTabGridSelectionCloseAllRegularTabsConfirmed"));
     } else {
@@ -1190,7 +1187,7 @@
 
 - (void)searchItemsWithText:(NSString*)searchText {
   TabsSearchService* searchService =
-      TabsSearchServiceFactory::GetForBrowserState(self.browserState);
+      TabsSearchServiceFactory::GetForProfile(self.profile);
   const std::u16string& searchTerm = base::SysNSStringToUTF16(searchText);
   searchService->Search(
       searchTerm,
@@ -1247,9 +1244,9 @@
 
 - (void)fetchSearchHistoryResultsCountForText:(NSString*)searchText
                                    completion:(void (^)(size_t))completion {
-  CHECK(!self.browserState->IsOffTheRecord());
+  CHECK(!self.profile->IsOffTheRecord());
   TabsSearchService* search_service =
-      TabsSearchServiceFactory::GetForBrowserState(self.browserState);
+      TabsSearchServiceFactory::GetForProfile(self.profile);
   const std::u16string& searchTerm = base::SysNSStringToUTF16(searchText);
   search_service->SearchHistory(searchTerm,
                                 base::BindOnce(^(size_t resultCount) {
@@ -1293,7 +1290,7 @@
 }
 
 - (UIDragItem*)dragItemForTabGroupItem:(TabGroupItem*)tabGroupItem {
-  return CreateTabGroupDragItem(tabGroupItem.tabGroup, self.browserState);
+  return CreateTabGroupDragItem(tabGroupItem.tabGroup, self.profile);
 }
 
 - (UIDragItem*)dragItemForItem:(TabSwitcherItem*)item {
@@ -1316,12 +1313,12 @@
   // asynchronous drops.
   if ([dragItem.localObject isKindOfClass:[TabInfo class]]) {
     TabInfo* tabInfo = static_cast<TabInfo*>(dragItem.localObject);
-    if (tabInfo.profile != self.browserState) {
+    if (tabInfo.profile != self.profile) {
       // Tabs from different profiles cannot be dropped.
       return UIDropOperationForbidden;
     }
 
-    if (self.browserState->IsOffTheRecord() == tabInfo.incognito) {
+    if (self.profile->IsOffTheRecord() == tabInfo.incognito) {
       return UIDropOperationMove;
     }
 
@@ -1331,7 +1328,7 @@
   if ([dragItem.localObject isKindOfClass:[TabGroupInfo class]]) {
     TabGroupInfo* tabGroupInfo =
         static_cast<TabGroupInfo*>(dragItem.localObject);
-    if (tabGroupInfo.profile != self.browserState) {
+    if (tabGroupInfo.profile != self.profile) {
       // Tabs from different profiles cannot be dropped.
       return UIDropOperationForbidden;
     }
@@ -1601,7 +1598,7 @@
       [weakSelf addSelectedElementsToGroup:group];
     };
     UIMenuElement* addToGroup = [actionFactory
-        menuToAddTabToGroupWithGroups:GetAllGroupsForProfile(_browserState)
+        menuToAddTabToGroupWithGroups:GetAllGroupsForProfile(_profile)
                          numberOfTabs:_selectedEditingItems.tabsCount
                                 block:addToGroupBlock];
     [actions addObject:[UIMenu menuWithTitle:@""
@@ -1626,7 +1623,7 @@
   // Bookmarking can be disabled from prefs (from an enterprise policy),
   // if that's the case grey out the option in the menu.
   BOOL isEditBookmarksEnabled =
-      self.browser->GetBrowserState()->GetPrefs()->GetBoolean(
+      self.browser->GetProfile()->GetPrefs()->GetBoolean(
           bookmarks::prefs::kEditBookmarksEnabled);
   if (!isEditBookmarksEnabled) {
     bookmarkAction.attributes = UIMenuElementAttributesDisabled;
@@ -1652,7 +1649,7 @@
     WebStateList::ScopedBatchOperation lock =
         self.webStateList->StartBatchOperation();
     for (web::WebStateID webStateID : selectedTabs) {
-      MoveTabToGroup(webStateID, group, _browserState);
+      MoveTabToGroup(webStateID, group, _profile);
     }
   }
 }
@@ -1662,10 +1659,9 @@
   if (_webStateList->ContainsGroup(group)) {
     return _webStateList;
   }
-  BrowserList* browserList =
-      BrowserListFactory::GetForBrowserState(self.browserState);
-  Browser* browser = GetBrowserForGroup(browserList, group,
-                                        self.browserState->IsOffTheRecord());
+  BrowserList* browserList = BrowserListFactory::GetForProfile(self.profile);
+  Browser* browser =
+      GetBrowserForGroup(browserList, group, self.profile->IsOffTheRecord());
   if (!browser) {
     return nullptr;
   }
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_mediator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_mediator_unittest.mm
index 9ae7724..39a8a70e 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/base_grid_mediator_unittest.mm
@@ -337,7 +337,7 @@
   EXPECT_EQ(3, browser_->GetWebStateList()->active_index());
   web::WebState* web_state = browser_->GetWebStateList()->GetWebStateAt(3);
   ASSERT_TRUE(web_state);
-  EXPECT_EQ(web_state->GetBrowserState(), browser_state_.get());
+  EXPECT_EQ(web_state->GetBrowserState(), profile_.get());
   EXPECT_FALSE(web_state->HasOpener());
   // The URL of pending item (i.e. kChromeUINewTabURL) will not be returned
   // here because WebState doesn't load the URL until it's visible and
@@ -791,8 +791,8 @@
 
   tab_groups::MockTabGroupSyncService* mock_service =
       static_cast<tab_groups::MockTabGroupSyncService*>(
-          tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
-              browser_state_.get()));
+          tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+              profile_.get()));
 
   WebStateList* web_state_list = browser_->GetWebStateList();
   TabGroupId tab_group_id = TabGroupId::GenerateNew();
@@ -819,12 +819,12 @@
   WebStateList* other_web_state_list = other_browser_->GetWebStateList();
   WebStateListBuilderFromDescription builder(other_web_state_list);
   ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a b c d e f g", other_browser_->GetBrowserState()));
+      "| a b c d e f g", other_browser_->GetProfile()));
 
   tab_groups::MockTabGroupSyncService* mock_service =
       static_cast<tab_groups::MockTabGroupSyncService*>(
-          tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
-              browser_state_.get()));
+          tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+              profile_.get()));
   TabGroupId tab_group_id = TabGroupId::GenerateNew();
   other_web_state_list->CreateGroup({1}, {}, tab_group_id);
   const TabGroup* group = other_web_state_list->GetGroupOfWebStateAt(1);
@@ -846,8 +846,8 @@
 
   tab_groups::MockTabGroupSyncService* mock_service =
       static_cast<tab_groups::MockTabGroupSyncService*>(
-          tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
-              browser_state_.get()));
+          tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+              profile_.get()));
 
   TabGroupId tab_group_id = TabGroupId::GenerateNew();
   WebStateList* web_state_list = browser_->GetWebStateList();
@@ -875,8 +875,8 @@
 
   tab_groups::MockTabGroupSyncService* mock_service =
       static_cast<tab_groups::MockTabGroupSyncService*>(
-          tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
-              browser_state_.get()));
+          tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+              profile_.get()));
 
   WebStateList* web_state_list = browser_->GetWebStateList();
   TabGroupId tab_group_id = TabGroupId::GenerateNew();
@@ -905,12 +905,12 @@
   WebStateList* other_web_state_list = other_browser_->GetWebStateList();
   WebStateListBuilderFromDescription builder(other_web_state_list);
   ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a b c d e f g", other_browser_->GetBrowserState()));
+      "| a b c d e f g", other_browser_->GetProfile()));
 
   tab_groups::MockTabGroupSyncService* mock_service =
       static_cast<tab_groups::MockTabGroupSyncService*>(
-          tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
-              browser_state_.get()));
+          tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+              profile_.get()));
   TabGroupId tab_group_id = TabGroupId::GenerateNew();
   const TabGroup* group =
       other_web_state_list->CreateGroup({1}, {}, tab_group_id);
@@ -937,12 +937,12 @@
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
   ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a b c [ 1 d e ] [ 2 f g ] h", browser_->GetBrowserState()));
+      "| a b c [ 1 d e ] [ 2 f g ] h", browser_->GetProfile()));
 
   tab_groups::MockTabGroupSyncService* mock_service =
       static_cast<tab_groups::MockTabGroupSyncService*>(
-          tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
-              browser_state_.get()));
+          tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+              profile_.get()));
 
   const TabGroup* group_1 = builder.GetTabGroupForIdentifier('1');
   const TabGroup* group_2 = builder.GetTabGroupForIdentifier('2');
@@ -1016,8 +1016,8 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| [ 1 a* b ] [ 2 c ]", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| [ 1 a* b ] [ 2 c ]",
+                                                       browser_->GetProfile()));
   const TabGroup* group1 = builder.GetTabGroupForIdentifier('1');
   const TabGroup* group2 = builder.GetTabGroupForIdentifier('2');
 
@@ -1041,8 +1041,8 @@
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
 
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b c ", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b c ",
+                                                       browser_->GetProfile()));
 
   web::WebStateID web_state_id =
       web_state_list->GetWebStateAt(2)->GetUniqueIdentifier();
@@ -1070,8 +1070,8 @@
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
 
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b c [ 0 d e f ] g", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b c [ 0 d e f ] g",
+                                                       browser_->GetProfile()));
 
   // Drop "D" (in a group) after "A".
   web::WebStateID web_state_id =
@@ -1102,7 +1102,7 @@
 // the grid.
 TEST_P(BaseGridMediatorTest, DropCrossWindowTab) {
   auto other_browser = std::make_unique<TestBrowser>(
-      browser_state_.get(), scene_state_,
+      profile_.get(), scene_state_,
       std::make_unique<BrowserWebStateListDelegate>());
   SnapshotBrowserAgent::CreateForBrowser(other_browser.get());
 
@@ -1118,8 +1118,8 @@
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
 
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b c ", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b c ",
+                                                       browser_->GetProfile()));
 
   id local_object = [[TabInfo alloc] initWithTabID:other_id
                                            profile:browser_->GetProfile()];
@@ -1147,13 +1147,12 @@
 
   WebStateListBuilderFromDescription builder(web_state_list);
   ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| [ 1 a* b ] c [ 2 d e ]", browser_->GetBrowserState()));
+      "| [ 1 a* b ] c [ 2 d e ]", browser_->GetProfile()));
 
   const TabGroup* tab_group = web_state_list->GetGroupOfWebStateAt(4);
 
-  id local_object =
-      [[TabGroupInfo alloc] initWithTabGroup:tab_group
-                                     profile:browser_state_.get()];
+  id local_object = [[TabGroupInfo alloc] initWithTabGroup:tab_group
+                                                   profile:profile_.get()];
   NSItemProvider* item_provider = [[NSItemProvider alloc] init];
   UIDragItem* drag_item =
       [[UIDragItem alloc] initWithItemProvider:item_provider];
@@ -1177,11 +1176,11 @@
 
   WebStateListBuilderFromDescription builder(web_state_list);
   ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| [ 1 a* b ] c [ 2 d e ]", browser_->GetBrowserState()));
+      "| [ 1 a* b ] c [ 2 d e ]", browser_->GetProfile()));
 
   // Prepare the other web state list, from which the group will be dragged.
   auto other_browser = std::make_unique<TestBrowser>(
-      browser_state_.get(), scene_state_,
+      profile_.get(), scene_state_,
       std::make_unique<BrowserWebStateListDelegate>());
   SnapshotBrowserAgent::CreateForBrowser(other_browser.get());
 
@@ -1197,9 +1196,8 @@
       other_browser->GetWebStateList()->GetGroupOfWebStateAt(0);
   tab_groups::TabGroupId tab_group_id = other_tab_group->tab_group_id();
 
-  id local_object =
-      [[TabGroupInfo alloc] initWithTabGroup:other_tab_group
-                                     profile:browser_state_.get()];
+  id local_object = [[TabGroupInfo alloc] initWithTabGroup:other_tab_group
+                                                   profile:profile_.get()];
   NSItemProvider* item_provider = [[NSItemProvider alloc] init];
   UIDragItem* drag_item =
       [[UIDragItem alloc] initWithItemProvider:item_provider];
@@ -1219,8 +1217,8 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b c ", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b c ",
+                                                       browser_->GetProfile()));
 
   GURL url_to_load = GURL(kDraggedUrl);
   id local_object = [[URLInfo alloc] initWithURL:url_to_load title:@"My title"];
@@ -1244,8 +1242,8 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b c ", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b c ",
+                                                       browser_->GetProfile()));
 
   NSItemProvider* item_provider = [[NSItemProvider alloc]
       initWithContentsOfURL:[NSURL URLWithString:base::SysUTF8ToNSString(
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_item_identifier_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_item_identifier_unittest.mm
index ebf3950e..bb4e003 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_item_identifier_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_item_identifier_unittest.mm
@@ -21,16 +21,16 @@
 class GridItemIdentifierTest : public PlatformTest {
  public:
   GridItemIdentifierTest() {
-    TestChromeBrowserState::Builder browser_state_builder;
-    browser_state_ = std::move(browser_state_builder).Build();
+    TestProfileIOS::Builder profile_builder;
+    profile_ = std::move(profile_builder).Build();
     browser_ = std::make_unique<TestBrowser>(
-        browser_state_.get(), std::make_unique<FakeWebStateListDelegate>());
+        profile_.get(), std::make_unique<FakeWebStateListDelegate>());
     web_state_list_ = browser_->GetWebStateList();
   }
 
  protected:
   web::WebTaskEnvironment task_environment_;
-  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
   std::unique_ptr<TestBrowser> browser_;
   raw_ptr<WebStateList> web_state_list_;
 };
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.h
index 751db7b..1b48f4d 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.h
@@ -55,7 +55,7 @@
   web::WebTaskEnvironment task_environment_;
   base::test::ScopedFeatureList scoped_feature_list_;
   IOSChromeScopedTestingLocalState scoped_testing_local_state_;
-  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
   FakeTabCollectionConsumer* consumer_;
   std::vector<web::WebStateID> original_identifiers_;
   web::WebStateID original_selected_identifier_;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.mm
index 1d2031c..6aab673 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.mm
@@ -76,7 +76,7 @@
 void GridMediatorTestClass::SetUp() {
   PlatformTest::SetUp();
 
-  TestChromeBrowserState::Builder builder;
+  TestProfileIOS::Builder builder;
   builder.AddTestingFactory(IOSChromeTabRestoreServiceFactory::GetInstance(),
                             FakeTabRestoreService::GetTestingFactory());
   builder.AddTestingFactory(SyncServiceFactory::GetInstance(),
@@ -90,12 +90,11 @@
   builder.AddTestingFactory(
       tab_groups::TabGroupSyncServiceFactory::GetInstance(),
       base::BindRepeating(&CreateMockTabGroupSyncService));
-  browser_state_ = std::move(builder).Build();
-  AuthenticationServiceFactory::CreateAndInitializeForBrowserState(
-      browser_state_.get(),
-      std::make_unique<FakeAuthenticationServiceDelegate>());
+  profile_ = std::move(builder).Build();
+  AuthenticationServiceFactory::CreateAndInitializeForProfile(
+      profile_.get(), std::make_unique<FakeAuthenticationServiceDelegate>());
   // Price Drops are only available to signed in MSBB users.
-  browser_state_->GetPrefs()->SetBoolean(
+  profile_->GetPrefs()->SetBoolean(
       unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled, true);
   id<SystemIdentity> identity = [FakeSystemIdentity fakeIdentity1];
   FakeSystemIdentityManager* system_identity_manager =
@@ -103,25 +102,24 @@
           GetApplicationContext()->GetSystemIdentityManager());
   system_identity_manager->AddIdentity(identity);
   auth_service_ = static_cast<AuthenticationService*>(
-      AuthenticationServiceFactory::GetInstance()->GetForBrowserState(
-          browser_state_.get()));
+      AuthenticationServiceFactory::GetInstance()->GetForProfile(
+          profile_.get()));
   auth_service_->SignIn(identity,
                         signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN);
   scene_state_ = OCMClassMock([SceneState class]);
   OCMStub([scene_state_ sceneSessionID]).andReturn(@(kIdentifier));
   browser_ = std::make_unique<TestBrowser>(
-      browser_state_.get(), scene_state_,
+      profile_.get(), scene_state_,
       std::make_unique<BrowserWebStateListDelegate>());
   other_browser_ = std::make_unique<TestBrowser>(
-      browser_state_.get(), nil,
-      std::make_unique<BrowserWebStateListDelegate>());
+      profile_.get(), nil, std::make_unique<BrowserWebStateListDelegate>());
   WebUsageEnablerBrowserAgent::CreateForBrowser(browser_.get());
   ClosingWebStateObserverBrowserAgent::CreateForBrowser(browser_.get());
   SnapshotBrowserAgent::CreateForBrowser(browser_.get());
   SnapshotBrowserAgent::FromBrowser(browser_.get())->SetSessionID(kIdentifier);
-  SessionRestorationServiceFactory::GetForBrowserState(browser_state_.get())
+  SessionRestorationServiceFactory::GetForProfile(profile_.get())
       ->SetSessionID(browser_.get(), kIdentifier);
-  browser_list_ = BrowserListFactory::GetForBrowserState(browser_state_.get());
+  browser_list_ = BrowserListFactory::GetForProfile(profile_.get());
   browser_list_->AddBrowser(browser_.get());
   browser_list_->AddBrowser(other_browser_.get());
 
@@ -158,7 +156,7 @@
     web_state->SetWebFramesManager(
         content_world, std::make_unique<web::FakeWebFramesManager>());
   }
-  web_state->SetBrowserState(browser_state_.get());
+  web_state->SetBrowserState(profile_.get());
   web_state->SetNavigationItemCount(1);
   web_state->SetCurrentURL(url);
   return web_state;
@@ -166,7 +164,7 @@
 
 void GridMediatorTestClass::TearDown() {
   PlatformTest::TearDown();
-  SessionRestorationServiceFactory::GetForBrowserState(browser_state_.get())
+  SessionRestorationServiceFactory::GetForProfile(profile_.get())
       ->Disconnect(browser_.get());
 }
 
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_utils_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_utils_unittest.mm
index 1ef5fba..c0e58903 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_utils_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_utils_unittest.mm
@@ -30,10 +30,10 @@
 class GridUtilsTest : public PlatformTest {
  public:
   GridUtilsTest() {
-    TestChromeBrowserState::Builder browser_state_builder;
-    browser_state_ = std::move(browser_state_builder).Build();
+    TestProfileIOS::Builder profile_builder;
+    profile_ = std::move(profile_builder).Build();
     browser_ = std::make_unique<TestBrowser>(
-        browser_state_.get(), std::make_unique<FakeWebStateListDelegate>());
+        profile_.get(), std::make_unique<FakeWebStateListDelegate>());
     web_state_list_ = browser_->GetWebStateList();
   }
 
@@ -52,7 +52,7 @@
   }
 
   web::WebTaskEnvironment task_environment_;
-  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
   std::unique_ptr<TestBrowser> browser_;
   raw_ptr<WebStateList> web_state_list_;
 };
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_coordinator.mm
index cb7e1511..4c76b266 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_coordinator.mm
@@ -65,10 +65,8 @@
                                 toolbarsMutator:toolbarsMutator
                            gridMediatorDelegate:delegate])) {
     _browser = browser->AsWeakPtr();
-    _incognitoEnabled =
-        !IsIncognitoModeDisabled(self.browser->GetBrowserState()
-                                     ->GetOriginalChromeBrowserState()
-                                     ->GetPrefs());
+    _incognitoEnabled = !IsIncognitoModeDisabled(
+        self.browser->GetProfile()->GetOriginalProfile()->GetPrefs());
   }
   return self;
 }
@@ -127,7 +125,7 @@
   self.gridContainerViewController = container;
 
   _tabContextMenuHelper = [[TabContextMenuHelper alloc]
-        initWithBrowserState:self.browser->GetBrowserState()
+             initWithProfile:self.browser->GetProfile()
       tabContextMenuDelegate:self.tabContextMenuDelegate];
 
   if (_incognitoEnabled) {
@@ -163,14 +161,14 @@
   _browser.reset();
   if (incognitoBrowser) {
     _browser = incognitoBrowser->AsWeakPtr();
-    _tabContextMenuHelper.browserState = incognitoBrowser->GetBrowserState();
+    _tabContextMenuHelper.profile = incognitoBrowser->GetProfile();
     [incognitoBrowser->GetCommandDispatcher()
         startDispatchingToTarget:self
                      forProtocol:@protocol(TabGroupsCommands)];
 
     _mediator.tabGroupsHandler = self;
   } else {
-    _tabContextMenuHelper.browserState = nullptr;
+    _tabContextMenuHelper.profile = nullptr;
   }
 }
 
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_mediator.mm
index 886703f..a5c73a0 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_mediator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_mediator.mm
@@ -54,7 +54,7 @@
   BOOL _selected;
   // Identity manager providing AccountInfo capabilities to determine
   // supervision status. This identity manager is not available for
-  // the incognito browser state and need to be passed in.
+  // the incognito profile and need to be passed in.
   raw_ptr<signin::IdentityManager> _identityManager;
   // Observer to track changes to supervision-related capabilities.
   std::unique_ptr<supervised_user::SupervisedUserCapabilitiesObserverBridge>
@@ -220,7 +220,7 @@
   [super setBrowser:browser];
 
   if (browser) {
-    PrefService* prefService = browser->GetBrowserState()->GetPrefs();
+    PrefService* prefService = browser->GetProfile()->GetPrefs();
     DCHECK(prefService);
 
     if (!base::FeatureList::IsEnabled(
@@ -243,7 +243,7 @@
   Browser* browser = self.browser;
   DCHECK(browser);
 
-  return browser->GetBrowserState()->GetPrefs();
+  return browser->GetProfile()->GetPrefs();
 }
 
 - (void)setReauthSceneAgent:(IncognitoReauthSceneAgent*)reauthSceneAgent {
@@ -308,7 +308,7 @@
 // Returns YES if incognito is disabled.
 - (BOOL)isIncognitoModeDisabled {
   DCHECK(self.browser);
-  PrefService* prefService = self.browser->GetBrowserState()->GetPrefs();
+  PrefService* prefService = self.browser->GetProfile()->GetPrefs();
   if (IsIncognitoModeDisabled(prefService)) {
     return YES;
   }
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_mediator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_mediator_unittest.mm
index 2486a19..fc78668b 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_mediator_unittest.mm
@@ -62,7 +62,7 @@
 
   // IncognitoModePrefs::kEnabled Means that users may open pages in both
   // Incognito mode and normal mode
-  browser_state_->GetTestingPrefService()->SetManagedPref(
+  profile_->GetTestingPrefService()->SetManagedPref(
       policy::policy_prefs::kIncognitoModeAvailability,
       std::make_unique<base::Value>(
           static_cast<int>(IncognitoModePrefs::kEnabled)));
@@ -81,7 +81,7 @@
 
   // IncognitoModePrefs::kDisabled Means that users may not open pages in
   // Incognito mode. Only normal mode is available for browsing.
-  browser_state_->GetTestingPrefService()->SetManagedPref(
+  profile_->GetTestingPrefService()->SetManagedPref(
       policy::policy_prefs::kIncognitoModeAvailability,
       std::make_unique<base::Value>(
           static_cast<int>(IncognitoModePrefs::kDisabled)));
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_coordinator.mm
index c783354..ae2840b 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_coordinator.mm
@@ -109,10 +109,10 @@
                    forProtocol:@protocol(TabsAnimationCommands)];
 
   BOOL regularModeEnabled =
-      !IsIncognitoModeForced(self.browser->GetBrowserState()->GetPrefs());
+      !IsIncognitoModeForced(self.browser->GetProfile()->GetPrefs());
 
   _contextMenuProvider = [[TabContextMenuHelper alloc]
-        initWithBrowserState:self.browser->GetBrowserState()
+             initWithProfile:self.browser->GetProfile()
       tabContextMenuDelegate:self.tabContextMenuDelegate];
 
   GridContainerViewController* container =
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_mediator.mm
index fae643b..ad46c38d 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_mediator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_mediator.mm
@@ -132,7 +132,7 @@
   // enabled page can make it to a disabled page by releasing the
   // button press after switching to the disabled page (b/273416844 is an
   // example).
-  if (IsIncognitoModeForced(self.browser->GetBrowserState()->GetPrefs())) {
+  if (IsIncognitoModeForced(self.browser->GetProfile()->GetPrefs())) {
     return;
   }
 
@@ -166,7 +166,7 @@
   // correct delegate.
   [self.toolbarsMutator setToolbarsButtonsDelegate:self];
 
-  if (IsIncognitoModeForced(self.browser->GetBrowserState()->GetPrefs())) {
+  if (IsIncognitoModeForced(self.browser->GetProfile()->GetPrefs())) {
     [self.toolbarsMutator
         setToolbarConfiguration:
             [TabGridToolbarsConfiguration
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_mediator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_mediator_unittest.mm
index 26a535e..883954c 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_mediator_unittest.mm
@@ -39,8 +39,7 @@
     [mediator_ currentlySelectedGrid:YES];
 
     tab_restore_service_ =
-        IOSChromeTabRestoreServiceFactory::GetForBrowserState(
-            browser_state_.get());
+        IOSChromeTabRestoreServiceFactory::GetForProfile(profile_.get());
   }
 
   void TearDown() override {
@@ -141,7 +140,7 @@
 TEST_F(RegularGridMediatorTest, OpenNewTab_OpenIfAllowedByPolicy) {
   // IncognitoModePrefs::kEnabled Means that users may open pages in both
   // Incognito mode and normal mode
-  browser_state_->GetTestingPrefService()->SetManagedPref(
+  profile_->GetTestingPrefService()->SetManagedPref(
       policy::policy_prefs::kIncognitoModeAvailability,
       std::make_unique<base::Value>(
           static_cast<int>(IncognitoModePrefs::kEnabled)));
@@ -157,7 +156,7 @@
 
   // IncognitoModePrefs::kDisabled Means that users may not open pages in
   // Incognito mode. Only normal mode is available for browsing.
-  browser_state_->GetTestingPrefService()->SetManagedPref(
+  profile_->GetTestingPrefService()->SetManagedPref(
       policy::policy_prefs::kIncognitoModeAvailability,
       std::make_unique<base::Value>(
           static_cast<int>(IncognitoModePrefs::kDisabled)));
@@ -170,7 +169,7 @@
 
   // IncognitoModePrefs::kForced Means that users may open pages *ONLY* in
   // Incognito mode. Normal mode is not available for browsing.
-  browser_state_->GetTestingPrefService()->SetManagedPref(
+  profile_->GetTestingPrefService()->SetManagedPref(
       policy::policy_prefs::kIncognitoModeAvailability,
       std::make_unique<base::Value>(
           static_cast<int>(IncognitoModePrefs::kForced)));
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_coordinator.mm
index e91e903..d6ceda5e1 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_coordinator.mm
@@ -183,7 +183,7 @@
   [super start];
 
   _contextMenuProvider = [[TabContextMenuHelper alloc]
-        initWithBrowserState:self.browser->GetActiveBrowser()->GetBrowserState()
+             initWithProfile:self.browser->GetActiveBrowser()->GetProfile()
       tabContextMenuDelegate:self.tabContextMenuDelegate];
 
   Browser* browser = self.browser;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_mediator.mm
index e1c0d9b..94b07cd 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_mediator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_mediator.mm
@@ -66,8 +66,8 @@
 
 // The list from the browser.
 @property(nonatomic, assign) WebStateList* webStateList;
-// The browser state from the browser.
-@property(nonatomic, readonly) ChromeBrowserState* browserState;
+// The profile from the browser.
+@property(nonatomic, readonly) ProfileIOS* profile;
 // The UI consumer to which updates are made.
 @property(nonatomic, weak) id<PinnedTabCollectionConsumer> consumer;
 
@@ -114,7 +114,7 @@
   _browser = browser;
 
   _webStateList = browser ? browser->GetWebStateList() : nullptr;
-  _browserState = browser ? browser->GetBrowserState() : nullptr;
+  _profile = browser ? browser->GetProfile() : nullptr;
 
   if (_webStateList) {
     _scopedWebStateListObservation->AddObservation(_webStateList);
@@ -458,8 +458,8 @@
     return;
   }
 
-  DCHECK(self.browserState);
-  web::WebState::CreateParams params(self.browserState);
+  DCHECK(self.profile);
+  web::WebState::CreateParams params(self.profile);
   std::unique_ptr<web::WebState> webState = web::WebState::Create(params);
 
   web::NavigationManager::WebLoadParams loadParams(newTabURL);
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/tests/pinned_tabs_mediator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/tests/pinned_tabs_mediator_unittest.mm
index 0cef570..42b1e9f 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/tests/pinned_tabs_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/tests/pinned_tabs_mediator_unittest.mm
@@ -50,15 +50,14 @@
 class PinnedTabsMediatorTest : public PlatformTest {
  public:
   PinnedTabsMediatorTest() {
-    TestChromeBrowserState::Builder builder;
-    browser_state_ = std::move(builder).Build();
+    TestProfileIOS::Builder builder;
+    profile_ = std::move(builder).Build();
 
-    regular_browser_ = std::make_unique<TestBrowser>(browser_state_.get());
-    incognito_browser_ = std::make_unique<TestBrowser>(
-        browser_state_->GetOffTheRecordChromeBrowserState());
+    regular_browser_ = std::make_unique<TestBrowser>(profile_.get());
+    incognito_browser_ =
+        std::make_unique<TestBrowser>(profile_->GetOffTheRecordProfile());
 
-    browser_list_ =
-        BrowserListFactory::GetForBrowserState(browser_state_.get());
+    browser_list_ = BrowserListFactory::GetForProfile(profile_.get());
     browser_list_->AddBrowser(regular_browser_.get());
     browser_list_->AddBrowser(incognito_browser_.get());
 
@@ -81,7 +80,7 @@
     navigation_manager->SetLastCommittedItem(
         navigation_manager->GetItemAtIndex(0));
     web_state->SetNavigationManager(std::move(navigation_manager));
-    web_state->SetBrowserState(browser_state_.get());
+    web_state->SetBrowserState(profile_.get());
     web_state->SetNavigationItemCount(1);
     web_state->SetCurrentURL(url);
     return web_state;
@@ -105,7 +104,7 @@
   web::WebTaskEnvironment task_environment_;
   base::test::ScopedFeatureList feature_list_;
   raw_ptr<BrowserList> browser_list_;
-  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
 };
 
 // Tests that the consumer is notified when a web state is pinned.
@@ -220,7 +219,7 @@
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
   ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "a* b c | d e f", regular_browser_->GetBrowserState()));
+      "a* b c | d e f", regular_browser_->GetProfile()));
 
   // Drop "A" after "C".
   web::WebStateID web_state_id =
@@ -259,7 +258,7 @@
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
   ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "a* b c | d e f", regular_browser_->GetBrowserState()));
+      "a* b c | d e f", regular_browser_->GetProfile()));
 
   // Drop "E" after "C".
   web::WebStateID web_state_id =
@@ -298,7 +297,7 @@
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
   ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "a* b c | d [ 0 e f ]", regular_browser_->GetBrowserState()));
+      "a* b c | d [ 0 e f ]", regular_browser_->GetProfile()));
 
   // Drop "E" after "C".
   web::WebStateID web_state_id =
@@ -348,7 +347,7 @@
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
   ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "a* b c | d", regular_browser_->GetBrowserState()));
+      "a* b c | d", regular_browser_->GetProfile()));
   ASSERT_EQ(4, web_state_list->count());
 
   NSItemProvider* item_provider = [[NSItemProvider alloc]
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.h
index 0c12516..994e0bd 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.h
@@ -16,11 +16,11 @@
 @interface TabContextMenuHelper : NSObject <TabContextMenuProvider>
 
 // Browser state reference.
-@property(nonatomic, assign) ChromeBrowserState* browserState;
+@property(nonatomic, assign) ProfileIOS* profile;
 
-- (instancetype)initWithBrowserState:(ChromeBrowserState*)browserState
-              tabContextMenuDelegate:
-                  (id<TabContextMenuDelegate>)tabContextMenuDelegate
+- (instancetype)initWithProfile:(ProfileIOS*)profile
+         tabContextMenuDelegate:
+             (id<TabContextMenuDelegate>)tabContextMenuDelegate
     NS_DESIGNATED_INITIALIZER;
 - (instancetype)init NS_UNAVAILABLE;
 
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.mm
index d8585e4..8c1de26 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_context_menu/tab_context_menu_helper.mm
@@ -43,14 +43,14 @@
 
 #pragma mark - TabContextMenuProvider
 
-- (instancetype)initWithBrowserState:(ChromeBrowserState*)browserState
-              tabContextMenuDelegate:
-                  (id<TabContextMenuDelegate>)tabContextMenuDelegate {
+- (instancetype)initWithProfile:(ProfileIOS*)profile
+         tabContextMenuDelegate:
+             (id<TabContextMenuDelegate>)tabContextMenuDelegate {
   self = [super init];
   if (self) {
-    _browserState = browserState;
+    _profile = profile;
     _contextMenuDelegate = tabContextMenuDelegate;
-    _incognito = _browserState->IsOffTheRecord();
+    _incognito = _profile->IsOffTheRecord();
   }
   return self;
 }
@@ -165,7 +165,7 @@
           }];
     }
 
-    if (_browserState) {
+    if (_profile) {
       const BOOL currentlyBookmarked = [self isTabItemBookmarked:item];
       if (currentlyBookmarked) {
         bookmarkAction = [actionFactory actionToEditBookmarkWithBlock:^{
@@ -178,7 +178,7 @@
       }
       // Bookmarking can be disabled from prefs (from an enterprise policy),
       // if that's the case grey out the option in the menu.
-      BOOL isEditBookmarksEnabled = _browserState->GetPrefs()->GetBoolean(
+      BOOL isEditBookmarksEnabled = _profile->GetPrefs()->GetBoolean(
           bookmarks::prefs::kEditBookmarksEnabled);
       if (!isEditBookmarksEnabled && bookmarkAction) {
         bookmarkAction.attributes = UIMenuElementAttributesDisabled;
@@ -214,7 +214,7 @@
   NSMutableArray<UIMenuElement*>* menuElements = [[NSMutableArray alloc] init];
 
   if (IsTabGroupInGridEnabled()) {
-    std::set<const TabGroup*> groups = GetAllGroupsForProfile(_browserState);
+    std::set<const TabGroup*> groups = GetAllGroupsForProfile(_profile);
 
     auto actionResult = ^(const TabGroup* group) {
       [weakSelf handleAddWebState:tabID toGroup:group];
@@ -359,7 +359,7 @@
 // Returns `YES` if the tab `item` is already bookmarked.
 - (BOOL)isTabItemBookmarked:(TabItem*)item {
   bookmarks::BookmarkModel* bookmarkModel =
-      ios::BookmarkModelFactory::GetForBrowserState(_browserState);
+      ios::BookmarkModelFactory::GetForProfile(_profile);
   return item && bookmarkModel->IsBookmarked(item.URL);
 }
 
@@ -369,8 +369,7 @@
     return NO;
   }
 
-  BrowserList* browserList =
-      BrowserListFactory::GetForBrowserState(_browserState);
+  BrowserList* browserList = BrowserListFactory::GetForProfile(_profile);
 
   for (Browser* browser :
        browserList->BrowsersOfType(BrowserList::BrowserType::kRegular)) {
@@ -389,8 +388,7 @@
 
 // Returns the TabItem object representing the tab with `identifier.
 - (TabItem*)tabItemForIdentifier:(web::WebStateID)identifier {
-  BrowserList* browserList =
-      BrowserListFactory::GetForBrowserState(_browserState);
+  BrowserList* browserList = BrowserListFactory::GetForProfile(_profile);
   const BrowserList::BrowserType browser_types =
       _incognito ? BrowserList::BrowserType::kIncognito
                  : BrowserList::BrowserType::kRegularAndInactive;
@@ -413,14 +411,13 @@
     [self.contextMenuDelegate createNewTabGroupWithIdentifier:webStateID
                                                     incognito:self.incognito];
   } else {
-    MoveTabToGroup(webStateID, group, _browserState);
+    MoveTabToGroup(webStateID, group, _profile);
   }
 }
 
 // Handles the result of the remove from group block.
 - (void)handleRemoveWebStateFromGroup:(web::WebStateID)webStateID {
-  BrowserList* browserList =
-      BrowserListFactory::GetForBrowserState(_browserState);
+  BrowserList* browserList = BrowserListFactory::GetForProfile(_profile);
 
   for (Browser* browser :
        browserList->BrowsersOfType(BrowserList::BrowserType::kRegular)) {
@@ -438,8 +435,7 @@
 
 // Returns the group of the given `webStateID`.
 - (const TabGroup*)groupForWebState:(web::WebStateID)webStateID {
-  BrowserList* browserList =
-      BrowserListFactory::GetForBrowserState(_browserState);
+  BrowserList* browserList = BrowserListFactory::GetForProfile(_profile);
 
   for (Browser* browser :
        browserList->BrowsersOfType(BrowserList::BrowserType::kRegular)) {
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.h
index 379156b..cae58adf 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.h
@@ -33,7 +33,7 @@
 // Updates the incognito browser. Should only be sets when both the current
 // incognito browser and the new incognito browser are either nil or contain no
 // tabs. This must be called after the incognito browser has been deleted
-// because the incognito browser state is deleted.
+// because the incognito profile is deleted.
 @property(nonatomic, assign) Browser* incognitoBrowser;
 
 // The view controller, if any, that is active.
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm
index 7695137..7009d65 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm
@@ -298,11 +298,10 @@
     _inactiveBrowser = inactiveBrowser;
     _incognitoBrowser = incognitoBrowser;
 
-    if (IsIncognitoModeDisabled(
-            _regularBrowser->GetBrowserState()->GetPrefs())) {
+    if (IsIncognitoModeDisabled(_regularBrowser->GetProfile()->GetPrefs())) {
       _pageConfiguration = TabGridPageConfiguration::kIncognitoPageDisabled;
     } else if (IsIncognitoModeForced(
-                   _incognitoBrowser->GetBrowserState()->GetPrefs())) {
+                   _incognitoBrowser->GetProfile()->GetPrefs())) {
       _pageConfiguration = TabGridPageConfiguration::kIncognitoPageOnly;
     } else {
       _pageConfiguration = TabGridPageConfiguration::kAllPagesEnabled;
@@ -424,8 +423,8 @@
   if (currentActivePage == TabGridPageRegularTabs &&
       !_bringAndroidTabsPromptCoordinator) {
     BringAndroidTabsToIOSService* bringAndroidTabsService =
-        BringAndroidTabsToIOSServiceFactory::GetForBrowserState(
-            self.regularBrowser->GetBrowserState());
+        BringAndroidTabsToIOSServiceFactory::GetForProfile(
+            self.regularBrowser->GetProfile());
     if (bringAndroidTabsService != nil) {
       bringAndroidTabsService->LoadTabs();
       shouldDisplayBringAndroidTabsPrompt =
@@ -783,13 +782,12 @@
       startDispatchingToTarget:self
                    forProtocol:@protocol(TabGridCommands)];
 
-  ChromeBrowserState* browser_state = self.regularBrowser->GetBrowserState();
+  ProfileIOS* profile = self.regularBrowser->GetProfile();
   _mediator = [[TabGridMediator alloc]
-       initWithIdentityManager:IdentityManagerFactory::GetForProfile(
-                                   browser_state)
-                   prefService:browser_state->GetPrefs()
+       initWithIdentityManager:IdentityManagerFactory::GetForProfile(profile)
+                   prefService:profile->GetPrefs()
       featureEngagementTracker:feature_engagement::TrackerFactory::
-                                   GetForBrowserState(browser_state)
+                                   GetForProfile(profile)
                     modeHolder:_modeHolder];
 
   id<ApplicationCommands> applicationCommandsHandler =
@@ -841,8 +839,8 @@
   baseViewController.regularGridHandler = _regularGridCoordinator.gridHandler;
   self.regularTabsMediator = _regularGridCoordinator.regularGridMediator;
 
-  ChromeBrowserState* regularBrowserState =
-      _regularBrowser ? _regularBrowser->GetBrowserState() : nullptr;
+  ProfileIOS* regularProfile =
+      _regularBrowser ? _regularBrowser->GetProfile() : nullptr;
   WebStateList* regularWebStateList =
       _regularBrowser ? _regularBrowser->GetWebStateList() : nullptr;
   self.priceCardMediator =
@@ -879,8 +877,8 @@
 
   self.incognitoTabsMediator = _incognitoGridCoordinator.incognitoGridMediator;
   [self.incognitoTabsMediator
-      initializeSupervisedUserCapabilitiesObserver:
-          IdentityManagerFactory::GetForProfile(browser_state)];
+      initializeSupervisedUserCapabilitiesObserver:IdentityManagerFactory::
+                                                       GetForProfile(profile)];
 
   baseViewController.incognitoGridHandler =
       _incognitoGridCoordinator.gridHandler;
@@ -926,22 +924,21 @@
     _hackRecentTabsTableViewController = remoteTabsViewController;
   } else {
     // TODO(crbug.com/41390276) : Remove RecentTabsTableViewController
-    // dependency on ChromeBrowserState so that we don't need to expose the view
+    // dependency on ProfileIOS so that we don't need to expose the view
     // controller.
     baseViewController.remoteTabsViewController.browser = self.regularBrowser;
     sync_sessions::SessionSyncService* syncService =
-        SessionSyncServiceFactory::GetForBrowserState(regularBrowserState);
+        SessionSyncServiceFactory::GetForProfile(regularProfile);
     signin::IdentityManager* identityManager =
-        IdentityManagerFactory::GetForProfile(regularBrowserState);
+        IdentityManagerFactory::GetForProfile(regularProfile);
     sessions::TabRestoreService* restoreService =
-        IOSChromeTabRestoreServiceFactory::GetForBrowserState(
-            regularBrowserState);
+        IOSChromeTabRestoreServiceFactory::GetForProfile(regularProfile);
     FaviconLoader* faviconLoader =
-        IOSChromeFaviconLoaderFactory::GetForBrowserState(regularBrowserState);
+        IOSChromeFaviconLoaderFactory::GetForProfile(regularProfile);
     syncer::SyncService* service =
-        SyncServiceFactory::GetForBrowserState(regularBrowserState);
+        SyncServiceFactory::GetForProfile(regularProfile);
     BrowserList* browserList =
-        BrowserListFactory::GetForBrowserState(regularBrowserState);
+        BrowserListFactory::GetForProfile(regularProfile);
     SceneState* currentSceneState = self.regularBrowser->GetSceneState();
     // TODO(crbug.com/40273478): Rename in recentTabsMediator.
     self.remoteTabsMediator = [[RecentTabsMediator alloc]
@@ -955,7 +952,7 @@
                   disabledByPolicy:_pageConfiguration ==
                                    TabGridPageConfiguration::kIncognitoPageOnly
                  engagementTracker:feature_engagement::TrackerFactory::
-                                       GetForBrowserState(regularBrowserState)
+                                       GetForProfile(regularProfile)
                         modeHolder:_modeHolder];
     self.remoteTabsMediator.consumer = baseViewController.remoteTabsConsumer;
     self.remoteTabsMediator.tabGridHandler = self;
@@ -999,7 +996,7 @@
   // hierarchy. As a workaround, the view controller hierarchy is loaded here
   // before `RecentTabsMediator` updates are started.
   self.window.rootViewController = self.baseViewController;
-  if (regularBrowserState) {
+  if (regularProfile) {
     [self.remoteTabsMediator initObservers];
     [self.remoteTabsMediator refreshSessionsView];
   }
@@ -1278,15 +1275,15 @@
 - (BOOL)tabGridIsUserEligibleForSwipeToIncognitoIPH {
   return _pageConfiguration == TabGridPageConfiguration::kAllPagesEnabled &&
          IsFirstRunRecent(base::Days(60)) &&
-         feature_engagement::TrackerFactory::GetForBrowserState(
-             self.regularBrowser->GetBrowserState())
+         feature_engagement::TrackerFactory::GetForProfile(
+             self.regularBrowser->GetProfile())
              ->WouldTriggerHelpUI(
                  feature_engagement::kIPHiOSTabGridSwipeRightForIncognito);
 }
 
 - (BOOL)tabGridShouldPresentSwipeToIncognitoIPH {
-  return feature_engagement::TrackerFactory::GetForBrowserState(
-             self.regularBrowser->GetBrowserState())
+  return feature_engagement::TrackerFactory::GetForProfile(
+             self.regularBrowser->GetProfile())
       ->ShouldTriggerHelpUI(
           feature_engagement::kIPHiOSTabGridSwipeRightForIncognito);
 }
@@ -1294,8 +1291,8 @@
 - (void)tabGridDidDismissSwipeToIncognitoIPHWithReason:
     (IPHDismissalReasonType)reason {
   feature_engagement::Tracker* tracker =
-      feature_engagement::TrackerFactory::GetForBrowserState(
-          self.regularBrowser->GetBrowserState());
+      feature_engagement::TrackerFactory::GetForProfile(
+          self.regularBrowser->GetProfile());
   if (tracker) {
     tracker->DismissedWithSnooze(
         feature_engagement::kIPHiOSTabGridSwipeRightForIncognito,
@@ -1392,7 +1389,7 @@
       "Mobile.RecentTabsManager.TotalTabsFromOtherDevicesOpenAll",
       session->tabs.size());
 
-  BOOL inIncognito = self.regularBrowser->GetBrowserState()->IsOffTheRecord();
+  BOOL inIncognito = self.regularBrowser->GetProfile()->IsOffTheRecord();
   OpenDistantSessionInBackground(
       session, inIncognito, GetDefaultNumberOfTabsToLoadSimultaneously(),
       UrlLoadingBrowserAgent::FromBrowser(self.regularBrowser),
@@ -1445,8 +1442,8 @@
 
 - (void)bookmarkURL:(const GURL&)URL title:(NSString*)title {
   bookmarks::BookmarkModel* bookmarkModel =
-      ios::BookmarkModelFactory::GetForBrowserState(
-          self.regularBrowser->GetBrowserState());
+      ios::BookmarkModelFactory::GetForProfile(
+          self.regularBrowser->GetProfile());
   if (bookmarkModel->IsBookmarked(URL)) {
     [self editBookmarkWithURL:URL];
   } else {
@@ -1609,7 +1606,7 @@
     // The user journey to bring recent tabs on Android to iOS has finished.
     // Reload the service to update/clear the tabs.
     BringAndroidTabsToIOSServiceFactory::GetForProfileIfExists(
-        self.regularBrowser->GetBrowserState())
+        self.regularBrowser->GetProfile())
         ->LoadTabs();
   }
   [_bringAndroidTabsPromptCoordinator stop];
@@ -1652,8 +1649,8 @@
 
 - (void)showWebSearchForText:(NSString*)text {
   TemplateURLService* templateURLService =
-      ios::TemplateURLServiceFactory::GetForBrowserState(
-          self.regularBrowser->GetBrowserState());
+      ios::TemplateURLServiceFactory::GetForProfile(
+          self.regularBrowser->GetProfile());
 
   const TemplateURL* searchURLTemplate =
       templateURLService->GetDefaultSearchProvider();
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm
index 4d48cd35..16eb999e 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm
@@ -100,27 +100,23 @@
       }
     }
 
-    TestChromeBrowserState::Builder test_cbs_builder;
-    test_cbs_builder.AddTestingFactory(
+    TestProfileIOS::Builder builder;
+    builder.AddTestingFactory(
         IOSChromeTabRestoreServiceFactory::GetInstance(),
         IOSChromeTabRestoreServiceFactory::GetDefaultFactory());
-    test_cbs_builder.AddTestingFactory(
+    builder.AddTestingFactory(
         AuthenticationServiceFactory::GetInstance(),
         AuthenticationServiceFactory::GetDefaultFactory());
-    test_cbs_builder.AddTestingFactory(
-        ios::BookmarkModelFactory::GetInstance(),
-        ios::BookmarkModelFactory::GetDefaultFactory());
-    chrome_browser_state_ = std::move(test_cbs_builder).Build();
-    AuthenticationServiceFactory::CreateAndInitializeForBrowserState(
-        chrome_browser_state_.get(),
-        std::make_unique<FakeAuthenticationServiceDelegate>());
+    builder.AddTestingFactory(ios::BookmarkModelFactory::GetInstance(),
+                              ios::BookmarkModelFactory::GetDefaultFactory());
+    profile_ = std::move(builder).Build();
+    AuthenticationServiceFactory::CreateAndInitializeForProfile(
+        profile_.get(), std::make_unique<FakeAuthenticationServiceDelegate>());
 
     bookmarks::test::WaitForBookmarkModelToLoad(
-        ios::BookmarkModelFactory::GetForBrowserState(
-            chrome_browser_state_.get()));
+        ios::BookmarkModelFactory::GetForProfile(profile_.get()));
 
-    browser_ = std::make_unique<TestBrowser>(chrome_browser_state_.get(),
-                                             scene_state_);
+    browser_ = std::make_unique<TestBrowser>(profile_.get(), scene_state_);
 
     // Set up ApplicationCommands mock.
     id mock_application_handler =
@@ -132,8 +128,7 @@
     AddAgentsToBrowser(browser_.get());
 
     incognito_browser_ = std::make_unique<TestBrowser>(
-        chrome_browser_state_->GetOffTheRecordChromeBrowserState(),
-        scene_state_);
+        profile_->GetOffTheRecordProfile(), scene_state_);
     AddAgentsToBrowser(incognito_browser_.get());
 
     IncognitoReauthSceneAgent* reauth_agent = [[IncognitoReauthSceneAgent alloc]
@@ -182,7 +177,7 @@
  protected:
   web::WebTaskEnvironment task_environment_;
   IOSChromeScopedTestingLocalState scoped_testing_local_state_;
-  std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
 
   // Browser for the coordinator.
   std::unique_ptr<Browser> browser_;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller_unittest.mm
index e7a277f..b2a6a51 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller_unittest.mm
@@ -59,10 +59,9 @@
     }
     InitializeViewController(TabGridPageConfiguration::kAllPagesEnabled);
 
-    browser_state_ = TestChromeBrowserState::Builder().Build();
+    profile_ = TestProfileIOS::Builder().Build();
     browser_ = std::make_unique<TestBrowser>(
-        browser_state_.get(),
-        std::make_unique<TabGridFakeWebStateListDelegate>());
+        profile_.get(), std::make_unique<TabGridFakeWebStateListDelegate>());
     SnapshotBrowserAgent::CreateForBrowser(browser_.get());
   }
   ~TabGridViewControllerTest() override {}
@@ -116,7 +115,7 @@
   IOSChromeScopedTestingLocalState scoped_testing_local_state_;
   base::UserActionTester user_action_tester_;
   TabGridViewController* view_controller_;
-  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
   std::unique_ptr<TestBrowser> browser_;
   GridContainerViewController* regular_grid_;
   GridContainerViewController* incognito_grid_;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/create_tab_group_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/create_tab_group_coordinator.mm
index 5e46d0a..80c007e 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/create_tab_group_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/create_tab_group_coordinator.mm
@@ -96,10 +96,9 @@
 
 - (void)start {
   Browser* browser = self.browser;
-  ChromeBrowserState* browserState = browser->GetBrowserState();
+  ProfileIOS* profile = browser->GetProfile();
   BOOL editMode = _tabGroup != nullptr;
-  syncer::SyncService* syncService =
-      SyncServiceFactory::GetForBrowserState(browserState);
+  syncer::SyncService* syncService = SyncServiceFactory::GetForProfile(profile);
   BOOL tabSynced =
       syncService && syncService->GetUserSettings()->GetSelectedTypes().Has(
                          syncer::UserSelectableType::kTabs);
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/create_tab_group_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/create_tab_group_mediator.mm
index 2ff49b6..9799329 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/create_tab_group_mediator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/create_tab_group_mediator.mm
@@ -79,9 +79,8 @@
     [_consumer setDefaultGroupColor:TabGroup::DefaultColorForNewTabGroup(
                                         _webStateList)];
 
-    ChromeBrowserState* browserState = browser->GetBrowserState();
-    BrowserList* browserList =
-        BrowserListFactory::GetForBrowserState(browserState);
+    ProfileIOS* profile = browser->GetProfile();
+    BrowserList* browserList = BrowserListFactory::GetForProfile(profile);
 
     _tabGroupInfos = [[NSMutableArray alloc] init];
 
@@ -101,7 +100,7 @@
         // The selected tab is currently in a different web state list (inactive
         // tab, or tab from another window).
         Browser* selectedTabBrowser = GetBrowserForTabWithId(
-            browserList, identifier, browserState->IsOffTheRecord());
+            browserList, identifier, profile->IsOffTheRecord());
         CHECK(browser);
         currentWebStateList = selectedTabBrowser->GetWebStateList();
         index =
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_coordinator.mm
index c385a88..a1eb3b0 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_coordinator.mm
@@ -73,7 +73,7 @@
       self.browser->GetCommandDispatcher(), TabGroupsCommands);
   _viewController = [[TabGroupViewController alloc]
       initWithHandler:handler
-            incognito:self.browser->GetBrowserState()->IsOffTheRecord()
+            incognito:self.browser->GetProfile()->IsOffTheRecord()
              tabGroup:_tabGroup];
 
   _viewController.gridViewController.delegate = self;
@@ -89,7 +89,7 @@
   _mediator.tabGridIdleStatusHandler = self.tabGridIdleStatusHandler;
 
   _tabContextMenuHelper = [[TabContextMenuHelper alloc]
-        initWithBrowserState:self.browser->GetBrowserState()
+             initWithProfile:self.browser->GetProfile()
       tabContextMenuDelegate:self.tabContextMenuDelegate];
 
   _viewController.mutator = _mediator;
@@ -210,7 +210,7 @@
 
 - (void)gridViewController:(BaseGridViewController*)gridViewController
        didSelectItemWithID:(web::WebStateID)itemID {
-  BOOL incognito = self.browser->GetBrowserState()->IsOffTheRecord();
+  BOOL incognito = self.browser->GetProfile()->IsOffTheRecord();
   if ([_mediator isItemWithIDSelected:itemID]) {
     if (incognito) {
       base::RecordAction(base::UserMetricsAction(
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_coordinator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_coordinator_unittest.mm
index a932d97..47de9e4 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_coordinator_unittest.mm
@@ -41,9 +41,9 @@
  protected:
   TabGroupCoordinatorTest() {
     feature_list_.InitWithFeatures({kTabGroupsIPad, kModernTabStrip}, {});
-    browser_state_ = TestChromeBrowserState::Builder().Build();
+    profile_ = TestProfileIOS::Builder().Build();
     browser_ = std::make_unique<TestBrowser>(
-        browser_state_.get(),
+        profile_.get(),
         std::make_unique<TabGroupCoordinatorFakeWebStateListDelegate>());
 
     SnapshotBrowserAgent::CreateForBrowser(browser_.get());
@@ -79,10 +79,10 @@
 
   ~TabGroupCoordinatorTest() override { [coordinator_ stop]; }
 
-  // Needed for test browser state created by TestBrowser().
+  // Needed for test profile created by TestBrowser().
   base::test::TaskEnvironment task_environment_;
   base::test::ScopedFeatureList feature_list_;
-  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
   std::unique_ptr<TestBrowser> browser_;
   UIViewController* base_view_controller_;
   TabGroupCoordinator* coordinator_;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_mediator.mm
index da3dd11..ea7fb4a9 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_mediator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_mediator.mm
@@ -89,8 +89,8 @@
       tabGridDidPerformAction:TabGridActionType::kInPageAction];
   if (IsTabGroupSyncEnabled()) {
     tab_groups::TabGroupSyncService* syncService =
-        tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
-            self.browser->GetBrowserState());
+        tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+            self.browser->GetProfile());
     tab_groups::utils::CloseTabGroupLocally(_tabGroup.get(), self.webStateList,
                                             syncService);
   } else {
@@ -196,9 +196,9 @@
 }
 
 - (void)insertNewWebStateAtGridIndex:(int)index withURL:(const GURL&)newTabURL {
-  CHECK(self.browser->GetBrowserState());
+  CHECK(self.browser->GetProfile());
 
-  web::WebState::CreateParams params(self.browser->GetBrowserState());
+  web::WebState::CreateParams params(self.browser->GetProfile());
   std::unique_ptr<web::WebState> webState = web::WebState::Create(params);
 
   int webStateListIndex = _tabGroup->range().range_begin() + index;
@@ -440,10 +440,9 @@
   if (!self.browser || !group) {
     return NO;
   }
-  ChromeBrowserState* browserState = self.browser->GetBrowserState();
-  if (!browserState ||
-      !IsAddNewTabAllowedByPolicy(browserState->GetPrefs(),
-                                  browserState->IsOffTheRecord())) {
+  ProfileIOS* profile = self.browser->GetProfile();
+  if (!profile || !IsAddNewTabAllowedByPolicy(profile->GetPrefs(),
+                                              profile->IsOffTheRecord())) {
     return NO;
   }
 
@@ -452,7 +451,7 @@
     return NO;
   }
 
-  web::WebState::CreateParams params(browserState);
+  web::WebState::CreateParams params(profile);
   std::unique_ptr<web::WebState> webState = web::WebState::Create(params);
 
   web::NavigationManager::WebLoadParams loadParams((GURL(kChromeUINewTabURL)));
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_mediator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_mediator_unittest.mm
index 9bd54be..759bd81 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_mediator_unittest.mm
@@ -43,7 +43,7 @@
     builder_ =
         std::make_unique<WebStateListBuilderFromDescription>(web_state_list);
     ASSERT_TRUE(builder_->BuildWebStateListFromDescription(
-        "| f [ 1 a* b c ] d e ", browser_->GetBrowserState()));
+        "| f [ 1 a* b c ] d e ", browser_->GetProfile()));
 
     mode_holder_ = [[TabGridModeHolder alloc] init];
 
@@ -139,7 +139,7 @@
 // the grid.
 TEST_F(TabGroupMediatorTest, DropCrossWindowTab) {
   auto other_browser = std::make_unique<TestBrowser>(
-      browser_state_.get(), scene_state_,
+      profile_.get(), scene_state_,
       std::make_unique<BrowserWebStateListDelegate>());
   SnapshotBrowserAgent::CreateForBrowser(other_browser.get());
 
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_sync_earl_grey_app_interface.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_sync_earl_grey_app_interface.mm
index 116bf50..b997aa5 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_sync_earl_grey_app_interface.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_group_sync_earl_grey_app_interface.mm
@@ -15,11 +15,11 @@
 
 // Returns the first regular (= non-incognito) browser from the loaded browser
 // states.
-ChromeBrowserState* GetRegularBrowser() {
-  for (ChromeBrowserState* browser_state :
+ProfileIOS* GetRegularBrowser() {
+  for (ProfileIOS* profile :
        GetApplicationContext()->GetProfileManager()->GetLoadedProfiles()) {
-    if (!browser_state->IsOffTheRecord()) {
-      return browser_state;
+    if (!profile->IsOffTheRecord()) {
+      return profile;
     }
   }
   return nullptr;
@@ -29,7 +29,7 @@
 tab_groups::FakeTabGroupSyncService* GetFakeTabGroupSyncService() {
   CHECK(IsTabGroupSyncEnabled());
   return static_cast<tab_groups::FakeTabGroupSyncService*>(
-      tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
+      tab_groups::TabGroupSyncServiceFactory::GetForProfile(
           GetRegularBrowser()));
 }
 
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_groups_panel_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_groups_panel_coordinator.mm
index 1db2abf..4f5c8aa 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_groups_panel_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_groups_panel_coordinator.mm
@@ -45,7 +45,7 @@
         (id<DisabledGridViewControllerDelegate>)disabledViewControllerDelegate {
   CHECK(baseViewController);
   CHECK(regularBrowser);
-  CHECK(!regularBrowser->GetBrowserState()->IsOffTheRecord());
+  CHECK(!regularBrowser->GetProfile()->IsOffTheRecord());
   CHECK(toolbarsMutator);
   CHECK(disabledViewControllerDelegate);
   self = [super initWithBaseViewController:baseViewController
@@ -63,7 +63,7 @@
   _gridContainerViewController = [[GridContainerViewController alloc] init];
 
   BOOL regularModeDisabled =
-      IsIncognitoModeForced(self.browser->GetBrowserState()->GetPrefs());
+      IsIncognitoModeForced(self.browser->GetProfile()->GetPrefs());
   if (regularModeDisabled) {
     _disabledViewController =
         [[DisabledGridViewController alloc] initWithPage:TabGridPageTabGroups];
@@ -76,14 +76,13 @@
   }
 
   tab_groups::TabGroupSyncService* tabGroupSyncService =
-      tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
-          self.browser->GetBrowserState());
+      tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+          self.browser->GetProfile());
   WebStateList* regularWebStateList = self.browser->GetWebStateList();
   FaviconLoader* faviconLoader =
-      IOSChromeFaviconLoaderFactory::GetForBrowserState(
-          self.browser->GetBrowserState());
+      IOSChromeFaviconLoaderFactory::GetForProfile(self.browser->GetProfile());
   BrowserList* browserList =
-      BrowserListFactory::GetForBrowserState(self.browser->GetBrowserState());
+      BrowserListFactory::GetForProfile(self.browser->GetProfile());
 
   _mediator = [[TabGroupsPanelMediator alloc]
       initWithTabGroupSyncService:tabGroupSyncService
@@ -135,8 +134,8 @@
 - (void)tabGroupsPanelMediator:(TabGroupsPanelMediator*)tabGroupsPanelMediator
            openGroupWithSyncID:(const base::Uuid&)syncID {
   tab_groups::TabGroupSyncService* tabGroupSyncService =
-      tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
-          self.browser->GetBrowserState());
+      tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+          self.browser->GetProfile());
   tabGroupSyncService->OpenTabGroup(
       syncID,
       std::make_unique<tab_groups::IOSTabGroupActionContext>(self.browser));
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_groups_panel_coordinator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_groups_panel_coordinator_unittest.mm
index bdf1a9f..b39a405 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_groups_panel_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_groups_panel_coordinator_unittest.mm
@@ -82,12 +82,12 @@
 class TabGroupsPanelCoordinatorTest : public PlatformTest {
  protected:
   TabGroupsPanelCoordinatorTest() {
-    TestChromeBrowserState::Builder builder;
+    TestProfileIOS::Builder builder;
     builder.AddTestingFactory(
         tab_groups::TabGroupSyncServiceFactory::GetInstance(),
         base::BindRepeating(&CreateMockSyncService));
-    browser_state_ = std::move(builder).Build();
-    browser_ = std::make_unique<TestBrowser>(browser_state_.get());
+    profile_ = std::move(builder).Build();
+    browser_ = std::make_unique<TestBrowser>(profile_.get());
 
     tab_grid_handler_mock_ = OCMProtocolMock(@protocol(TabGridCommands));
     [browser_->GetCommandDispatcher()
@@ -105,9 +105,9 @@
         disabledViewControllerDelegate:disabled_grid_view_controller_delegate_];
   }
 
-  // Needed for test browser state created by TestBrowser().
+  // Needed for test profile created by TestBrowser().
   base::test::TaskEnvironment task_environment_;
-  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
   std::unique_ptr<TestBrowser> browser_;
   UIViewController* base_view_controller_;
   TestToolbarsMutator* toolbars_mutator_;
@@ -142,7 +142,7 @@
 // Groups.
 TEST_F(TabGroupsPanelCoordinatorTest, IncognitoDisabled_TabGroupsShown) {
   // Disable Incognito with policy.
-  browser_state_->GetTestingPrefService()->SetManagedPref(
+  profile_->GetTestingPrefService()->SetManagedPref(
       policy::policy_prefs::kIncognitoModeAvailability,
       std::make_unique<base::Value>(
           static_cast<int>(IncognitoModePrefs::kDisabled)));
@@ -162,7 +162,7 @@
 // disabled Tab Groups view.
 TEST_F(TabGroupsPanelCoordinatorTest, IncognitoForced_TabGroupsDisabled) {
   // Force Incognito with policy.
-  browser_state_->GetTestingPrefService()->SetManagedPref(
+  profile_->GetTestingPrefService()->SetManagedPref(
       policy::policy_prefs::kIncognitoModeAvailability,
       std::make_unique<base::Value>(
           static_cast<int>(IncognitoModePrefs::kForced)));
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_groups_panel_mediator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_groups_panel_mediator_unittest.mm
index c2d3cb3..fbc3357e 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_groups_panel_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_groups/tab_groups_panel_mediator_unittest.mm
@@ -65,18 +65,17 @@
 class TabGroupsPanelMediatorTest : public PlatformTest {
  protected:
   TabGroupsPanelMediatorTest() : web_state_list_(&web_state_list_delegate_) {
-    browser_state_ = TestChromeBrowserState::Builder().Build();
+    profile_ = TestProfileIOS::Builder().Build();
     // Create a regular browser.
-    browser_ = std::make_unique<TestBrowser>(browser_state_.get());
-    browser_list_ =
-        BrowserListFactory::GetForBrowserState(browser_state_.get());
+    browser_ = std::make_unique<TestBrowser>(profile_.get());
+    browser_list_ = BrowserListFactory::GetForProfile(profile_.get());
     browser_list_->AddBrowser(browser_.get());
     mode_holder_ = [[TabGridModeHolder alloc] init];
   }
 
   web::WebTaskEnvironment task_environment_;
   std::unique_ptr<TestBrowser> browser_;
-  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
   raw_ptr<BrowserList> browser_list_;
   FakeWebStateListDelegate web_state_list_delegate_;
   WebStateList web_state_list_;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_toolbars_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_toolbars_coordinator.mm
index 6465de2..0d642cc 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_toolbars_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/toolbars/tab_grid_toolbars_coordinator.mm
@@ -33,7 +33,7 @@
 
 - (void)start {
   Browser* browser = self.browser;
-  CHECK(!browser->GetBrowserState()->IsOffTheRecord());
+  CHECK(!browser->GetProfile()->IsOffTheRecord());
 
   _mediator =
       [[TabGridToolbarsMediator alloc] initWithModeHolder:self.modeHolder];
@@ -67,8 +67,8 @@
 
 - (void)showSavedTabGroupIPH {
   feature_engagement::Tracker* tracker =
-      feature_engagement::TrackerFactory::GetForBrowserState(
-          self.browser->GetBrowserState());
+      feature_engagement::TrackerFactory::GetForProfile(
+          self.browser->GetProfile());
   if (!tracker->WouldTriggerHelpUI(
           feature_engagement::kIPHiOSSavedTabGroupClosed)) {
     return;
@@ -114,8 +114,8 @@
 - (void)savedTabGroupIPHDismissed {
   [self.topToolbar resetLastPageControlHighlight];
   feature_engagement::Tracker* tracker =
-      feature_engagement::TrackerFactory::GetForBrowserState(
-          self.browser->GetBrowserState());
+      feature_engagement::TrackerFactory::GetForProfile(
+          self.browser->GetProfile());
   tracker->Dismissed(feature_engagement::kIPHiOSSavedTabGroupClosed);
 }
 
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_group_confirmation_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_group_confirmation_coordinator.mm
index 63d9f059..87326ec 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_group_confirmation_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_group_confirmation_coordinator.mm
@@ -150,14 +150,14 @@
 
 // Returns a string used in the action sheet as a message.
 - (NSString*)sheetMessage {
-  ChromeBrowserState* browserState = self.browser->GetBrowserState();
+  ProfileIOS* profile = self.browser->GetProfile();
 
   // Show a user's email in the message if it's not incognito and a user is
   // signed in.
   NSString* userEmail = nil;
-  if (!browserState->IsOffTheRecord()) {
+  if (!profile->IsOffTheRecord()) {
     AuthenticationService* authenticationService =
-        AuthenticationServiceFactory::GetForBrowserState(browserState);
+        AuthenticationServiceFactory::GetForProfile(profile);
     id<SystemIdentity> identity = authenticationService->GetPrimaryIdentity(
         signin::ConsentLevel::kSignin);
     userEmail = identity.userEmail;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_coordinator.mm
index 47f979f..2699f4a 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_coordinator.mm
@@ -82,26 +82,25 @@
       startDispatchingToTarget:self
                    forProtocol:@protocol(TabStripCommands)];
 
-  ChromeBrowserState* browserState = self.browser->GetBrowserState();
-  CHECK(browserState);
+  ProfileIOS* profile = self.browser->GetProfile();
+  CHECK(profile);
   self.tabStripViewController = [[TabStripViewController alloc] init];
   self.tabStripViewController.layoutGuideCenter =
       LayoutGuideCenterForBrowser(self.browser);
   self.tabStripViewController.overrideUserInterfaceStyle =
-      browserState->IsOffTheRecord() ? UIUserInterfaceStyleDark
-                                     : UIUserInterfaceStyleUnspecified;
-  self.tabStripViewController.isIncognito = browserState->IsOffTheRecord();
+      profile->IsOffTheRecord() ? UIUserInterfaceStyleDark
+                                : UIUserInterfaceStyleUnspecified;
+  self.tabStripViewController.isIncognito = profile->IsOffTheRecord();
 
-  BrowserList* browserList =
-      BrowserListFactory::GetForBrowserState(browserState);
+  BrowserList* browserList = BrowserListFactory::GetForProfile(profile);
   tab_groups::TabGroupSyncService* tabGroupSyncService =
-      tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(browserState);
+      tab_groups::TabGroupSyncServiceFactory::GetForProfile(profile);
   self.mediator =
       [[TabStripMediator alloc] initWithConsumer:self.tabStripViewController
                              tabGroupSyncService:tabGroupSyncService
                                      browserList:browserList];
   self.mediator.webStateList = self.browser->GetWebStateList();
-  self.mediator.browserState = browserState;
+  self.mediator.profile = profile;
   self.mediator.browser = self.browser;
   self.mediator.tabStripHandler = HandlerForProtocol(
       self.browser->GetCommandDispatcher(), TabStripCommands);
@@ -109,7 +108,7 @@
   self.contextMenuHelper = [[TabStripContextMenuHelper alloc]
       initWithBrowserList:browserList
              webStateList:self.browser->GetWebStateList()];
-  self.contextMenuHelper.incognito = browserState->IsOffTheRecord();
+  self.contextMenuHelper.incognito = profile->IsOffTheRecord();
   self.contextMenuHelper.mutator = self.mediator;
   self.contextMenuHelper.handler = HandlerForProtocol(
       self.browser->GetCommandDispatcher(), TabStripCommands);
@@ -188,13 +187,13 @@
 
 - (void)showAlertForLastTabDragged:
     (TabStripLastTabDraggedAlertCommand*)command {
-  ChromeBrowserState* browserState = self.browser->GetBrowserState();
-  if (browserState->IsOffTheRecord()) {
+  ProfileIOS* profile = self.browser->GetProfile();
+  if (profile->IsOffTheRecord()) {
     return;
   }
 
   AuthenticationService* authenticationService =
-      AuthenticationServiceFactory::GetForBrowserState(browserState);
+      AuthenticationServiceFactory::GetForProfile(profile);
   id<SystemIdentity> identity =
       authenticationService->GetPrimaryIdentity(signin::ConsentLevel::kSignin);
 
@@ -274,7 +273,7 @@
 - (void)showTabStripTabGroupSnackbarAfterClosingGroups:
     (int)numberOfClosedGroups {
   if (!IsTabGroupSyncEnabled() ||
-      self.browser->GetBrowserState()->IsOffTheRecord()) {
+      self.browser->GetProfile()->IsOffTheRecord()) {
     return;
   }
 
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator.h b/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator.h
index b34265e..9873846 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator.h
@@ -37,8 +37,8 @@
 // number of Webstates.
 @property(nonatomic, assign) WebStateList* webStateList;
 
-// The ChromeBrowserState model for the corresponding browser.
-@property(nonatomic, assign) ChromeBrowserState* browserState;
+// The ProfileIOS model for the corresponding browser.
+@property(nonatomic, assign) ProfileIOS* profile;
 
 // The associated browser needed to move tabs across browsers.
 @property(nonatomic, assign) Browser* browser;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator.mm
index 15ceb3b..088ba187 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator.mm
@@ -647,7 +647,7 @@
 #pragma mark - TabStripMutator
 
 - (void)addNewItem {
-  if (!self.webStateList || !self.browserState) {
+  if (!self.webStateList || !self.profile) {
     return;
   }
   const auto insertionParams = WebStateList::InsertionParams::Automatic();
@@ -763,12 +763,12 @@
 
 - (void)addItem:(TabSwitcherItem*)item
         toGroup:(const TabGroup*)destinationGroup {
-  if (!self.webStateList || !self.browserState) {
+  if (!self.webStateList || !self.profile) {
     return;
   }
   base::RecordAction(base::UserMetricsAction("MobileTabStripAddItemToGroup"));
 
-  const bool incognito = self.browserState->IsOffTheRecord();
+  const bool incognito = self.profile->IsOffTheRecord();
   Browser* browserOfGroup =
       GetBrowserForGroup(_browserList, destinationGroup, incognito);
 
@@ -795,7 +795,7 @@
 }
 
 - (void)addNewTabInGroup:(TabGroupItem*)tabGroupItem {
-  if (!self.webStateList || !self.browserState) {
+  if (!self.webStateList || !self.profile) {
     return;
   }
   base::RecordAction(base::UserMetricsAction("MobileTabStripNewTabInGroup"));
@@ -883,7 +883,7 @@
 }
 
 - (UIDragItem*)dragItemForTabGroupItem:(TabGroupItem*)tabGroupItem {
-  return CreateTabGroupDragItem(tabGroupItem.tabGroup, self.browserState);
+  return CreateTabGroupDragItem(tabGroupItem.tabGroup, self.profile);
 }
 
 - (void)dragWillBeginForTabSwitcherItem:(TabSwitcherItem*)item {
@@ -921,12 +921,12 @@
   // asynchronous drops.
   if ([dragItem.localObject isKindOfClass:[TabInfo class]]) {
     TabInfo* tabInfo = static_cast<TabInfo*>(dragItem.localObject);
-    if (tabInfo.profile != self.browserState) {
+    if (tabInfo.profile != self.profile) {
       // Tabs from different profiles cannot be dropped.
       return UIDropOperationForbidden;
     }
 
-    if (_browserState->IsOffTheRecord() == tabInfo.incognito) {
+    if (_profile->IsOffTheRecord() == tabInfo.incognito) {
       return UIDropOperationMove;
     }
 
@@ -940,7 +940,7 @@
   if ([dragItem.localObject isKindOfClass:[TabGroupInfo class]]) {
     TabGroupInfo* tabGroupInfo =
         base::apple::ObjCCast<TabGroupInfo>(dragItem.localObject);
-    if (tabGroupInfo.profile != self.browserState) {
+    if (tabGroupInfo.profile != self.profile) {
       // Tabs from different profiles cannot be dropped.
       return UIDropOperationForbidden;
     }
@@ -961,7 +961,7 @@
       }
     }
 
-    if (self.browserState->IsOffTheRecord() == tabGroupInfo.incognito) {
+    if (self.profile->IsOffTheRecord() == tabGroupInfo.incognito) {
       return UIDropOperationMove;
     }
     // Tabs of different profiles (regular/incognito) cannot be dropped.
@@ -1186,9 +1186,9 @@
     DCHECK(false) << "Reentrant web state insertion!";
     return;
   }
-  DCHECK(_browserState);
+  DCHECK(_profile);
 
-  web::WebState::CreateParams params(_browserState);
+  web::WebState::CreateParams params(_profile);
   std::unique_ptr<web::WebState> webState = web::WebState::Create(params);
 
   web::NavigationManager::WebLoadParams loadParams(newTabURL);
@@ -1405,15 +1405,15 @@
 // `insertionParams`.
 - (void)insertAndActivateNewWebStateWithInsertionParams:
     (WebStateList::InsertionParams)insertionParams {
-  CHECK(self.browserState);
+  CHECK(self.profile);
   CHECK(self.webStateList);
 
-  if (!IsAddNewTabAllowedByPolicy(self.browserState->GetPrefs(),
-                                  self.browserState->IsOffTheRecord())) {
+  if (!IsAddNewTabAllowedByPolicy(self.profile->GetPrefs(),
+                                  self.profile->IsOffTheRecord())) {
     return;
   }
 
-  web::WebState::CreateParams params(self.browserState);
+  web::WebState::CreateParams params(self.profile);
   std::unique_ptr<web::WebState> webState = web::WebState::Create(params);
 
   GURL url(kChromeUINewTabURL);
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator_unittest.mm
index bd62413c..21cc605 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator_unittest.mm
@@ -96,24 +96,22 @@
   TabStripMediatorTest() {
     feature_list_.InitWithFeatures(
         {kTabGroupsIPad, kModernTabStrip, kTabGroupSync}, {});
-    TestChromeBrowserState::Builder browser_state_builder;
-    browser_state_builder.AddTestingFactory(
+    TestProfileIOS::Builder profile_builder;
+    profile_builder.AddTestingFactory(
         ios::FaviconServiceFactory::GetInstance(),
         ios::FaviconServiceFactory::GetDefaultFactory());
-    browser_state_builder.AddTestingFactory(
+    profile_builder.AddTestingFactory(
         ios::HistoryServiceFactory::GetInstance(),
         ios::HistoryServiceFactory::GetDefaultFactory());
 
     tab_group_sync_service_ = std::make_unique<
         ::testing::NiceMock<tab_groups::MockTabGroupSyncService>>();
 
-    browser_state_ = std::move(browser_state_builder).Build();
+    profile_ = std::move(profile_builder).Build();
     browser_ = std::make_unique<TestBrowser>(
-        browser_state_.get(),
-        std::make_unique<TabStripFakeWebStateListDelegate>());
+        profile_.get(), std::make_unique<TabStripFakeWebStateListDelegate>());
     other_browser_ = std::make_unique<TestBrowser>(
-        browser_state_.get(),
-        std::make_unique<TabStripFakeWebStateListDelegate>());
+        profile_.get(), std::make_unique<TabStripFakeWebStateListDelegate>());
     web_state_list_ = browser_->GetWebStateList();
 
     SnapshotBrowserAgent::CreateForBrowser(other_browser_.get());
@@ -128,7 +126,7 @@
 
   void InitializeMediator() {
     BrowserList* browser_list =
-        BrowserListFactory::GetForBrowserState(browser_state_.get());
+        BrowserListFactory::GetForProfile(profile_.get());
     browser_list->AddBrowser(browser_.get());
     browser_list->AddBrowser(other_browser_.get());
 
@@ -136,7 +134,7 @@
         [[TabStripMediator alloc] initWithConsumer:consumer_
                                tabGroupSyncService:tab_group_sync_service_.get()
                                        browserList:browser_list];
-    mediator_.browserState = browser_state_.get();
+    mediator_.profile = profile_.get();
     mediator_.webStateList = web_state_list_;
     mediator_.browser = browser_.get();
     mediator_.tabStripHandler = tab_strip_handler_;
@@ -144,11 +142,11 @@
 
   void AddWebState(bool pinned = false) {
     auto web_state = std::make_unique<web::FakeWebState>();
-    web_state->SetBrowserState(browser_state_.get());
+    web_state->SetBrowserState(profile_.get());
     favicon::WebFaviconDriver::CreateForWebState(
         web_state.get(),
-        ios::FaviconServiceFactory::GetForBrowserState(
-            browser_state_.get(), ServiceAccessType::IMPLICIT_ACCESS));
+        ios::FaviconServiceFactory::GetForProfile(
+            profile_.get(), ServiceAccessType::IMPLICIT_ACCESS));
 
     web_state_list_->InsertWebState(
         std::move(web_state),
@@ -172,7 +170,7 @@
   web::WebTaskEnvironment task_environment_;
   FakeTabStripHandler* tab_strip_handler_;
   base::test::ScopedFeatureList feature_list_;
-  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
   std::unique_ptr<TestBrowser> browser_;
   std::unique_ptr<TestBrowser> other_browser_;
   raw_ptr<WebStateList> web_state_list_;
@@ -263,11 +261,10 @@
   for (int i = 0; i < web_state_list_->count(); ++i) {
     web::FakeWebState* web_state =
         static_cast<web::FakeWebState*>(web_state_list_->GetWebStateAt(i));
-    web_state->SetBrowserState(browser_state_.get());
+    web_state->SetBrowserState(profile_.get());
     favicon::WebFaviconDriver::CreateForWebState(
-        web_state,
-        ios::FaviconServiceFactory::GetForBrowserState(
-            browser_state_.get(), ServiceAccessType::IMPLICIT_ACCESS));
+        web_state, ios::FaviconServiceFactory::GetForProfile(
+                       profile_.get(), ServiceAccessType::IMPLICIT_ACCESS));
   }
 
   InitializeMediator();
@@ -445,11 +442,10 @@
   for (int i = 0; i < web_state_list_->count(); ++i) {
     web::FakeWebState* web_state =
         static_cast<web::FakeWebState*>(web_state_list_->GetWebStateAt(i));
-    web_state->SetBrowserState(browser_state_.get());
+    web_state->SetBrowserState(profile_.get());
     favicon::WebFaviconDriver::CreateForWebState(
-        web_state,
-        ios::FaviconServiceFactory::GetForBrowserState(
-            browser_state_.get(), ServiceAccessType::IMPLICIT_ACCESS));
+        web_state, ios::FaviconServiceFactory::GetForProfile(
+                       profile_.get(), ServiceAccessType::IMPLICIT_ACCESS));
   }
 
   InitializeMediator();
@@ -649,11 +645,10 @@
             consumer_.selectedItem.identifier);
 
   auto web_state = std::make_unique<web::FakeWebState>();
-  web_state->SetBrowserState(browser_state_.get());
+  web_state->SetBrowserState(profile_.get());
   favicon::WebFaviconDriver::CreateForWebState(
-      web_state.get(),
-      ios::FaviconServiceFactory::GetForBrowserState(
-          browser_state_.get(), ServiceAccessType::IMPLICIT_ACCESS));
+      web_state.get(), ios::FaviconServiceFactory::GetForProfile(
+                           profile_.get(), ServiceAccessType::IMPLICIT_ACCESS));
 
   web_state_list_->InsertWebState(std::move(web_state),
                                   WebStateList::InsertionParams::AtIndex(1));
@@ -733,7 +728,7 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   WebStateListBuilderFromDescription builder(web_state_list);
   ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "a b | c d e f* [ 1 g h ]", browser_->GetBrowserState()));
+      "a b | c d e f* [ 1 g h ]", browser_->GetProfile()));
   web::WebState* web_state_to_keep = builder.GetWebStateForIdentifier('b');
 
   InitializeMediator();
@@ -758,7 +753,7 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   WebStateListBuilderFromDescription builder(web_state_list);
   ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "a b | c d e f* [ 1 g h ]", browser_->GetBrowserState()));
+      "a b | c d e f* [ 1 g h ]", browser_->GetProfile()));
   web::WebState* web_state_to_keep = builder.GetWebStateForIdentifier('d');
 
   InitializeMediator();
@@ -783,7 +778,7 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   WebStateListBuilderFromDescription builder(web_state_list);
   ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "a b | c d e f* [ 1 g h ]", browser_->GetBrowserState()));
+      "a b | c d e f* [ 1 g h ]", browser_->GetProfile()));
   web::WebState* web_state_to_keep = builder.GetWebStateForIdentifier('f');
 
   InitializeMediator();
@@ -808,7 +803,7 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   WebStateListBuilderFromDescription builder(web_state_list);
   ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "a b | c d e f* [ 1 g h ]", browser_->GetBrowserState()));
+      "a b | c d e f* [ 1 g h ]", browser_->GetProfile()));
   web::WebState* web_state_to_keep = builder.GetWebStateForIdentifier('g');
 
   InitializeMediator();
@@ -1093,8 +1088,8 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b c ", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b c ",
+                                                       browser_->GetProfile()));
 
   InitializeMediator();
 
@@ -1121,8 +1116,8 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b c ", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b c ",
+                                                       browser_->GetProfile()));
 
   InitializeMediator();
 
@@ -1151,8 +1146,8 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b c ", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b c ",
+                                                       browser_->GetProfile()));
 
   InitializeMediator();
 
@@ -1178,8 +1173,8 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b [ 0 c ]", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b [ 0 c ]",
+                                                       browser_->GetProfile()));
 
   InitializeMediator();
 
@@ -1225,13 +1220,13 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b",
+                                                       browser_->GetProfile()));
 
   WebStateList* other_web_state_list = other_browser_->GetWebStateList();
   WebStateListBuilderFromDescription other_builder(other_web_state_list);
   ASSERT_TRUE(other_builder.BuildWebStateListFromDescription(
-      "| d* [ 0 e ] f", other_browser_->GetBrowserState()));
+      "| d* [ 0 e ] f", other_browser_->GetProfile()));
 
   InitializeMediator();
 
@@ -1279,8 +1274,8 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* [ 0 b c ]", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* [ 0 b c ]",
+                                                       browser_->GetProfile()));
 
   InitializeMediator();
 
@@ -1326,8 +1321,8 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b c ", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b c ",
+                                                       browser_->GetProfile()));
 
   const GURL new_url = GURL("https://cancelled_url.com");
   const std::u16string new_title = u"cancelled title";
@@ -1384,8 +1379,8 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b c ", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b c ",
+                                                       browser_->GetProfile()));
 
   web::WebStateID web_state_id =
       web_state_list->GetWebStateAt(1)->GetUniqueIdentifier();
@@ -1431,8 +1426,8 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b c ", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b c ",
+                                                       browser_->GetProfile()));
 
   const GURL new_url = GURL("https://cancelled_url.com");
   const std::u16string new_title = u"cancelled title";
@@ -1489,13 +1484,13 @@
   WebStateList* web_state_list = browser_->GetWebStateList();
   CloseAllWebStates(*web_state_list, WebStateList::CLOSE_NO_FLAGS);
   WebStateListBuilderFromDescription builder(web_state_list);
-  ASSERT_TRUE(builder.BuildWebStateListFromDescription(
-      "| a* b c ", browser_->GetBrowserState()));
+  ASSERT_TRUE(builder.BuildWebStateListFromDescription("| a* b c ",
+                                                       browser_->GetProfile()));
 
   WebStateList* other_web_state_list = other_browser_->GetWebStateList();
   WebStateListBuilderFromDescription other_builder(other_web_state_list);
   ASSERT_TRUE(other_builder.BuildWebStateListFromDescription(
-      "| [ 0 a* b ] c d e", other_browser_->GetBrowserState()));
+      "| [ 0 a* b ] c d e", other_browser_->GetProfile()));
 
   const GURL new_url = GURL("https://cancelled_url.com");
   const std::u16string new_title = u"cancelled title";
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator_utils_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator_utils_unittest.mm
index 2582f41..3155349 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator_utils_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator_utils_unittest.mm
@@ -49,22 +49,21 @@
   TabStripMediatorUtilsTest() {
     feature_list_.InitWithFeatures(
         {kTabGroupsIPad, kModernTabStrip, kTabGroupSync}, {});
-    TestChromeBrowserState::Builder browser_state_builder;
-    browser_state_builder.AddTestingFactory(
+    TestProfileIOS::Builder profile_builder;
+    profile_builder.AddTestingFactory(
         tab_groups::TabGroupSyncServiceFactory::GetInstance(),
         base::BindRepeating(&CreateMockSyncService));
-    browser_state_ = std::move(browser_state_builder).Build();
+    profile_ = std::move(profile_builder).Build();
     mock_service_ = static_cast<tab_groups::MockTabGroupSyncService*>(
-        tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
-            browser_state_.get()));
+        tab_groups::TabGroupSyncServiceFactory::GetForProfile(profile_.get()));
     browser_ = std::make_unique<TestBrowser>(
-        browser_state_.get(), std::make_unique<FakeWebStateListDelegate>());
+        profile_.get(), std::make_unique<FakeWebStateListDelegate>());
     web_state_list_ = browser_->GetWebStateList();
     other_browser_ = std::make_unique<TestBrowser>(
-        browser_state_.get(), std::make_unique<FakeWebStateListDelegate>());
+        profile_.get(), std::make_unique<FakeWebStateListDelegate>());
     other_web_state_list_ = other_browser_->GetWebStateList();
     BrowserList* browser_list =
-        BrowserListFactory::GetForBrowserState(browser_state_.get());
+        BrowserListFactory::GetForProfile(profile_.get());
     local_observer_ = std::make_unique<tab_groups::TabGroupLocalUpdateObserver>(
         browser_list, mock_service_);
     browser_list->AddBrowser(browser_.get());
@@ -76,7 +75,7 @@
  protected:
   web::WebTaskEnvironment task_environment_;
   base::test::ScopedFeatureList feature_list_;
-  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
   std::unique_ptr<TestBrowser> browser_;
   raw_ptr<WebStateList> web_state_list_;
   std::unique_ptr<TestBrowser> other_browser_;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_utils_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_utils_unittest.mm
index 3f93352..3288849 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_utils_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_utils_unittest.mm
@@ -15,17 +15,16 @@
 class TabSwitcherUtilsTest : public PlatformTest {
  public:
   TabSwitcherUtilsTest() {
-    browser_state_ = TestChromeBrowserState::Builder().Build();
+    profile_ = TestProfileIOS::Builder().Build();
 
     // Creates all kind of browsers.
-    browser_regular_ = std::make_unique<TestBrowser>(browser_state_.get());
-    browser_inactive_ = std::make_unique<TestBrowser>(browser_state_.get());
-    browser_incognito_ = std::make_unique<TestBrowser>(
-        browser_state_->GetOffTheRecordChromeBrowserState());
+    browser_regular_ = std::make_unique<TestBrowser>(profile_.get());
+    browser_inactive_ = std::make_unique<TestBrowser>(profile_.get());
+    browser_incognito_ =
+        std::make_unique<TestBrowser>(profile_->GetOffTheRecordProfile());
 
     // Add them to the apropriate lists.
-    browser_list_ =
-        BrowserListFactory::GetForBrowserState(browser_state_.get());
+    browser_list_ = BrowserListFactory::GetForProfile(profile_.get());
     browser_list_->AddBrowser(browser_regular_.get());
     browser_list_->AddBrowser(browser_inactive_.get());
     browser_list_->AddBrowser(browser_incognito_.get());
@@ -48,7 +47,7 @@
   }
 
   web::WebTaskEnvironment task_environment_;
-  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestProfileIOS> profile_;
   std::unique_ptr<TestBrowser> browser_regular_;
   std::unique_ptr<TestBrowser> browser_inactive_;
   std::unique_ptr<TestBrowser> browser_incognito_;
@@ -58,8 +57,8 @@
 
 TEST_F(TabSwitcherUtilsTest, GetTheCorrectBrowser) {
   for (Browser* browser : browsers_) {
-    ChromeBrowserState* browserState = browser->GetBrowserState();
-    BOOL incognito = browserState->IsOffTheRecord();
+    ProfileIOS* profile = browser->GetProfile();
+    BOOL incognito = profile->IsOffTheRecord();
     web::WebState* inserted_web_state = AddTabToBrowser(browser);
     ASSERT_EQ(browser,
               GetBrowserForTabWithId(browser_list_.get(),
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 8f00c16..e0477d8 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 @@
-ed124858f61bcb9a8f92c20ffff0995572dafd94
\ No newline at end of file
+6b433a1c15011868a191e3fd86851d28d5f92b46
\ 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 bb5d98d..58eef91 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 @@
-53f910765d191a5407f4c56924d1a155c4ac05c6
\ No newline at end of file
+af43cbe2e1ea93857668daf685182ac0badf1958
\ 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 a13223a5..fe150d8 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 @@
-a0b0ac35ce5296c20c63af459745b6aa70678988
\ No newline at end of file
+85e5fe8e5cdbd1ef280d606156353f91ca6c0d54
\ 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 49e6d27..e7eb45da 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 @@
-44a7bd758f49fa01338d58d0edeffa5f38b768ae
\ No newline at end of file
+d1cd110f9165241f0e52cbe99b7311fe883d12a7
\ 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 cbf9debd..73fc689 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 @@
-4c76bb23298a4089acbaddc4d934e97eaf99e329
\ No newline at end of file
+bcdf1c836b0cf31310632eb85e2c89e6e77135ee
\ 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 cc28df0..b2357534 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 @@
-c32f2ae2155e180c5739f4385badd4be4cf71612
\ No newline at end of file
+940c0c45a8bc570ec0ed116ea959a375a069f70b
\ 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 d706094..d96b568 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 @@
-d77ce7c2f8c00944876c3fdbd836506fc6b82a39
\ No newline at end of file
+f73fb0564eb8f84837ce8a3c68952d953e84ff25
\ 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 7a7815a..0bf3913 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 @@
-e84e7f3fc6eca24f22ea7c679aef7d9e499e9a49
\ No newline at end of file
+48a9c3af0386c8e5273b7c90546b8a27bab8b1c8
\ 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 bee438f..8ebfb2f9 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 @@
-1e79574c11376dbe884c0a06a49e1a9f37c932db
\ No newline at end of file
+b0ae2401786683a259abb42714ecd35187929a86
\ 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 cab6f2b..1723723 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 @@
-f978dd90b7ff88fe68fb82a696e06663e0026899
\ No newline at end of file
+aec3024b89a3792c7b445f96b63cdbb587eca3dc
\ 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 bf8561ee..e8355d8 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 @@
-5dbee3e955966f4353d3cbeede29328b384e1a3b
\ No newline at end of file
+54e9bb59aaab17fb3c31505bc7f360de0ee2fe0e
\ 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 77332ac..6cad73bf 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 @@
-51a1cc4774d73436bd8d318ddc759bc8ecb9ec16
\ No newline at end of file
+1736d7e26e51d243473efca822fe6c16993fb815
\ 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 5837981..22b7c47 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 @@
-968a9f8cdbcb4f701904e8d166b02a63415b2112
\ No newline at end of file
+ad74c688700a758873a92bc8da28dfdd73c43f9d
\ 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 a328b98..5366b61e 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 @@
-3a15c0b097e171fb707aa91d082c682e7bb5ce86
\ No newline at end of file
+1cf64a183d50983bb668e97521c7c899156e7721
\ 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 18a370f8..6d80e1f 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 @@
-f48da9c84b5ad3fddafcdccdaefa76f74eb12ba0
\ No newline at end of file
+ecfc621103387ca0a42fbab27e16e6880535dc5a
\ No newline at end of file
diff --git a/ios_internal b/ios_internal
index c7ca556..028fcf8 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit c7ca556bc732c861810971db63ceffa352c2442e
+Subproject commit 028fcf85bcfd643709d3174307c2e4303e76fcd7
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc
index 7613c9c..d0684407 100644
--- a/media/base/video_frame.cc
+++ b/media/base/video_frame.cc
@@ -468,12 +468,7 @@
     return nullptr;
   }
 
-  // `mailbox` is not backed by a GPU texture, so using a texture target of 0
-  // is fine.
-  constexpr uint32_t kTextureTarget = 0;
-
-  frame->mailbox_holder_ =
-      gpu::MailboxHolder(mailbox, gpu::SyncToken(), kTextureTarget);
+  frame->mailbox_ = mailbox;
   frame->mailbox_holder_and_gmb_release_cb_ =
       WrapReleaseMailboxCB(std::move(mailbox_holder_release_cb));
 
@@ -501,8 +496,9 @@
   }
 
   if (shared_image) {
-    frame->mailbox_holder_ = gpu::MailboxHolder(
-        shared_image->mailbox(), sync_token, shared_image->GetTextureTarget());
+    frame->mailbox_ = shared_image->mailbox();
+    frame->texture_sync_token_ = sync_token;
+    frame->texture_target_ = shared_image->GetTextureTarget();
     frame->shared_image_ = shared_image->MakeUnowned();
   }
   frame->mailbox_holder_and_gmb_release_cb_ =
@@ -530,8 +526,9 @@
   if (!frame) {
     return nullptr;
   }
-  frame->mailbox_holder_ = gpu::MailboxHolder(
-      shared_image->mailbox(), sync_token, shared_image->GetTextureTarget());
+  frame->mailbox_ = shared_image->mailbox();
+  frame->texture_sync_token_ = sync_token;
+  frame->texture_target_ = shared_image->GetTextureTarget();
 
   // Note that we can not use |shared_image|->MakeUnOwned() here since that
   // will not work for MappableSI due to it owning a GMB internally and we can
@@ -770,8 +767,9 @@
   }
 
   if (shared_image) {
-    frame->mailbox_holder_ = gpu::MailboxHolder(
-        shared_image->mailbox(), sync_token, shared_image->GetTextureTarget());
+    frame->mailbox_ = shared_image->mailbox();
+    frame->texture_sync_token_ = sync_token;
+    frame->texture_target_ = shared_image->GetTextureTarget();
     frame->shared_image_ = shared_image->MakeUnowned();
   }
   return frame;
@@ -807,7 +805,7 @@
     DLOG(ERROR) << __func__ << " Couldn't create VideoFrame instance.";
     return nullptr;
   }
-  frame->mailbox_holder_ = gpu::MailboxHolder();
+
   frame->mailbox_holder_and_gmb_release_cb_ =
       ReleaseMailboxAndGpuMemoryBufferCB();
   frame->dmabuf_fds_ = std::move(dmabuf_fds);
@@ -1270,8 +1268,7 @@
 }
 
 bool VideoFrame::HasTextures() const {
-  return wrapped_frame_ ? wrapped_frame_->HasTextures()
-                        : !mailbox_holder_.mailbox.IsZero();
+  return wrapped_frame_ ? wrapped_frame_->HasTextures() : !mailbox_.IsZero();
 }
 
 bool VideoFrame::HasSharedImage() const {
@@ -1490,11 +1487,17 @@
 }
 
 // TODO(crbug.com/332564976): Update method to not take in param.
-const gpu::MailboxHolder& VideoFrame::mailbox_holder(
+const gpu::MailboxHolder VideoFrame::mailbox_holder(
     size_t texture_index) const {
   DCHECK(HasTextures());
-  return wrapped_frame_ ? wrapped_frame_->mailbox_holder(texture_index)
-                        : mailbox_holder_;
+  if (wrapped_frame_) {
+    return wrapped_frame_->mailbox_holder(texture_index);
+  }
+  if (shared_image_) {
+    return gpu::MailboxHolder(shared_image_->mailbox(), texture_sync_token_,
+                              shared_image_->GetTextureTarget());
+  }
+  return gpu::MailboxHolder(mailbox_, texture_sync_token_, texture_target_);
 }
 
 scoped_refptr<gpu::ClientSharedImage> VideoFrame::shared_image() const {
@@ -1584,7 +1587,7 @@
   DCHECK(!wrapped_frame_);
 
   // No lock is required due to the HasOneRef() check.
-  auto& token = mailbox_holder_.sync_token;
+  auto& token = texture_sync_token_;
   if (token.HasData())
     client->WaitSyncToken(token);
   client->GenerateSyncToken(&token);
@@ -1625,7 +1628,6 @@
   DCHECK(visible_rect_ == visible_rect)
       << "visible_rect " << visible_rect.ToString() << " exceeds coded_size "
       << coded_size().ToString();
-  memset(&mailbox_holder_, 0, sizeof(mailbox_holder_));
   memset(&data_, 0, sizeof(data_));
 }
 
diff --git a/media/base/video_frame.h b/media/base/video_frame.h
index 79a84ff..3dd21ada 100644
--- a/media/base/video_frame.h
+++ b/media/base/video_frame.h
@@ -714,7 +714,7 @@
   // Returns a mailbox holder for a given texture.
   // Only valid to call if this is a NATIVE_TEXTURE frame. Before using the
   // mailbox, the caller must wait for the included sync point.
-  const gpu::MailboxHolder& mailbox_holder(size_t texture_index) const;
+  const gpu::MailboxHolder mailbox_holder(size_t texture_index) const;
 
   // Returns the ClientSharedImage.
   // Only valid to call if this is a NATIVE_TEXTURE frame and contains valid
@@ -963,8 +963,10 @@
   // VideoFrame.
   const uint8_t* data_[kMaxPlanes];
 
-  // Native texture mailbox, if this is a IsTexture() frame.
-  gpu::MailboxHolder mailbox_holder_;
+  // Native texture mailbox, if this frame HasTextures().
+  gpu::Mailbox mailbox_;
+  gpu::SyncToken texture_sync_token_;
+  uint32_t texture_target_ = 0;
   ReleaseMailboxAndGpuMemoryBufferCB mailbox_holder_and_gmb_release_cb_;
 
   // Native texture shared image that is only set when the VideoFrame is
diff --git a/media/base/video_util.cc b/media/base/video_util.cc
index 24d4696..3356856 100644
--- a/media/base/video_util.cc
+++ b/media/base/video_util.cc
@@ -121,7 +121,7 @@
 
   // With multiplanar shared images, there's one shared image mailbox so perform
   // readback passing the appropriate `src_plane` for the single mailbox.
-  const gpu::MailboxHolder& holder = src_frame.mailbox_holder(0);
+  const gpu::MailboxHolder holder = src_frame.mailbox_holder(0);
   DCHECK(!holder.mailbox.IsZero());
   ri->WaitSyncTokenCHROMIUM(holder.sync_token.GetConstData());
   bool result =
diff --git a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java
index 5e904bbb..8b7f130 100644
--- a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java
+++ b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java
@@ -1710,7 +1710,11 @@
     }
 
     @Override
+    @SuppressWarnings("Finalize")
     public void finalize() {
+        // TODO(crbug.com/40286193): Use an explicit close (or timer-based timeout?) rather than
+        // finalize, which
+        // discouraged and difficult to ensure actually runs.
         mCameraThreadHandler.getLooper().quit();
     }
 
diff --git a/media/midi/java/src/org/chromium/midi/MidiDeviceAndroid.java b/media/midi/java/src/org/chromium/midi/MidiDeviceAndroid.java
index bc8e26bf..d2796f18 100644
--- a/media/midi/java/src/org/chromium/midi/MidiDeviceAndroid.java
+++ b/media/midi/java/src/org/chromium/midi/MidiDeviceAndroid.java
@@ -10,8 +10,8 @@
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JNINamespace;
 
-@JNINamespace("midi")
 /** A class implementing midi::MidiDeviceAndroid functionality. */
+@JNINamespace("midi")
 class MidiDeviceAndroid {
     /** The underlying device. */
     private final MidiDevice mDevice;
diff --git a/media/renderers/paint_canvas_video_renderer.cc b/media/renderers/paint_canvas_video_renderer.cc
index db72350d..7acb94b 100644
--- a/media/renderers/paint_canvas_video_renderer.cc
+++ b/media/renderers/paint_canvas_video_renderer.cc
@@ -133,7 +133,7 @@
   GLuint texture;
 };
 
-const gpu::MailboxHolder& GetVideoFrameMailboxHolder(VideoFrame* video_frame) {
+const gpu::MailboxHolder GetVideoFrameMailboxHolder(VideoFrame* video_frame) {
   DCHECK(video_frame->HasTextures());
 
   DCHECK(PIXEL_FORMAT_ARGB == video_frame->format() ||
@@ -156,7 +156,7 @@
          PIXEL_FORMAT_BGRA == video_frame->format())
       << "Format: " << VideoPixelFormatToString(video_frame->format());
 
-  const gpu::MailboxHolder& mailbox_holder = video_frame->mailbox_holder(0);
+  const gpu::MailboxHolder mailbox_holder = video_frame->mailbox_holder(0);
   return mailbox_holder;
 }
 
@@ -1506,7 +1506,7 @@
 
     DCHECK_EQ(video_frame->shared_image_format_type(),
               SharedImageFormatType::kSharedImageFormatExternalSampler);
-    const gpu::MailboxHolder& mailbox_holder =
+    const gpu::MailboxHolder mailbox_holder =
         GetVideoFrameMailboxHolder(video_frame.get());
     DCHECK(mailbox_holder.texture_target == GL_TEXTURE_2D ||
            mailbox_holder.texture_target == GL_TEXTURE_RECTANGLE_ARB ||
@@ -1846,7 +1846,7 @@
 
     if (allow_wrap_texture && can_wrap_texture) {
       cache_.emplace(video_frame->unique_id());
-      const gpu::MailboxHolder& holder =
+      const gpu::MailboxHolder holder =
           GetVideoFrameMailboxHolder(video_frame.get());
       mailbox = holder.mailbox;
       ri->WaitSyncTokenCHROMIUM(holder.sync_token.GetConstData());
@@ -1897,7 +1897,7 @@
 
       // Copy into the texture backing of the cached copy. This supports
       // multiplanar shared images.
-      const gpu::MailboxHolder& frame_mailbox_holder =
+      const gpu::MailboxHolder frame_mailbox_holder =
           GetVideoFrameMailboxHolder(video_frame.get());
       ri->WaitSyncTokenCHROMIUM(frame_mailbox_holder.sync_token.GetConstData());
       ri->CopySharedImage(
@@ -1991,7 +1991,7 @@
 
   // If we have single source shared image, just use CopySharedImage().
   if (video_frame->HasTextures()) {
-    const auto& source = video_frame->mailbox_holder(0);
+    const auto source = video_frame->mailbox_holder(0);
     auto source_rect = use_visible_rect ? video_frame->visible_rect()
                                         : gfx::Rect(video_frame->coded_size());
     ri->WaitSyncTokenCHROMIUM(source.sync_token.GetConstData());
diff --git a/media/renderers/video_frame_rgba_to_yuva_converter.cc b/media/renderers/video_frame_rgba_to_yuva_converter.cc
index 8acfae7f..c708fd8 100644
--- a/media/renderers/video_frame_rgba_to_yuva_converter.cc
+++ b/media/renderers/video_frame_rgba_to_yuva_converter.cc
@@ -55,7 +55,7 @@
 
   ri->WaitSyncTokenCHROMIUM(src_mailbox_holder.sync_token.GetConstData());
 
-  const auto& dst_mailbox_holder =
+  const auto dst_mailbox_holder =
       dst_video_frame->mailbox_holder(/*texture_index=*/0);
   ri->WaitSyncTokenCHROMIUM(dst_mailbox_holder.sync_token.GetConstData());
 
diff --git a/media/renderers/video_resource_updater.cc b/media/renderers/video_resource_updater.cc
index 830372f..afbda1b 100644
--- a/media/renderers/video_resource_updater.cc
+++ b/media/renderers/video_resource_updater.cc
@@ -978,9 +978,9 @@
 
 void VideoResourceUpdater::CopyHardwarePlane(
     VideoFrame* video_frame,
-    const gpu::MailboxHolder& mailbox_holder,
     VideoFrameExternalResource* external_resource) {
   const gfx::Size output_plane_resource_size = video_frame->coded_size();
+  auto mailbox_holder = video_frame->mailbox_holder(0);
   // The copy needs to be a direct transfer of pixel data, so we use an RGBA8
   // target to avoid loss of precision or dropping any alpha component.
   constexpr viz::SharedImageFormat copy_si_format =
@@ -1063,13 +1063,13 @@
   CopyingSyncTokenClient client;
   auto original_release_token = video_frame->UpdateReleaseSyncToken(&client);
 
-  const gpu::MailboxHolder& mailbox_holder =
+  const gpu::MailboxHolder mailbox_holder =
       video_frame->mailbox_holder(/*texture_index=*/0);
   if (mailbox_holder.mailbox.IsZero()) {
     return external_resource;
   }
   if (copy_required) {
-    CopyHardwarePlane(video_frame.get(), mailbox_holder, &external_resource);
+    CopyHardwarePlane(video_frame.get(), &external_resource);
     return external_resource;
   }
 
diff --git a/media/renderers/video_resource_updater.h b/media/renderers/video_resource_updater.h
index a7f20251..80eb0d9 100644
--- a/media/renderers/video_resource_updater.h
+++ b/media/renderers/video_resource_updater.h
@@ -155,7 +155,6 @@
   // and the source video frame texture can't be used on the output GL context.
   // https://crbug.com/582170
   void CopyHardwarePlane(VideoFrame* video_frame,
-                         const gpu::MailboxHolder& mailbox_holder,
                          VideoFrameExternalResource* external_resources);
 
   // Get resource ready to be appended into DrawQuad. This is used for GPU
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AutoCloseableRouter.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AutoCloseableRouter.java
index b601b31..9bdc0ec 100644
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AutoCloseableRouter.java
+++ b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AutoCloseableRouter.java
@@ -98,6 +98,7 @@
      * @see Object#finalize()
      */
     @Override
+    @SuppressWarnings("Finalize") // TODO(crbug.com/40286193): Use LifetimeAssert instead.
     protected void finalize() throws Throwable {
         if (!mClosed) {
             mExecutor.execute(
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
index 5e543b4..97c70b0 100644
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
+++ b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
@@ -811,13 +811,13 @@
      * array of booleans.
      */
     private DataHeader readDataHeaderForBooleanArray(
-            long expectedLength, boolean containsHasValueBitfield) {
+            int expectedLength, boolean containsHasValueBitfield) {
         DataHeader dataHeader = readDataHeader();
 
-        long packedBoolSize = (dataHeader.elementsOrVersion + 7) / 8;
-        long expectedSize = DataHeader.HEADER_SIZE + packedBoolSize;
+        int packedBoolSize = (dataHeader.elementsOrVersion + 7) / 8;
+        int expectedSize = DataHeader.HEADER_SIZE + packedBoolSize;
         if (containsHasValueBitfield) {
-            long hasValueBitfieldSize = packedBoolSize;
+            int hasValueBitfieldSize = packedBoolSize;
             expectedSize += hasValueBitfieldSize;
         }
 
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java
index cfaa95c9..8eb7f88d 100644
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java
+++ b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java
@@ -64,6 +64,7 @@
         }
 
         @Override
+        @SuppressWarnings("Finalize") // TODO(crbug.com/40286193): Use LifetimeAssert instead.
         protected void finalize() throws Throwable {
             if (!mAcceptWasInvoked) {
                 // We close the pipe here as a way of signaling to the calling application that an
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/impl/HandleBase.java b/mojo/public/java/system/src/org/chromium/mojo/system/impl/HandleBase.java
index c013113..fcb52cf 100644
--- a/mojo/public/java/system/src/org/chromium/mojo/system/impl/HandleBase.java
+++ b/mojo/public/java/system/src/org/chromium/mojo/system/impl/HandleBase.java
@@ -114,6 +114,7 @@
      * @see java.lang.Object#finalize()
      */
     @Override
+    @SuppressWarnings("Finalize") // TODO(crbug.com/40286193): Use LifetimeAssert instead.
     protected final void finalize() throws Throwable {
         if (isValid()) {
             // This should not happen, as the user of this class should close the handle. Adding a
diff --git a/net/android/junit/src/org/chromium/net/HttpNegotiateAuthenticatorTest.java b/net/android/junit/src/org/chromium/net/HttpNegotiateAuthenticatorTest.java
index 4167423..c752a8f 100644
--- a/net/android/junit/src/org/chromium/net/HttpNegotiateAuthenticatorTest.java
+++ b/net/android/junit/src/org/chromium/net/HttpNegotiateAuthenticatorTest.java
@@ -8,7 +8,6 @@
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.eq;
@@ -441,7 +440,7 @@
             when(accountManagerFuture.getResult()).thenReturn(result);
         } catch (OperationCanceledException | AuthenticatorException | IOException e) {
             // Can never happen - artifact of Mockito.
-            fail();
+            throw new RuntimeException(e);
         }
         return accountManagerFuture;
     }
@@ -459,7 +458,7 @@
             when(accountManagerFuture.getResult()).thenThrow(ex);
         } catch (OperationCanceledException | AuthenticatorException | IOException e) {
             // Can never happen - artifact of Mockito.
-            fail();
+            throw new RuntimeException(e);
         }
         return accountManagerFuture;
     }
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins
index 3dfa2a5..2fafd4c 100644
--- a/net/http/transport_security_state_static.pins
+++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@
 #   hash function for preloaded entries again (we have already done so once).
 #
 
-# Last updated: 2024-09-30 12:55 UTC
+# Last updated: 2024-10-01 12:55 UTC
 PinsListTimestamp
-1727700937
+1727787340
 
 TestSPKI
 sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json
index c46b954..e297714 100644
--- a/net/http/transport_security_state_static_pins.json
+++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@
 // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets'
 // refer to, and the timestamp at which the pins list was last updated.
 //
-// Last updated: 2024-09-30 12:55 UTC
+// Last updated: 2024-10-01 12:55 UTC
 //
 {
   "pinsets": [
diff --git a/pdf/pdf_ink_module.cc b/pdf/pdf_ink_module.cc
index e402d77..5de195b 100644
--- a/pdf/pdf_ink_module.cc
+++ b/pdf/pdf_ink_module.cc
@@ -286,7 +286,7 @@
   }
 
   gfx::PointF position = normalized_event.PositionInWidget();
-  return is_drawing_stroke() ? StartStroke(position)
+  return is_drawing_stroke() ? StartStroke(position, event.TimeStamp())
                              : StartEraseStroke(position);
 }
 
@@ -298,7 +298,7 @@
   }
 
   gfx::PointF position = event.PositionInWidget();
-  return is_drawing_stroke() ? FinishStroke(position)
+  return is_drawing_stroke() ? FinishStroke(position, event.TimeStamp())
                              : FinishEraseStroke(position);
 }
 
@@ -306,11 +306,12 @@
   CHECK(enabled());
 
   gfx::PointF position = event.PositionInWidget();
-  return is_drawing_stroke() ? ContinueStroke(position)
+  return is_drawing_stroke() ? ContinueStroke(position, event.TimeStamp())
                              : ContinueEraseStroke(position);
 }
 
-bool PdfInkModule::StartStroke(const gfx::PointF& position) {
+bool PdfInkModule::StartStroke(const gfx::PointF& position,
+                               base::TimeTicks timestamp) {
   int page_index = client_->VisiblePageIndexFromPoint(position);
   if (page_index < 0) {
     // Do not draw when not on a page.
@@ -324,7 +325,7 @@
       ConvertEventPositionToCanonicalPosition(position, page_index);
 
   CHECK(!state.start_time.has_value());
-  state.start_time = base::Time::Now();
+  state.start_time = timestamp;
   state.page_index = page_index;
 
   // Start of the first segment of a stroke.
@@ -352,7 +353,8 @@
   return true;
 }
 
-bool PdfInkModule::ContinueStroke(const gfx::PointF& position) {
+bool PdfInkModule::ContinueStroke(const gfx::PointF& position,
+                                  base::TimeTicks timestamp) {
   CHECK(is_drawing_stroke());
   DrawingStrokeState& state = drawing_stroke_state();
   if (!state.start_time.has_value()) {
@@ -386,7 +388,7 @@
     if (boundary_position != last_position) {
       // Record the last point before leaving the page, if `last_position` was
       // not already on the page boundary.
-      RecordStrokePosition(boundary_position);
+      RecordStrokePosition(boundary_position, timestamp);
       client_->Invalidate(
           state.brush->GetInvalidateArea(last_position, boundary_position));
     }
@@ -407,12 +409,12 @@
         last_position);
     if (boundary_position != position) {
       // Record the first point after entering the page.
-      RecordStrokePosition(boundary_position);
+      RecordStrokePosition(boundary_position, timestamp);
       invalidation_position = boundary_position;
     }
   }
 
-  RecordStrokePosition(position);
+  RecordStrokePosition(position, timestamp);
 
   // Invalidate area covering a straight line between this position and the
   // previous one.
@@ -425,10 +427,11 @@
   return true;
 }
 
-bool PdfInkModule::FinishStroke(const gfx::PointF& position) {
+bool PdfInkModule::FinishStroke(const gfx::PointF& position,
+                                base::TimeTicks timestamp) {
   // Process `position` as though it was the last point of movement first,
   // before moving on to various bookkeeping tasks.
-  if (!ContinueStroke(position)) {
+  if (!ContinueStroke(position, timestamp)) {
     return false;
   }
 
@@ -679,12 +682,13 @@
                                           client_->GetZoom());
 }
 
-void PdfInkModule::RecordStrokePosition(const gfx::PointF& position) {
+void PdfInkModule::RecordStrokePosition(const gfx::PointF& position,
+                                        base::TimeTicks timestamp) {
   CHECK(is_drawing_stroke());
   DrawingStrokeState& state = drawing_stroke_state();
   gfx::PointF canonical_position =
       ConvertEventPositionToCanonicalPosition(position, state.page_index);
-  base::TimeDelta time_diff = base::Time::Now() - state.start_time.value();
+  base::TimeDelta time_diff = timestamp - state.start_time.value();
   // TODO(crbug.com/353942909): Set the tool type appropriately.
   auto result = state.inputs.back().Append(CreateInkStrokeInput(
       ink::StrokeInput::ToolType::kMouse, canonical_position, time_diff));
diff --git a/pdf/pdf_ink_module.h b/pdf/pdf_ink_module.h
index 18dea04e..111a7ce 100644
--- a/pdf/pdf_ink_module.h
+++ b/pdf/pdf_ink_module.h
@@ -100,7 +100,7 @@
     // The current brush to use for drawing strokes. Never null.
     std::unique_ptr<PdfInkBrush> brush;
 
-    std::optional<base::Time> start_time;
+    std::optional<base::TimeTicks> start_time;
 
     // The 0-based page index which is currently being stroked.
     int page_index = -1;
@@ -180,9 +180,9 @@
   bool OnMouseMove(const blink::WebMouseEvent& event);
 
   // Return values have the same semantics as OnMouse()* above.
-  bool StartStroke(const gfx::PointF& position);
-  bool ContinueStroke(const gfx::PointF& position);
-  bool FinishStroke(const gfx::PointF& position);
+  bool StartStroke(const gfx::PointF& position, base::TimeTicks timestamp);
+  bool ContinueStroke(const gfx::PointF& position, base::TimeTicks timestamp);
+  bool FinishStroke(const gfx::PointF& position, base::TimeTicks timestamp);
 
   // Return values have the same semantics as OnMouse*() above.
   bool StartEraseStroke(const gfx::PointF& position);
@@ -231,8 +231,10 @@
       int page_index);
 
   // Helper to convert `position` to a canonical position and record it into
-  // `current_tool_state_`. Can only be called when drawing.
-  void RecordStrokePosition(const gfx::PointF& position);
+  // `current_tool_state_` for the indicated time. Can only be called when
+  // drawing.
+  void RecordStrokePosition(const gfx::PointF& position,
+                            base::TimeTicks timestamp);
 
   void ApplyUndoRedoCommands(const PdfInkUndoRedoModel::Commands& commands);
   void ApplyUndoRedoCommandsHelper(std::set<size_t> ids, bool should_draw);
diff --git a/remoting/host/cloud_heartbeat_service_client.cc b/remoting/host/cloud_heartbeat_service_client.cc
index a665af6..4f69719 100644
--- a/remoting/host/cloud_heartbeat_service_client.cc
+++ b/remoting/host/cloud_heartbeat_service_client.cc
@@ -29,11 +29,10 @@
 
 CloudHeartbeatServiceClient::CloudHeartbeatServiceClient(
     const std::string& directory_id,
-    const std::string& api_key,
     OAuthTokenGetter* oauth_token_getter,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
     : directory_id_(directory_id),
-      client_(api_key, oauth_token_getter, url_loader_factory) {}
+      client_(/*api_key=*/"", oauth_token_getter, url_loader_factory) {}
 
 CloudHeartbeatServiceClient::~CloudHeartbeatServiceClient() = default;
 
diff --git a/remoting/host/cloud_heartbeat_service_client.h b/remoting/host/cloud_heartbeat_service_client.h
index aa7069af..826bb09c 100644
--- a/remoting/host/cloud_heartbeat_service_client.h
+++ b/remoting/host/cloud_heartbeat_service_client.h
@@ -33,7 +33,6 @@
  public:
   CloudHeartbeatServiceClient(
       const std::string& directory_id,
-      const std::string& api_key,
       OAuthTokenGetter* oauth_token_getter,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
 
diff --git a/remoting/host/host_config.cc b/remoting/host/host_config.cc
index ea297e10..33ca8da 100644
--- a/remoting/host/host_config.cc
+++ b/remoting/host/host_config.cc
@@ -28,7 +28,6 @@
 const char kCorpHostTypeHint[] = "corp";
 const char kCloudHostTypeHint[] = "cloud";
 const char kMe2MeHostTypeHint[] = "me2me";
-const char kCloudApiKeyPath[] = "cloud_api_key";
 
 // Deprecated values.
 const char kDeprecatedHostOwnerEmailConfigPath[] = "host_owner_email";
diff --git a/remoting/host/host_config.h b/remoting/host/host_config.h
index 5cee5cf..63e153b 100644
--- a/remoting/host/host_config.h
+++ b/remoting/host/host_config.h
@@ -56,12 +56,6 @@
 extern const char kCloudHostTypeHint[];
 extern const char kMe2MeHostTypeHint[];
 
-// The API_KEY used for Cloud API service requests. Note that this is only used
-// for billing and quota purposes and is does not provide authn/authz. Using an
-// API_KEY for a different project than where the request originates from will
-// result in the request being rejected.
-extern const char kCloudApiKeyPath[];
-
 // Deprecated keys. These keys were used in pre-M120 host versions and are being
 // kept around for backward compatibility. We should consider rewriting the
 // config file at some point so we no longer need to support them.
diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc
index ecaa51a..09367b1 100644
--- a/remoting/host/remoting_me2me_host.cc
+++ b/remoting/host/remoting_me2me_host.cc
@@ -437,7 +437,6 @@
   scoped_refptr<RsaKeyPair> key_pair_;
   std::string oauth_refresh_token_;
   std::string service_account_email_;
-  std::string cloud_api_key_;
   base::Value::Dict config_;
   std::set<std::string> host_owner_emails_;
 
@@ -1302,15 +1301,6 @@
     return false;
   }
 
-  if (is_cloud_host_) {
-    const std::string* cloud_api_key = config.FindString(kCloudApiKeyPath);
-    if (!cloud_api_key || cloud_api_key->empty()) {
-      LOG(ERROR) << "Host config is missing the cloud_api_key.";
-      return false;
-    }
-    cloud_api_key_ = *cloud_api_key;
-  }
-
   return true;
 }
 
@@ -1717,8 +1707,7 @@
   std::unique_ptr<HeartbeatServiceClient> service_client;
   if (is_cloud_host_) {
     service_client = std::make_unique<CloudHeartbeatServiceClient>(
-        host_id_, cloud_api_key_, oauth_token_getter_.get(),
-        context_->url_loader_factory());
+        host_id_, oauth_token_getter_.get(), context_->url_loader_factory());
     // TODO: joedow - Implement CorpHeartbeatServiceClient.
     // } else if (is_corp_host_) {
     //   service_client = std::make_unique<CorpHeartbeatServiceClient>(
diff --git a/remoting/host/setup/cloud_host_starter.cc b/remoting/host/setup/cloud_host_starter.cc
index 04e7a49..aa9332fe 100644
--- a/remoting/host/setup/cloud_host_starter.cc
+++ b/remoting/host/setup/cloud_host_starter.cc
@@ -168,7 +168,6 @@
   } else {
     config.Set(kHostTypeHintPath, kCloudHostTypeHint);
     config.Set(kRequireSessionAuthorizationPath, true);
-    config.Set(kCloudApiKeyPath, params().api_key);
   }
 }
 
diff --git a/services/accessibility/android/ax_tree_source_android_unittest.cc b/services/accessibility/android/ax_tree_source_android_unittest.cc
index 1029cc5f..a682d0e64 100644
--- a/services/accessibility/android/ax_tree_source_android_unittest.cc
+++ b/services/accessibility/android/ax_tree_source_android_unittest.cc
@@ -77,7 +77,8 @@
   }
 
   void DispatchAccessibilityLocationChange(
-      const ui::AXLocationChanges& details) override {}
+      const ui::AXTreeID& tree_id,
+      const ui::AXLocationChange& details) override {}
 
   void DispatchTreeDestroyedEvent(ui::AXTreeID tree_id) override {}
 
diff --git a/services/device/generic_sensor/android/junit/src/org/chromium/device/sensors/PlatformSensorAndProviderTest.java b/services/device/generic_sensor/android/junit/src/org/chromium/device/sensors/PlatformSensorAndProviderTest.java
index 31b3466..225c714b 100644
--- a/services/device/generic_sensor/android/junit/src/org/chromium/device/sensors/PlatformSensorAndProviderTest.java
+++ b/services/device/generic_sensor/android/junit/src/org/chromium/device/sensors/PlatformSensorAndProviderTest.java
@@ -60,9 +60,8 @@
     private static final long PLATFORM_SENSOR_TIMESTAMP = 314159265358979L;
     private static final double SECONDS_IN_NANOSECOND = 0.000000001d;
 
-    @SuppressWarnings("LockNotBeforeTry")
-
     /** Class that overrides thread management callbacks for testing purposes. */
+    @SuppressWarnings("LockNotBeforeTry")
     private static class TestPlatformSensorProvider extends PlatformSensorProvider {
         public TestPlatformSensorProvider(Context context) {
             super(context);
diff --git a/services/video_effects/BUILD.gn b/services/video_effects/BUILD.gn
index a7f3339..9407ac8 100644
--- a/services/video_effects/BUILD.gn
+++ b/services/video_effects/BUILD.gn
@@ -2,12 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//services/video_effects/args.gni")
 import("//third_party/mediapipe/features.gni")
 
-assert(enable_video_effects,
-       "The Video Effects service requires enable_video_effects to be true.")
-
 source_set("service") {
   public = [
     "video_effects_processor_impl.h",
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json
index 6b10f76..0db9fea 100644
--- a/testing/buildbot/chromium.coverage.json
+++ b/testing/buildbot/chromium.coverage.json
@@ -11907,12 +11907,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "16.4",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -11961,12 +11961,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -12015,12 +12015,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air 11-inch (M2)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -12069,12 +12069,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "16.4",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -12123,12 +12123,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -12177,12 +12177,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -12231,12 +12231,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "16.4",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -12285,12 +12285,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -12339,12 +12339,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -12393,12 +12393,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "16.4",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -12447,12 +12447,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -12501,12 +12501,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -12555,12 +12555,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "16.4",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -12609,12 +12609,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -12663,12 +12663,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -13335,12 +13335,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "16.4",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -13389,12 +13389,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -13443,12 +13443,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -13497,12 +13497,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "16.4",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -13551,12 +13551,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
@@ -13605,12 +13605,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--output-disabled-tests",
           "--out-dir",
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 01a69c39..7303692 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -8908,12 +8908,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--extra-app-args=--disable-field-trial-config",
           "--out-dir",
@@ -8962,12 +8962,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--extra-app-args=--disable-field-trial-config",
           "--out-dir",
@@ -9016,12 +9016,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--extra-app-args=--disable-field-trial-config",
           "--out-dir",
@@ -9070,12 +9070,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--extra-app-args=--disable-field-trial-config",
           "--out-dir",
@@ -9330,12 +9330,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--extra-app-args=--disable-field-trial-config",
           "--out-dir",
@@ -9384,12 +9384,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--extra-app-args=--disable-field-trial-config",
           "--out-dir",
@@ -11299,12 +11299,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -11353,12 +11353,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -11407,12 +11407,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -11461,12 +11461,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -11515,12 +11515,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -11569,12 +11569,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air 11-inch (M2)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -11623,12 +11623,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -11677,12 +11677,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -12143,12 +12143,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -12197,12 +12197,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air 11-inch (M2)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -12251,12 +12251,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -12305,12 +12305,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -17473,12 +17473,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--args-json",
           "{\"test_args\": [\"--run-with-custom-webkit\"]}",
@@ -17527,12 +17527,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air 11-inch (M2)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--args-json",
           "{\"test_args\": [\"--run-with-custom-webkit\"]}",
@@ -17581,12 +17581,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--args-json",
           "{\"test_args\": [\"--run-with-custom-webkit\"]}",
@@ -17635,12 +17635,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--args-json",
           "{\"test_args\": [\"--run-with-custom-webkit\"]}",
@@ -17689,12 +17689,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--args-json",
           "{\"test_args\": [\"--run-with-custom-webkit\"]}",
@@ -17743,12 +17743,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air 11-inch (M2)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--args-json",
           "{\"test_args\": [\"--run-with-custom-webkit\"]}",
@@ -17797,12 +17797,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--args-json",
           "{\"test_args\": [\"--run-with-custom-webkit\"]}",
@@ -17851,12 +17851,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--args-json",
           "{\"test_args\": [\"--run-with-custom-webkit\"]}",
@@ -18317,12 +18317,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--args-json",
           "{\"test_args\": [\"--run-with-custom-webkit\"]}",
@@ -18371,12 +18371,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air 11-inch (M2)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--args-json",
           "{\"test_args\": [\"--run-with-custom-webkit\"]}",
@@ -18425,12 +18425,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--args-json",
           "{\"test_args\": [\"--run-with-custom-webkit\"]}",
@@ -18479,12 +18479,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--args-json",
           "{\"test_args\": [\"--run-with-custom-webkit\"]}",
@@ -22917,12 +22917,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "18.1",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -22971,12 +22971,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "18.1",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -23025,12 +23025,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "18.1",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -23079,12 +23079,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "18.1",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -23339,12 +23339,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "18.1",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -23393,12 +23393,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "18.1",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -26553,12 +26553,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "18.1",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -26605,12 +26605,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "18.1",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -26657,12 +26657,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "18.1",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -26709,12 +26709,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "18.1",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -26959,12 +26959,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "18.1",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -27011,12 +27011,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "18.1",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -30022,12 +30022,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad (10th generation)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -30076,12 +30076,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air 11-inch (M2)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -30130,12 +30130,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -30184,12 +30184,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad (10th generation)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -30238,12 +30238,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air 11-inch (M2)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -30292,12 +30292,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -30346,12 +30346,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -30812,12 +30812,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad (10th generation)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -30866,12 +30866,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air 11-inch (M2)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -30920,12 +30920,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -30974,12 +30974,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -34434,12 +34434,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -34488,12 +34488,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -34542,12 +34542,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -34596,12 +34596,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -34650,12 +34650,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -34704,12 +34704,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -35067,12 +35067,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -35121,12 +35121,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -35175,12 +35175,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index c3562ec..d27027d 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -6357,12 +6357,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -6410,12 +6410,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -10010,12 +10010,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -10063,12 +10063,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air 11-inch (M2)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -10116,12 +10116,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -10169,12 +10169,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -10222,12 +10222,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -10275,12 +10275,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -10328,12 +10328,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -10381,12 +10381,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -10434,12 +10434,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -10487,12 +10487,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -10944,12 +10944,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -10997,12 +10997,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -11050,12 +11050,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 14",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -11103,12 +11103,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPhone 15",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--out-dir",
           "${ISOLATED_OUTDIR}",
@@ -15611,12 +15611,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "16.4",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -15665,12 +15665,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air (5th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -15719,12 +15719,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Air 11-inch (M2)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -15773,12 +15773,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "16.4",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -15827,12 +15827,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -15881,12 +15881,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -16244,12 +16244,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "16.4",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -16298,12 +16298,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro (12.9-inch) (6th generation)",
           "--version",
           "17.5",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
@@ -16352,12 +16352,12 @@
       },
       {
         "args": [
+          "--clones",
+          "2",
           "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.0",
-          "--clones",
-          "2",
           "--xcodebuild-sim-runner",
           "--record-video",
           "failed_only",
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index aeb7082b..3d5acc91 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -525,7 +525,7 @@
           "hard_timeout": 21600,
           "io_timeout": 21600,
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 40
+          "shards": 23
         },
         "test": "performance_webview_test_suite",
         "trigger_script": {
diff --git a/testing/buildbot/chromium.perf.pinpoint.json b/testing/buildbot/chromium.perf.pinpoint.json
index ae17e29..37c5c86 100644
--- a/testing/buildbot/chromium.perf.pinpoint.json
+++ b/testing/buildbot/chromium.perf.pinpoint.json
@@ -453,7 +453,7 @@
           "hard_timeout": 21600,
           "io_timeout": 21600,
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 40
+          "shards": 23
         },
         "test": "performance_webview_test_suite",
         "trigger_script": {
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py
index 71eedee..feeb0d17 100755
--- a/testing/buildbot/generate_buildbot_json.py
+++ b/testing/buildbot/generate_buildbot_json.py
@@ -647,6 +647,17 @@
     self.ensure_valid_mixin_list(test_mixins, f'test {test_name} mixins')
     test = self.apply_mixins(test, test_mixins, mixins_to_ignore, builder)
 
+    # Apply any variant details
+    variant = test.pop('*variant*', None)
+    if variant is not None:
+      test = self.apply_mixin(variant, test)
+      variant_mixins = test.pop('*variant_mixins*', [])
+      self.ensure_valid_mixin_list(
+          variant_mixins,
+          (f'variant mixins for test {test_name}'
+           f' with variant with identifier{test["variant_id"]}'))
+      test = self.apply_mixins(test, variant_mixins, mixins_to_ignore, builder)
+
     # Add any swarming or args from the builder
     self.dictionary_merge(test['swarming'], builder.get('swarming', {}))
     if supports_args:
@@ -1161,10 +1172,7 @@
       variant_skylab = variant.pop('skylab', {})
 
       for test_name, test_config in basic_test_definition.items():
-        new_test = self.apply_mixin(variant, test_config)
-
-        new_test['mixins'] = (test_config.get('mixins', []) + variant_mixins +
-                              mixins)
+        new_test = copy.copy(test_config)
 
         # The identifier is used to make the name of the test unique.
         # Generators in the recipe uniquely identify a test by it's name, so we
@@ -1176,6 +1184,15 @@
         # is mainly used in generate_gpu_telemetry_test().
         new_test['variant_id'] = identifier
 
+        # Save the variant details and mixins to be applied in
+        # apply_common_transformations to match the order that starlark will
+        # apply things
+        new_test['*variant*'] = variant
+        new_test['*variant_mixins*'] = variant_mixins + mixins
+
+        # TODO: crbug.com/40258588 - When skylab support is implemented in
+        # starlark, these fields should be incorporated into mixins and handled
+        # consistently with other fields
         for k, v in variant_skylab.items():
           # cros_chrome_version is the ash chrome version in the cros img in the
           # variant of cros_board. We don't want to include it in the final json
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index aed3d69..b6453a6e6 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -374,6 +374,7 @@
                         "AndroidBrowserControlsInViz"
                     ],
                     "disable_features": [
+                        "AndroidBcivWithSimpleScheduler",
                         "AndroidBcivWithSuppression",
                         "AndroidBcivZeroBrowserFrames"
                     ]
@@ -3947,6 +3948,43 @@
             ]
         }
     ],
+    "CaptureModeEducation": [
+        {
+            "platforms": [
+                "chromeos",
+                "chromeos_lacros"
+            ],
+            "experiments": [
+                {
+                    "name": "EnabledShortcutNudge_20231214",
+                    "params": {
+                        "CaptureModeEducationParam": "ShortcutNudge"
+                    },
+                    "enable_features": [
+                        "CaptureModeEducation"
+                    ]
+                },
+                {
+                    "name": "EnabledShortcutTutorial_20231214",
+                    "params": {
+                        "CaptureModeEducationParam": "ShortcutTutorial"
+                    },
+                    "enable_features": [
+                        "CaptureModeEducation"
+                    ]
+                },
+                {
+                    "name": "EnabledQuickSettingsNudge_20231214",
+                    "params": {
+                        "CaptureModeEducationParam": "QuickSettingsNudge"
+                    },
+                    "enable_features": [
+                        "CaptureModeEducation"
+                    ]
+                }
+            ]
+        }
+    ],
     "CastCertificateRevocation": [
         {
             "platforms": [
@@ -10067,6 +10105,23 @@
             ]
         }
     ],
+    "FetchListFamilyMembersWithCapability": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "ios"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "FetchListFamilyMembersWithCapability"
+                    ]
+                }
+            ]
+        }
+    ],
     "FindRegistrationImprovements": [
         {
             "platforms": [
@@ -19172,27 +19227,6 @@
             ]
         }
     ],
-    "ReadAnythingReadAloudWordHighlighting": [
-        {
-            "platforms": [
-                "chromeos"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "ReadAnythingReadAloudAutomaticWordHighlighting"
-                    ]
-                },
-                {
-                    "name": "Disabled",
-                    "disable_features": [
-                        "ReadAnythingReadAloudAutomaticWordHighlighting"
-                    ]
-                }
-            ]
-        }
-    ],
     "ReclaimOldPrepaintTiles": [
         {
             "platforms": [
diff --git a/third_party/angle b/third_party/angle
index 0040cda..cc44090 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit 0040cda1170f9d481135a95d2fbff616120f404b
+Subproject commit cc44090d3483efdbae0dacf9c3fdb6c5d5a950fa
diff --git a/third_party/blink/common/messaging/string_message_codec.cc b/third_party/blink/common/messaging/string_message_codec.cc
index 2d2c490..440a342 100644
--- a/third_party/blink/common/messaging/string_message_codec.cc
+++ b/third_party/blink/common/messaging/string_message_codec.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "third_party/blink/public/common/messaging/string_message_codec.h"
 
 #include <memory>
@@ -48,15 +43,18 @@
 
   std::optional<base::span<const uint8_t>> GetAsSpanIfPossible()
       const override {
-    return base::make_span(data_).subspan(position_, length_);
+    return AsSpan();
   }
 
   void CopyInto(base::span<uint8_t> dest) const override {
-    CHECK_GE(dest.size(), length_);
-    memcpy(dest.data(), data_.data() + position_, length_);
+    dest.copy_from(AsSpan());
   }
 
  private:
+  base::span<const uint8_t> AsSpan() const {
+    return base::span(data_).subspan(position_, length_);
+  }
+
   std::vector<uint8_t> data_;
   size_t position_;
   size_t length_;
@@ -87,8 +85,7 @@
   }
 
   void CopyInto(base::span<uint8_t> dest) const override {
-    CHECK(dest.size() >= data_.size());
-    memcpy(dest.data(), data_.data(), data_.size());
+    dest.copy_from(base::make_span(data_));
   }
 
  private:
@@ -134,10 +131,8 @@
   }
 }
 
-void WriteBytes(const char* bytes,
-                size_t num_bytes,
-                std::vector<uint8_t>* buffer) {
-  buffer->insert(buffer->end(), bytes, bytes + num_bytes);
+void WriteBytes(base::span<const uint8_t> bytes, std::vector<uint8_t>* buffer) {
+  buffer->insert(buffer->end(), bytes.begin(), bytes.end());
 }
 
 bool ReadUint8(base::BufferIterator<const uint8_t>& iter, uint8_t* value) {
@@ -199,15 +194,17 @@
               std::string data_latin1(str.cbegin(), str.cend());
               WriteUint8(kOneByteStringTag, &buffer);
               WriteUint32(data_latin1.size(), &buffer);
-              WriteBytes(data_latin1.c_str(), data_latin1.size(), &buffer);
+              WriteBytes(base::as_byte_span(data_latin1), &buffer);
             } else {
-              size_t num_bytes = str.size() * sizeof(char16_t);
-              if ((buffer.size() + 1 + BytesNeededForUint32(num_bytes)) & 1)
+              auto str_as_bytes = base::as_byte_span(str);
+              if ((buffer.size() + 1 +
+                   BytesNeededForUint32(str_as_bytes.size())) &
+                  1) {
                 WriteUint8(kPaddingTag, &buffer);
+              }
               WriteUint8(kTwoByteStringTag, &buffer);
-              WriteUint32(num_bytes, &buffer);
-              WriteBytes(reinterpret_cast<const char*>(str.data()), num_bytes,
-                         &buffer);
+              WriteUint32(str_as_bytes.size(), &buffer);
+              WriteBytes(str_as_bytes, &buffer);
             }
           },
           [&](const std::unique_ptr<WebMessageArrayBufferPayload>&
diff --git a/third_party/blink/public/mojom/render_accessibility.mojom b/third_party/blink/public/mojom/render_accessibility.mojom
index dbbbb99..e1a4495 100644
--- a/third_party/blink/public/mojom/render_accessibility.mojom
+++ b/third_party/blink/public/mojom/render_accessibility.mojom
@@ -12,17 +12,10 @@
 import "ui/accessibility/mojom/ax_tree_id.mojom";
 import "ui/accessibility/mojom/ax_tree_update.mojom";
 import "ui/accessibility/mojom/ax_updates_and_events.mojom";
+import "ui/accessibility/mojom/ax_location_and_scroll_updates.mojom";
 import "ui/gfx/geometry/mojom/geometry.mojom";
 import "third_party/blink/public/mojom/tokens/tokens.mojom";
 
-struct LocationChanges {
-  // ID of the object whose location is changing.
-  int32 id;
-
-  // The object's new location info.
-  ax.mojom.AXRelativeBounds new_location;
-};
-
 struct HitTestResponse {
   // The frame token of the frame that got hit. If this is not equal to the
   // frame that the original hit test was called on, the client should do
@@ -59,6 +52,7 @@
   // TODO(crbug.com/1088484) tracks work to improve the payload size.
   [UnlimitedSize]
   HandleAXEvents(ax.mojom.AXUpdatesAndEvents events_and_updates,
+                 ax.mojom.AXLocationAndScrollUpdates location_and_scroll_updates,
                  uint32 reset_token) => ();
 
   // Sent to update the browser of the location of accessibility objects.
@@ -70,7 +64,7 @@
   // most recent Reset() or SetMode(), so that the browser can filter out
   // obsolete messages.
   [UnlimitedSize]
-  HandleAXLocationChanges(array<LocationChanges> changes, uint32 reset_token);
+  HandleAXLocationChanges(ax.mojom.AXLocationAndScrollUpdates changes, uint32 reset_token);
 };
 
 // Interface for accessibility messages sent from RenderFrameHostImpl in the
diff --git a/third_party/blink/public/web/DEPS b/third_party/blink/public/web/DEPS
index a7597e20..07ac03d 100644
--- a/third_party/blink/public/web/DEPS
+++ b/third_party/blink/public/web/DEPS
@@ -77,6 +77,7 @@
     "+ui/accessibility/ax_tree_data.h",
     "+ui/accessibility/ax_tree_id.h",
     "+ui/accessibility/ax_tree_source.h",
+    "+ui/accessibility/ax_location_and_scroll_updates.h",
     "+ui/base/ime/mojom/ime_types.mojom-shared.h",
     "+ui/base/ime/mojom/virtual_keyboard_types.mojom-shared.h",
 
diff --git a/third_party/blink/public/web/web_frame_serializer.h b/third_party/blink/public/web/web_frame_serializer.h
index 7cc24e45..7f19457 100644
--- a/third_party/blink/public/web/web_frame_serializer.h
+++ b/third_party/blink/public/web/web_frame_serializer.h
@@ -31,6 +31,7 @@
 #ifndef THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_FRAME_SERIALIZER_H_
 #define THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_FRAME_SERIALIZER_H_
 
+#include "base/functional/callback.h"
 #include "third_party/blink/public/platform/web_common.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/platform/web_thread_safe_data.h"
@@ -70,15 +71,18 @@
                                                WebLocalFrame*,
                                                MHTMLPartsGenerationDelegate*);
 
-  // Generates and returns MHTML parts for the given frame and the
-  // savable resources underneath.
+  // Generates and MHTML parts for the given frame and the savable resources
+  // underneath. Calls `callback` with the result which should be appended to
+  // the MHTML file.
   //
-  // Same |boundary| needs to used for all generateMHTMLHeader and
+  // The same `boundary` needs to be used for all generateMHTMLHeader and
   // generateMHTMLParts and generateMHTMLFooter calls that belong to the same
   // MHTML document (see also rfc1341, section 7.2.1, "boundary" description).
-  static WebThreadSafeData GenerateMHTMLParts(const WebString& boundary,
-                                              WebLocalFrame*,
-                                              MHTMLPartsGenerationDelegate*);
+  static void GenerateMHTMLParts(
+      const WebString& boundary,
+      WebLocalFrame*,
+      MHTMLPartsGenerationDelegate*,
+      base::OnceCallback<void(WebThreadSafeData)> callback);
 
   // IMPORTANT:
   // The API below is an older implementation of frame serialization that
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h
index a8e13d16..26c92021 100644
--- a/third_party/blink/public/web/web_local_frame_client.h
+++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -96,6 +96,7 @@
 #include "third_party/blink/public/web/web_navigation_type.h"
 #include "ui/accessibility/ax_enums.mojom-shared.h"
 #include "ui/accessibility/ax_event.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_tree_update.h"
 #include "ui/events/types/scroll_types.h"
 #include "v8/include/v8.h"
@@ -709,6 +710,7 @@
   virtual bool SendAccessibilitySerialization(
       std::vector<ui::AXTreeUpdate> updates,
       std::vector<ui::AXEvent> events,
+      ui::AXLocationAndScrollUpdates location_and_scroll_updates,
       bool had_load_complete_messages) {
     return false;
   }
diff --git a/third_party/blink/renderer/bindings/core/v8/idl_types.h b/third_party/blink/renderer/bindings/core/v8/idl_types.h
index b8b2199e..97012a2 100644
--- a/third_party/blink/renderer/bindings/core/v8/idl_types.h
+++ b/third_party/blink/renderer/bindings/core/v8/idl_types.h
@@ -20,7 +20,8 @@
 
 class BigInt;
 class EventListener;
-class ScriptPromiseUntyped;
+template <typename T>
+class ScriptPromise;
 class ScriptValue;
 struct ToV8UndefinedGenerator;
 
@@ -202,7 +203,8 @@
 struct IDLObject final : public IDLBaseHelper<ScriptValue> {};
 
 // Promise types
-struct IDLPromise final : public IDLBaseHelper<ScriptPromiseUntyped> {};
+template <typename T>
+struct IDLPromise final : public IDLBaseHelper<ScriptPromise<T>> {};
 
 // Sequence types
 template <typename T>
diff --git a/third_party/blink/renderer/bindings/core/v8/idl_types_test.cc b/third_party/blink/renderer/bindings/core/v8/idl_types_test.cc
index 1445e78..f906bc9 100644
--- a/third_party/blink/renderer/bindings/core/v8/idl_types_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/idl_types_test.cc
@@ -105,10 +105,11 @@
 static_assert(std::is_same<IDLUnrestrictedFloat::ImplType, float>::value,
               "IDLUnrestrictedFloat's ImplType is float");
 
-static_assert(std::is_base_of<IDLBase, IDLPromise>::value,
+static_assert(std::is_base_of<IDLBase, IDLPromise<IDLAny>>::value,
               "IDLPromise inherits from IDLBase");
-static_assert(std::is_same<IDLPromise::ImplType, ScriptPromiseUntyped>::value,
-              "IDLPromise's ImplType is ScriptPromiseUntyped");
+static_assert(
+    std::is_same<IDLPromise<IDLAny>::ImplType, ScriptPromise<IDLAny>>::value,
+    "IDLPromise<T>'s ImplType is ScriptPromiseTyped<T>");
 
 static_assert(std::is_base_of<IDLBase, IDLSequence<IDLByte>>::value,
               "IDLSequence inherits from IDLBase");
diff --git a/third_party/blink/renderer/bindings/core/v8/is_return_type_compatible.h b/third_party/blink/renderer/bindings/core/v8/is_return_type_compatible.h
index 4e18f8a..b8843d8 100644
--- a/third_party/blink/renderer/bindings/core/v8/is_return_type_compatible.h
+++ b/third_party/blink/renderer/bindings/core/v8/is_return_type_compatible.h
@@ -146,11 +146,12 @@
 inline constexpr bool IsReturnTypeCompatible<IDLObject, v8::Local<v8::Value>> =
     true;
 
-// TODO(caseq): take care of this case, promises should be returned as
-// IDLPromise<>.
-template <>
-inline constexpr bool
-    IsReturnTypeCompatible<blink::IDLPromise, v8::Local<v8::Promise>> = true;
+// TODO(caseq): take care of this case, all promises should be returned as
+// ScriptPromise<PromiseType> and IDLTypeImplementedAsV8Promise extended
+// attribute should be removed.
+template <typename PromiseType>
+inline constexpr bool IsReturnTypeCompatible<blink::IDLPromise<PromiseType>,
+                                             v8::Local<v8::Promise>> = true;
 
 // Any IDL strings are compatible to any blink strings.
 template <typename IDLStringType>
diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
index 896d0d2..0ebb403a 100644
--- a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
+++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
@@ -43,12 +43,16 @@
 class ScriptWrappable;
 struct WrapperTypeInfo;
 
+struct ToV8UndefinedGenerator {
+  DISALLOW_NEW();
+  using ImplType = ToV8UndefinedGenerator;
+};
+
 namespace bindings {
 
 class EnumerationBase;
 class InputDictionaryBase;
 class UnionBase;
-
 CORE_EXPORT void NativeValueTraitsInterfaceNotOfType(
     const WrapperTypeInfo* wrapper_type_info,
     ExceptionState& exception_state);
@@ -120,6 +124,17 @@
   }
 };
 
+// undefined
+template <>
+struct CORE_EXPORT NativeValueTraits<IDLUndefined>
+    : public NativeValueTraitsBase<IDLUndefined> {
+  static ToV8UndefinedGenerator NativeValue(v8::Isolate*,
+                                            v8::Local<v8::Value>,
+                                            ExceptionState&) {
+    return ToV8UndefinedGenerator();
+  }
+};
+
 // boolean
 template <>
 struct CORE_EXPORT NativeValueTraits<IDLBoolean>
@@ -902,19 +917,32 @@
 };
 
 // Promise types
-template <>
-struct CORE_EXPORT NativeValueTraits<IDLPromise>
-    : public NativeValueTraitsBase<IDLPromise> {
-  static ScriptPromiseUntyped NativeValue(v8::Isolate* isolate,
-                                          v8::Local<v8::Value> value,
-                                          ExceptionState& exception_state) {
-    return ScriptPromise<IDLAny>::FromV8Value(isolate, value);
+template <typename T>
+struct NativeValueTraits<IDLPromise<T>>
+    : public NativeValueTraitsBase<IDLPromise<T>> {
+  static ScriptPromise<T> NativeValue(v8::Isolate* isolate,
+                                      v8::Local<v8::Value> value,
+                                      ExceptionState&) {
+    if (value.IsEmpty()) {
+      return ScriptPromise<T>();
+    }
+    if (value->IsPromise()) {
+      return ScriptPromise<T>::FromV8Promise(isolate, value.As<v8::Promise>());
+    }
+    ScriptState* script_state = ScriptState::ForCurrentRealm(isolate);
+    v8::TryCatch try_catch(isolate);
+    auto&& blink_value = NativeValueTraits<T>::NativeValue(
+        isolate, value, PassThroughException(isolate));
+    if (try_catch.HasCaught()) {
+      return ScriptPromise<T>::Reject(script_state, try_catch.Exception());
+    }
+    return ToResolvedPromise<T>(script_state, std::move(blink_value));
   }
 };
 
 // IDLNullable<IDLPromise> must not be used.
-template <>
-struct NativeValueTraits<IDLNullable<IDLPromise>>;
+template <typename T>
+struct NativeValueTraits<IDLNullable<IDLPromise<T>>>;
 
 // Sequence types
 
diff --git a/third_party/blink/renderer/bindings/core/v8/rejected_promises.cc b/third_party/blink/renderer/bindings/core/v8/rejected_promises.cc
index 3f95c900..71866e5f 100644
--- a/third_party/blink/renderer/bindings/core/v8/rejected_promises.cc
+++ b/third_party/blink/renderer/bindings/core/v8/rejected_promises.cc
@@ -79,8 +79,8 @@
     if (target &&
         sanitize_script_errors_ == SanitizeScriptErrors::kDoNotSanitize) {
       PromiseRejectionEventInit* init = PromiseRejectionEventInit::Create();
-      init->setPromise(
-          ScriptPromiseUntyped(script_state_->GetIsolate(), promise));
+      init->setPromise(ScriptPromise<IDLAny>::FromV8Promise(
+          script_state_->GetIsolate(), promise));
       init->setReason(ScriptValue(script_state_->GetIsolate(), reason));
       init->setCancelable(true);
       PromiseRejectionEvent* event = PromiseRejectionEvent::Create(
@@ -126,8 +126,8 @@
     if (target &&
         sanitize_script_errors_ == SanitizeScriptErrors::kDoNotSanitize) {
       PromiseRejectionEventInit* init = PromiseRejectionEventInit::Create();
-      init->setPromise(
-          ScriptPromiseUntyped(script_state_->GetIsolate(), promise));
+      init->setPromise(ScriptPromise<IDLAny>::FromV8Promise(
+          script_state_->GetIsolate(), promise));
       init->setReason(ScriptValue(script_state_->GetIsolate(), reason));
       PromiseRejectionEvent* event = PromiseRejectionEvent::Create(
           script_state_, event_type_names::kRejectionhandled, init);
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise.h b/third_party/blink/renderer/bindings/core/v8/script_promise.h
index 0c3252e..5a60e96 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise.h
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise.h
@@ -132,25 +132,11 @@
   ScriptPromise() = default;
 
   template <typename T = IDLResolvedType>
-    requires std::is_same_v<T, IDLAny>
   static ScriptPromise<T> FromV8Promise(v8::Isolate* isolate,
                                         v8::Local<v8::Promise> promise) {
     return ScriptPromise<T>(isolate, promise);
   }
 
-  template <typename T = IDLResolvedType>
-    requires std::is_same_v<T, IDLAny>
-  static ScriptPromise<T> FromV8Value(v8::Isolate* isolate,
-                                      v8::Local<v8::Value> value) {
-    if (value.IsEmpty()) {
-      return ScriptPromise<T>();
-    }
-    if (value->IsPromise()) {
-      return FromV8Promise(isolate, value.As<v8::Promise>());
-    }
-    return ToResolvedPromise<T>(ScriptState::ForCurrentRealm(isolate), value);
-  }
-
   static ScriptPromise<IDLResolvedType> RejectWithDOMException(
       ScriptState* script_state,
       DOMException* exception) {
diff --git a/third_party/blink/renderer/bindings/core/v8/to_v8_traits.h b/third_party/blink/renderer/bindings/core/v8/to_v8_traits.h
index d6f361a1..852a227 100644
--- a/third_party/blink/renderer/bindings/core/v8/to_v8_traits.h
+++ b/third_party/blink/renderer/bindings/core/v8/to_v8_traits.h
@@ -49,13 +49,6 @@
 template <typename T, typename SFINAEHelper = void>
 struct ToV8Traits;
 
-// Used only for allowing a ScriptPromiseProperty to specify that it will
-// resolve/reject with v8::Undefined.
-struct ToV8UndefinedGenerator {
-  DISALLOW_NEW();
-  using ImplType = ToV8UndefinedGenerator;
-};
-
 // undefined
 template <>
 struct ToV8Traits<IDLUndefined> {
@@ -88,6 +81,12 @@
       return v8::Undefined(script_state->GetIsolate());
     return value;
   }
+
+  [[nodiscard]] static v8::Local<v8::Value> ToV8(
+      ScriptState* script_state,
+      const bindings::NativeValueTraitsAnyAdapter& adapter) {
+    return adapter;
+  }
 };
 
 // Boolean
@@ -243,11 +242,11 @@
 };
 
 // Promise
-template <>
-struct ToV8Traits<IDLPromise> {
+template <typename T>
+struct ToV8Traits<IDLPromise<T>> {
   [[nodiscard]] static v8::Local<v8::Value> ToV8(
       ScriptState* script_state,
-      const ScriptPromiseUntyped& script_promise) {
+      const ScriptPromise<T>& script_promise) {
     DCHECK(!script_promise.IsEmpty());
     return script_promise.V8Value();
   }
diff --git a/third_party/blink/renderer/bindings/core/v8/to_v8_traits_test.cc b/third_party/blink/renderer/bindings/core/v8/to_v8_traits_test.cc
index bd7acb9..20f01be 100644
--- a/third_party/blink/renderer/bindings/core/v8/to_v8_traits_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/to_v8_traits_test.cc
@@ -282,7 +282,8 @@
   test::TaskEnvironment task_environment;
   const V8TestingScope scope;
   auto promise = ToResolvedUndefinedPromise(scope.GetScriptState());
-  TEST_TOV8_TRAITS(scope, IDLPromise, "[object Promise]", promise);
+  TEST_TOV8_TRAITS(scope, IDLPromise<IDLUndefined>, "[object Promise]",
+                   promise);
 }
 
 TEST(ToV8TraitsTest, NotShared) {
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py b/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
index 775012a..04c18be 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
@@ -363,7 +363,8 @@
         if "IDLTypeImplementedAsV8Promise" in real_type.extended_attributes:
             type_name = "v8::Local<v8::Promise>"
         else:
-            type_name = "ScriptPromiseUntyped"
+            type_name = "ScriptPromise<{}>".format(
+                native_value_tag(real_type.result_type))
         return TypeInfo(type_name,
                         ref_fmt="{}&",
                         const_ref_fmt="const {}&",
@@ -522,7 +523,8 @@
             _native_value_tag_impl(real_type.value_type))
 
     if real_type.is_promise:
-        return "IDLPromise"
+        return "IDLPromise<{}>".format(
+            _native_value_tag_impl(real_type.result_type))
 
     if real_type.is_union:
         return blink_class_name(real_type.union_definition_object)
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py b/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py
index 1669448..3f723de 100644
--- a/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py
+++ b/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py
@@ -991,8 +991,6 @@
                         return idl_type
                 elif isinstance(idl_type, _ArrayLikeType):
                     idl_type = idl_type.element_type
-                elif isinstance(idl_type, PromiseType):
-                    idl_type = idl_type.result_type
                 elif isinstance(idl_type, NullableType):
                     idl_type = idl_type.inner_type
                 else:
@@ -1025,6 +1023,11 @@
                     visit_type(member_type, target_set)
             elif isinstance(idl_type, RecordType):
                 visit_type(idl_type.value_type, target_set)
+            elif isinstance(idl_type, PromiseType):
+                visit_type(idl_type.result_type, target_set)
+                # Because of how we convert Promise<> input parameters, we need
+                # to be able to covert the result type back to V8.
+                visit_type(idl_type.result_type, outputs)
             else:
                 assert isinstance(idl_type, SimpleType), type(idl_type)
 
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 9adda13..57f2f7ed 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -1624,9 +1624,13 @@
     // fast-path parser fails, the full parser will adjust the mode
     // appropriately.
     SetCompatibilityMode(kQuirksMode);
+    // Set the state so that the attribute cache is enabled for fragments.
+    // TODO(sesse): Should we do this also for the non-fastpath parser?
+    SetParsingState(kParsing);
     const bool success = TryParsingHTMLFragment(content, *this, *body, *body,
                                                 kAllowScriptingContent,
                                                 parser_behavior, nullptr);
+    SetParsingState(kFinishedParsing);
     if (success) {
       // When DCHECK is enabled, use SetContent() and verify fast-path
       // content matches. This effectively means the results of the fast-path
@@ -7729,9 +7733,9 @@
 }
 
 void Document::MaybeRecordShapeTextElapsedTime(base::TimeDelta elapsed_time) {
-    data_->accumulated_shape_text_elapsed_time_ += elapsed_time;
-    data_->max_shape_text_elapsed_time_ =
-        std::max(data_->max_shape_text_elapsed_time_, elapsed_time);
+  data_->accumulated_shape_text_elapsed_time_ += elapsed_time;
+  data_->max_shape_text_elapsed_time_ =
+      std::max(data_->max_shape_text_elapsed_time_, elapsed_time);
 }
 
 void Document::MaybeRecordSvgImageProcessingTime(
diff --git a/third_party/blink/renderer/core/exported/DEPS b/third_party/blink/renderer/core/exported/DEPS
index 121d977..d95d845 100644
--- a/third_party/blink/renderer/core/exported/DEPS
+++ b/third_party/blink/renderer/core/exported/DEPS
@@ -7,6 +7,9 @@
 ]
 
 specific_include_rules = {
+  "web_frame_serializer_test_helper.cc": [
+    "+base/run_loop.h",
+  ],
   "web_view_impl\.cc": [
     "+base/command_line.h",
     "+components/viz/common/features.h",
diff --git a/third_party/blink/renderer/core/exported/web_frame_serializer.cc b/third_party/blink/renderer/core/exported/web_frame_serializer.cc
index 43db55ef..1a999df 100644
--- a/third_party/blink/renderer/core/exported/web_frame_serializer.cc
+++ b/third_party/blink/renderer/core/exported/web_frame_serializer.cc
@@ -48,11 +48,55 @@
 #include "third_party/blink/renderer/platform/mhtml/serialized_resource.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
 #include "third_party/blink/renderer/platform/wtf/deque.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_concatenate.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
 
+namespace {
+
+void ContinueGenerateMHTMLParts(
+    const WebString& boundary,
+    const blink::LocalFrameToken& frame_token,
+    MHTMLArchive::EncodingPolicy encoding_policy,
+    base::OnceCallback<void(WebThreadSafeData)> callback,
+    Deque<SerializedResource> resources) {
+  WebFrame* web_frame = WebLocalFrame::FromFrameToken(frame_token);
+  LocalFrame* frame =
+      web_frame ? To<WebLocalFrameImpl>(web_frame)->GetFrame() : nullptr;
+
+  TRACE_EVENT_END1("page-serialization",
+                   "WebFrameSerializer::generateMHTMLParts serializing",
+                   "resource count", static_cast<uint64_t>(resources.size()));
+
+  // There was an error serializing the frame (e.g. of an image resource).
+  if (resources.empty() || !frame) {
+    std::move(callback).Run(WebThreadSafeData());
+    return;
+  }
+
+  // Encode serialized resources as MHTML.
+  scoped_refptr<RawData> output = RawData::Create();
+  {
+    // Frame is the 1st resource (see FrameSerializer::serializeFrame doc
+    // comment). Frames get a Content-ID header.
+    MHTMLArchive::GenerateMHTMLPart(
+        boundary, FrameSerializer::GetContentID(frame), encoding_policy,
+        resources.TakeFirst(), *output->MutableData());
+    while (!resources.empty()) {
+      TRACE_EVENT0("page-serialization",
+                   "WebFrameSerializer::generateMHTMLParts encoding");
+      MHTMLArchive::GenerateMHTMLPart(boundary, String(), encoding_policy,
+                                      resources.TakeFirst(),
+                                      *output->MutableData());
+    }
+  }
+  std::move(callback).Run(WebThreadSafeData(output));
+}
+
+}  // namespace
+
 WebThreadSafeData WebFrameSerializer::GenerateMHTMLHeader(
     const WebString& boundary,
     WebLocalFrame* frame,
@@ -72,10 +116,11 @@
   return WebThreadSafeData(buffer);
 }
 
-WebThreadSafeData WebFrameSerializer::GenerateMHTMLParts(
+void WebFrameSerializer::GenerateMHTMLParts(
     const WebString& boundary,
     WebLocalFrame* web_frame,
-    MHTMLPartsGenerationDelegate* web_delegate) {
+    MHTMLPartsGenerationDelegate* web_delegate,
+    base::OnceCallback<void(WebThreadSafeData)> callback) {
   TRACE_EVENT0("page-serialization", "WebFrameSerializer::generateMHTMLParts");
   DCHECK(web_frame);
   DCHECK(web_delegate);
@@ -91,33 +136,11 @@
   TRACE_EVENT_BEGIN0("page-serialization",
                      "WebFrameSerializer::generateMHTMLParts serializing");
   Deque<SerializedResource> resources;
-  FrameSerializer::SerializeFrame(resources, *web_delegate, *frame);
-
-  TRACE_EVENT_END1("page-serialization",
-                   "WebFrameSerializer::generateMHTMLParts serializing",
-                   "resource count", static_cast<uint64_t>(resources.size()));
-
-  // There was an error serializing the frame (e.g. of an image resource).
-  if (resources.empty())
-    return WebThreadSafeData();
-
-  // Encode serialized resources as MHTML.
-  scoped_refptr<RawData> output = RawData::Create();
-  {
-    // Frame is the 1st resource (see FrameSerializer::serializeFrame doc
-    // comment). Frames get a Content-ID header.
-    MHTMLArchive::GenerateMHTMLPart(
-        boundary, FrameSerializer::GetContentID(frame), encoding_policy,
-        resources.TakeFirst(), *output->MutableData());
-    while (!resources.empty()) {
-      TRACE_EVENT0("page-serialization",
-                   "WebFrameSerializer::generateMHTMLParts encoding");
-      MHTMLArchive::GenerateMHTMLPart(boundary, String(), encoding_policy,
-                                      resources.TakeFirst(),
-                                      *output->MutableData());
-    }
-  }
-  return WebThreadSafeData(output);
+  FrameSerializer::SerializeFrame(
+      *web_delegate, *frame,
+      WTF::BindOnce(&ContinueGenerateMHTMLParts, boundary,
+                    web_frame->GetLocalFrameToken(), encoding_policy,
+                    std::move(callback)));
 }
 
 bool WebFrameSerializer::Serialize(
diff --git a/third_party/blink/renderer/core/exported/web_frame_serializer_test_helper.cc b/third_party/blink/renderer/core/exported/web_frame_serializer_test_helper.cc
index 4acd586c..6bbc4b13 100644
--- a/third_party/blink/renderer/core/exported/web_frame_serializer_test_helper.cc
+++ b/third_party/blink/renderer/core/exported/web_frame_serializer_test_helper.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/exported/web_frame_serializer_test_helper.h"
 
+#include "base/run_loop.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_string.h"
@@ -12,6 +13,7 @@
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
 #include "third_party/blink/renderer/platform/mhtml/mhtml_archive.h"
 #include "third_party/blink/renderer/platform/mhtml/mhtml_parser.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/shared_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 
@@ -55,9 +57,17 @@
                  static_cast<unsigned>(header_result.size()));
   }
 
-  WebThreadSafeData body_result =
-      WebFrameSerializer::GenerateMHTMLParts(boundary, frame, &mhtml_delegate);
-  mhtml.Append(body_result.data(), static_cast<unsigned>(body_result.size()));
+  base::RunLoop run_loop;
+  WebFrameSerializer::GenerateMHTMLParts(
+      boundary, frame, &mhtml_delegate,
+      WTF::BindOnce(
+          [](StringBuilder* mhtml, base::OnceClosure quit,
+             WebThreadSafeData data) {
+            mhtml->Append(data.data(), static_cast<unsigned>(data.size()));
+            std::move(quit).Run();
+          },
+          WTF::Unretained(&mhtml), run_loop.QuitClosure()));
+  run_loop.Run();
 
   if (!only_body_parts) {
     scoped_refptr<RawData> footer_data = RawData::Create();
diff --git a/third_party/blink/renderer/core/frame/frame_serializer.cc b/third_party/blink/renderer/core/frame/frame_serializer.cc
index 0820098..8fc06eb 100644
--- a/third_party/blink/renderer/core/frame/frame_serializer.cc
+++ b/third_party/blink/renderer/core/frame/frame_serializer.cc
@@ -123,7 +123,7 @@
 }
 
 void AppendLinkElement(StringBuilder& markup, const KURL& url) {
-  markup.Append(R"html(<link rel="stylesheet" type="text/css" href=")html");
+  markup.Append(R"(<link rel="stylesheet" type="text/css" href=")");
   markup.Append(url.GetString());
   markup.Append("\" />");
 }
@@ -135,9 +135,8 @@
 class MultiResourcePacker {
  public:
   MultiResourcePacker(
-      Deque<SerializedResource>* resources,
       WebFrameSerializer::MHTMLPartsGenerationDelegate* web_delegate)
-      : resources_(resources), web_delegate_(web_delegate) {}
+      : web_delegate_(web_delegate) {}
 
   bool HasResource(const KURL& url) const {
     return resource_urls_.Contains(url);
@@ -148,7 +147,7 @@
                        const KURL& url) {
     // The main resource must be first.
     // We do not call `ShouldAddURL()` for the main resource.
-    resources_->push_front(SerializedResource(url, mime_type, std::move(data)));
+    resources_.push_front(SerializedResource(url, mime_type, std::move(data)));
   }
 
   void AddToResources(const String& mime_type,
@@ -160,7 +159,7 @@
     }
     CHECK(resource_urls_.Contains(url))
         << "ShouldAddURL() not called before AddToResources";
-    resources_->push_back(SerializedResource(url, mime_type, std::move(data)));
+    resources_.push_back(SerializedResource(url, mime_type, std::move(data)));
   }
 
   void AddImageToResources(ImageResourceContent* image, const KURL& url) {
@@ -204,11 +203,15 @@
                    font.Url());
   }
 
+  Deque<SerializedResource> FinishAndTakeResources() && {
+    return std::move(resources_);
+  }
+
  private:
   // This hashset is only used for de-duplicating resources to be serialized.
   HashSet<KURL> resource_urls_;
 
-  Deque<SerializedResource>* resources_;
+  Deque<SerializedResource> resources_;
   WebFrameSerializer::MHTMLPartsGenerationDelegate* web_delegate_;
 };
 
@@ -954,17 +957,19 @@
 
 // static
 void FrameSerializer::SerializeFrame(
-    Deque<SerializedResource>& resources,
     WebFrameSerializer::MHTMLPartsGenerationDelegate& web_delegate,
-    const LocalFrame& frame) {
+    LocalFrame& frame,
+    base::OnceCallback<void(Deque<SerializedResource>)> done_callback) {
   TRACE_EVENT0("page-serialization", "FrameSerializer::serializeFrame");
   DCHECK(frame.GetDocument());
   Document& document = *frame.GetDocument();
   KURL url = document.Url();
-  MultiResourcePacker resource_serializer(&resources, &web_delegate);
+  MultiResourcePacker resource_serializer(&web_delegate);
   // If frame is an image document, add the image and don't continue
   if (auto* image_document = DynamicTo<ImageDocument>(document)) {
     resource_serializer.AddImageToResources(image_document->CachedImage(), url);
+    std::move(done_callback)
+        .Run(std::move(resource_serializer).FinishAndTakeResources());
     return;
   }
 
@@ -980,6 +985,9 @@
     resource_serializer.AddMainResource(
         document.SuggestedMIMEType(),
         SharedBuffer::Create(frame_html.c_str(), frame_html.length()), url);
+    // TODO(crbug.com/363289333): Add async fetching of fonts.
+    std::move(done_callback)
+        .Run(std::move(resource_serializer).FinishAndTakeResources());
   }
 }
 
diff --git a/third_party/blink/renderer/core/frame/frame_serializer.h b/third_party/blink/renderer/core/frame/frame_serializer.h
index ddc61fe..417d7c1 100644
--- a/third_party/blink/renderer/core/frame/frame_serializer.h
+++ b/third_party/blink/renderer/core/frame/frame_serializer.h
@@ -31,6 +31,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_FRAME_SERIALIZER_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_FRAME_SERIALIZER_H_
 
+#include "base/functional/callback.h"
 #include "third_party/blink/public/web/web_frame_serializer.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
@@ -63,9 +64,9 @@
   // added to `resources`. The first resource is the frame's serialized content.
   // Subsequent resources are images, css, etc.
   static void SerializeFrame(
-      Deque<SerializedResource>& resources,
       WebFrameSerializer::MHTMLPartsGenerationDelegate& web_delegate,
-      const LocalFrame&);
+      LocalFrame& frame,
+      base::OnceCallback<void(Deque<SerializedResource>)> done_callback);
 
   static String MarkOfTheWebDeclaration(const KURL&);
 };
diff --git a/third_party/blink/renderer/core/frame/frame_serializer_test.cc b/third_party/blink/renderer/core/frame/frame_serializer_test.cc
index 2941dd8a..4b549c5 100644
--- a/third_party/blink/renderer/core/frame/frame_serializer_test.cc
+++ b/third_party/blink/renderer/core/frame/frame_serializer_test.cc
@@ -32,6 +32,8 @@
 
 #include <string>
 
+#include "base/run_loop.h"
+#include "base/test/bind.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/platform/web_url.h"
@@ -126,13 +128,19 @@
     for (; frame; frame = frame->Tree().TraverseNext()) {
       // This is safe, because tests do not do cross-site navigation
       // (and therefore don't have remote frames).
-      FrameSerializer::SerializeFrame(resources_, *this,
-                                      *To<LocalFrame>(frame));
-      // Don't serialize the same resource on subsequent frames. This mimics how
-      // FrameSerializer is actually used.
-      for (auto& res : GetResources()) {
-        skip_urls_.insert(res.url);
-      }
+      base::RunLoop run_loop;
+      FrameSerializer::SerializeFrame(
+          *this, *To<LocalFrame>(frame),
+          base::BindLambdaForTesting([&](Deque<SerializedResource> resources) {
+            for (auto& res : resources) {
+              resources_.push_back(res);
+              // Don't serialize the same resource on subsequent frames. This
+              // mimics how FrameSerializer is actually used.
+              skip_urls_.insert(res.url);
+            }
+            run_loop.Quit();
+          }));
+      run_loop.Run();
     }
   }
 
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
index acb1b36..5587a8f 100644
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
@@ -74,25 +74,55 @@
 
 namespace {
 
+gfx::Size ParseDstSize(const ImageBitmapOptions* options,
+                       const gfx::Rect& src_rect) {
+  int resize_width = 0;
+  int resize_height = 0;
+  if (!options->hasResizeWidth() && !options->hasResizeHeight()) {
+    resize_width = src_rect.width();
+    resize_height = src_rect.height();
+  } else if (options->hasResizeWidth() && options->hasResizeHeight()) {
+    resize_width = options->resizeWidth();
+    resize_height = options->resizeHeight();
+  } else if (options->hasResizeWidth() && !options->hasResizeHeight()) {
+    resize_width = options->resizeWidth();
+    resize_height =
+        ClampTo<unsigned>(ceil(static_cast<float>(options->resizeWidth()) /
+                               src_rect.width() * src_rect.height()));
+  } else {
+    resize_height = options->resizeHeight();
+    resize_width =
+        ClampTo<unsigned>(ceil(static_cast<float>(options->resizeHeight()) /
+                               src_rect.height() * src_rect.width()));
+  }
+  return gfx::Size(resize_width, resize_height);
+}
+
 ImageBitmap::ParsedOptions ParseOptions(const ImageBitmapOptions* options,
                                         std::optional<gfx::Rect> crop_rect,
-                                        gfx::Size source_size) {
+                                        gfx::Size source_size,
+                                        ImageOrientation source_orientation,
+                                        bool source_is_unpremul) {
   ImageBitmap::ParsedOptions parsed_options;
   if (options->imageOrientation() == kImageOrientationFlipY) {
     parsed_options.flip_y = true;
     parsed_options.orientation_from_image = true;
+    parsed_options.source_orientation = source_orientation;
   } else {
     DCHECK(options->imageOrientation() == kImageOrientationFromImage ||
            options->imageOrientation() == kImageBitmapOptionNone);
     parsed_options.flip_y = false;
     parsed_options.orientation_from_image = true;
-
+    parsed_options.source_orientation = source_orientation;
     if (base::FeatureList::IsEnabled(
             features::kCreateImageBitmapOrientationNone) &&
         options->imageOrientation() == kImageBitmapOptionNone) {
       parsed_options.orientation_from_image = false;
+      parsed_options.source_orientation = ImageOrientation();
     }
   }
+
+  parsed_options.source_is_unpremul = source_is_unpremul;
   if (options->premultiplyAlpha() == kImageBitmapOptionNone) {
     parsed_options.premultiply_alpha = false;
   } else {
@@ -110,30 +140,28 @@
         << IDLEnumAsString(options->colorSpaceConversion());
   }
 
-  int source_width = source_size.width();
-  int source_height = source_size.height();
+  parsed_options.source_size =
+      parsed_options.source_orientation.UsesWidthAsHeight()
+          ? gfx::TransposeSize(source_size)
+          : source_size;
   if (!crop_rect) {
-    parsed_options.crop_rect = gfx::Rect(0, 0, source_width, source_height);
+    // TODO(crbug.com/40773069): This should use `parsed_options.source_size`,
+    // because it should be in the same (post-orientation) space. The are
+    // other bugs that depend on this bug, so keep this present, adding
+    // `source_rect` as the future replacement.
+    parsed_options.crop_rect = gfx::Rect(source_size);
+    parsed_options.source_rect = gfx::Rect(parsed_options.source_size);
   } else {
     parsed_options.crop_rect = *crop_rect;
+    parsed_options.source_rect = *crop_rect;
   }
-  if (!options->hasResizeWidth() && !options->hasResizeHeight()) {
-    parsed_options.resize_width = parsed_options.crop_rect.width();
-    parsed_options.resize_height = parsed_options.crop_rect.height();
-  } else if (options->hasResizeWidth() && options->hasResizeHeight()) {
-    parsed_options.resize_width = options->resizeWidth();
-    parsed_options.resize_height = options->resizeHeight();
-  } else if (options->hasResizeWidth() && !options->hasResizeHeight()) {
-    parsed_options.resize_width = options->resizeWidth();
-    parsed_options.resize_height = ClampTo<unsigned>(ceil(
-        static_cast<float>(options->resizeWidth()) /
-        parsed_options.crop_rect.width() * parsed_options.crop_rect.height()));
-  } else {
-    parsed_options.resize_height = options->resizeHeight();
-    parsed_options.resize_width = ClampTo<unsigned>(ceil(
-        static_cast<float>(options->resizeHeight()) /
-        parsed_options.crop_rect.height() * parsed_options.crop_rect.width()));
-  }
+  // TODO(crbug.com/40773069): The above error propagates into `resize_width`
+  // and `resize_height`. Add `dest_size` as the future replacement.
+  gfx::Size resize = ParseDstSize(options, parsed_options.crop_rect);
+  parsed_options.resize_width = resize.width();
+  parsed_options.resize_height = resize.height();
+  parsed_options.dest_size = ParseDstSize(options, parsed_options.source_rect);
+
   if (static_cast<int>(parsed_options.resize_width) ==
           parsed_options.crop_rect.width() &&
       static_cast<int>(parsed_options.resize_height) ==
@@ -154,6 +182,27 @@
   return parsed_options;
 }
 
+ImageBitmap::ParsedOptions ParseOptions(const ImageBitmapOptions* options,
+                                        std::optional<gfx::Rect> crop_rect,
+                                        scoped_refptr<Image> input) {
+  const auto info = input->PaintImageForCurrentFrame().GetSkImageInfo();
+  return ParseOptions(options, crop_rect,
+                      gfx::Size(info.width(), info.height()),
+                      input->CurrentFrameOrientation(),
+                      info.alphaType() == kUnpremul_SkAlphaType);
+}
+
+ImageBitmap::ParsedOptions ParseOptions(
+    const ImageBitmapOptions* options,
+    std::optional<gfx::Rect> crop_rect,
+    scoped_refptr<StaticBitmapImage> input) {
+  auto info = input->GetSkImageInfo();
+  return ParseOptions(options, crop_rect,
+                      gfx::Size(info.width(), info.height()),
+                      input->CurrentFrameOrientation(),
+                      info.alphaType() == kUnpremul_SkAlphaType);
+}
+
 // The function dstBufferSizeHasOverflow() is being called at the beginning of
 // each ImageBitmap() constructor, which makes sure that doing
 // width * height * bytesPerPixel will never overflow unsigned.
@@ -361,7 +410,7 @@
 
 scoped_refptr<StaticBitmapImage> ApplyColorSpaceConversion(
     scoped_refptr<StaticBitmapImage>&& image,
-    ImageBitmap::ParsedOptions& options) {
+    const ImageBitmap::ParsedOptions& options) {
   SkImageInfo src_image_info =
       image->PaintImageForCurrentFrame().GetSkImageInfo();
   if (src_image_info.isEmpty())
@@ -385,7 +434,7 @@
 
 scoped_refptr<StaticBitmapImage> BakeOrientation(
     scoped_refptr<StaticBitmapImage> input,
-    ImageBitmap::ParsedOptions& options,
+    const ImageBitmap::ParsedOptions& options,
     gfx::Rect src_rect) {
   SkImageInfo info = GetSkImageInfo(input);
   if (info.isEmpty()) {
@@ -453,7 +502,7 @@
 
 static scoped_refptr<StaticBitmapImage> CropImageAndApplyColorSpaceConversion(
     scoped_refptr<StaticBitmapImage>&& image,
-    ImageBitmap::ParsedOptions& parsed_options) {
+    const ImageBitmap::ParsedOptions& parsed_options) {
   DCHECK(image);
   DCHECK(!image->HasData());
 
@@ -564,11 +613,7 @@
   scoped_refptr<Image> input = cached ? cached->GetImage() : Image::NullImage();
   DCHECK(!input->IsTextureBacked());
 
-  ParsedOptions parsed_options =
-      ParseOptions(options, crop_rect, image->BitmapSourceSize());
-  parsed_options.source_is_unpremul =
-      (input->PaintImageForCurrentFrame().GetAlphaType() ==
-       kUnpremul_SkAlphaType);
+  ParsedOptions parsed_options = ParseOptions(options, crop_rect, input);
   if (DstBufferSizeHasOverflow(parsed_options))
     return;
 
@@ -638,23 +683,23 @@
 ImageBitmap::ImageBitmap(HTMLVideoElement* video,
                          std::optional<gfx::Rect> crop_rect,
                          const ImageBitmapOptions* options) {
-  ParsedOptions parsed_options =
-      ParseOptions(options, crop_rect, video->BitmapSourceSize());
-  if (DstBufferSizeHasOverflow(parsed_options))
-    return;
-
   // TODO(crbug.com/1181329): ImageBitmap resize test case failed when
   // quality equals to "low" and "medium". Need further investigate to
   // enable gpu backed imageBitmap with resize options.
   const bool allow_accelerated_images =
       !options->hasResizeWidth() && !options->hasResizeHeight();
+  const bool reinterpret_as_srgb =
+      (options->colorSpaceConversion() == kImageBitmapOptionNone);
   auto input = video->CreateStaticBitmapImage(
-      allow_accelerated_images,
-      /*size=*/std::nullopt,
-      /*reinterpret_as_srgb=*/!parsed_options.has_color_space_conversion);
+      allow_accelerated_images, /*size=*/std::nullopt, reinterpret_as_srgb);
   if (!input)
     return;
 
+  ParsedOptions parsed_options = ParseOptions(options, crop_rect, input);
+  if (DstBufferSizeHasOverflow(parsed_options)) {
+    return;
+  }
+
   image_ =
       CropImageAndApplyColorSpaceConversion(std::move(input), parsed_options);
   if (!image_)
@@ -677,8 +722,7 @@
   scoped_refptr<StaticBitmapImage> input =
       static_cast<StaticBitmapImage*>(image_input.get());
 
-  ParsedOptions parsed_options = ParseOptions(
-      options, crop_rect, gfx::Size(input->width(), input->height()));
+  const ParsedOptions parsed_options = ParseOptions(options, crop_rect, input);
   if (DstBufferSizeHasOverflow(parsed_options))
     return;
 
@@ -706,8 +750,7 @@
   if (status != kNormalSourceImageStatus)
     return;
 
-  ParsedOptions parsed_options = ParseOptions(
-      options, crop_rect, gfx::Size(input->width(), input->height()));
+  const ParsedOptions parsed_options = ParseOptions(options, crop_rect, input);
   if (DstBufferSizeHasOverflow(parsed_options))
     return;
 
@@ -736,10 +779,10 @@
 ImageBitmap::ImageBitmap(ImageData* data,
                          std::optional<gfx::Rect> crop_rect,
                          const ImageBitmapOptions* options) {
-  ParsedOptions parsed_options =
-      ParseOptions(options, crop_rect, data->BitmapSourceSize());
-  // ImageData is always unpremul.
-  parsed_options.source_is_unpremul = true;
+  const ParsedOptions parsed_options =
+      ParseOptions(options, crop_rect, data->BitmapSourceSize(),
+                   ImageOrientationEnum::kOriginTopLeft,
+                   /*source_is_unpremul=*/true);
   if (DstBufferSizeHasOverflow(parsed_options))
     return;
 
@@ -822,11 +865,7 @@
   scoped_refptr<StaticBitmapImage> input = bitmap->BitmapImage();
   if (!input)
     return;
-  ParsedOptions parsed_options =
-      ParseOptions(options, crop_rect, input->Size());
-  parsed_options.source_is_unpremul =
-      (input->PaintImageForCurrentFrame().GetAlphaType() ==
-       kUnpremul_SkAlphaType);
+  const ParsedOptions parsed_options = ParseOptions(options, crop_rect, input);
   if (DstBufferSizeHasOverflow(parsed_options))
     return;
 
@@ -843,11 +882,7 @@
                          std::optional<gfx::Rect> crop_rect,
                          const ImageBitmapOptions* options) {
   bool origin_clean = image->OriginClean();
-  ParsedOptions parsed_options =
-      ParseOptions(options, crop_rect, image->Size());
-  parsed_options.source_is_unpremul =
-      (image->PaintImageForCurrentFrame().GetAlphaType() ==
-       kUnpremul_SkAlphaType);
+  const ParsedOptions parsed_options = ParseOptions(options, crop_rect, image);
   if (DstBufferSizeHasOverflow(parsed_options))
     return;
 
@@ -992,17 +1027,16 @@
     mojom::blink::PreferredColorScheme preferred_color_scheme,
     ExceptionState& exception_state,
     const ImageBitmapOptions* options) {
-  ParsedOptions parsed_options =
-      ParseOptions(options, crop_rect, image->BitmapSourceSize());
+  scoped_refptr<Image> input = image->CachedImage()->GetImage();
+  DCHECK(input->IsSVGImage());
+
+  const ParsedOptions parsed_options = ParseOptions(options, crop_rect, input);
   if (DstBufferSizeHasOverflow(parsed_options)) {
     exception_state.ThrowDOMException(
         DOMExceptionCode::kInvalidStateError,
         "The ImageBitmap could not be allocated.");
     return EmptyPromise();
   }
-
-  scoped_refptr<Image> input = image->CachedImage()->GetImage();
-  DCHECK(input->IsSVGImage());
   gfx::Rect input_rect(input->Size());
 
   // In the case when |crop_rect| doesn't intersect the source image, we return
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap.h b/third_party/blink/renderer/core/imagebitmap/image_bitmap.h
index 4b222ae..902305b5 100644
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap.h
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap.h
@@ -131,17 +131,38 @@
                                                ExceptionState&) override;
 
   struct ParsedOptions {
+    // If true, then the final result should be flipped vertically. This happens
+    // in the space after `source_orientation` has been applied.
     bool flip_y = false;
     bool premultiply_alpha = true;
+    // TODO(crbug.com/40773069): This is based on the incorrect values and needs
+    // to be removed.
     bool should_scale_input = false;
     bool has_color_space_conversion = false;
     bool source_is_unpremul = false;
     bool orientation_from_image = true;
+    // TODO(crbug.com/40773069): The value of `resize_width`, `resize_height`,
+    // and `crop_rect` are computed incorrectly. Remove this when all code that
+    // uses it is removed.
     unsigned resize_width = 0;
     unsigned resize_height = 0;
     gfx::Rect crop_rect;
     cc::PaintFlags::FilterQuality resize_quality =
         cc::PaintFlags::FilterQuality::kLow;
+
+    // The filter quality specified by the options. This is always set, even
+    // if no resampling is needed.
+    cc::PaintFlags::FilterQuality filter_quality =
+        cc::PaintFlags::FilterQuality::kLow;
+
+    // The orientation of the source. This may be from the source or overridden.
+    class ImageOrientation source_orientation;
+
+    // The `source_size`, `source_rect`, and `dest_size` parameters are all in
+    // the space after the `source_orientation` has been applied.
+    gfx::Size source_size;
+    gfx::Rect source_rect;
+    gfx::Size dest_size;
   };
 
  private:
diff --git a/third_party/blink/renderer/core/navigation_api/navigate_event.cc b/third_party/blink/renderer/core/navigation_api/navigate_event.cc
index f349266..e5f59d3 100644
--- a/third_party/blink/renderer/core/navigation_api/navigate_event.cc
+++ b/third_party/blink/renderer/core/navigation_api/navigate_event.cc
@@ -381,7 +381,7 @@
   handlers_list.swap(navigation_action_handlers_list_);
 
   for (auto& function : handlers_list) {
-    ScriptPromiseUntyped result;
+    ScriptPromise<IDLUndefined> result;
     if (function->Invoke(this).To(&result))
       navigation_action_promises_list_.push_back(result);
   }
diff --git a/third_party/blink/renderer/core/navigation_api/navigation_intercept_options.idl b/third_party/blink/renderer/core/navigation_api/navigation_intercept_options.idl
index de7d50e..4e91e93 100644
--- a/third_party/blink/renderer/core/navigation_api/navigation_intercept_options.idl
+++ b/third_party/blink/renderer/core/navigation_api/navigation_intercept_options.idl
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 // https://wicg.github.io/navigation-api/
-callback NavigationInterceptHandler = Promise<void>();
+callback NavigationInterceptHandler = Promise<undefined>();
 
 dictionary NavigationInterceptOptions {
   NavigationInterceptHandler handler;
diff --git a/third_party/blink/renderer/core/streams/byte_stream_tee_engine.cc b/third_party/blink/renderer/core/streams/byte_stream_tee_engine.cc
index 8df5d4e..f0fb16d4 100644
--- a/third_party/blink/renderer/core/streams/byte_stream_tee_engine.cc
+++ b/third_party/blink/renderer/core/streams/byte_stream_tee_engine.cc
@@ -652,7 +652,8 @@
 
   // 13. Let cancelPromise be a new promise.
   cancel_promise_ =
-      MakeGarbageCollected<ScriptPromiseResolver<IDLPromise>>(script_state);
+      MakeGarbageCollected<ScriptPromiseResolver<IDLPromise<IDLUndefined>>>(
+          script_state);
 
   // 17. Let pull1Algorithm be the following steps:
   // (See PullAlgorithm::Run()).
diff --git a/third_party/blink/renderer/core/streams/byte_stream_tee_engine.h b/third_party/blink/renderer/core/streams/byte_stream_tee_engine.h
index f68469c..1a67c1a 100644
--- a/third_party/blink/renderer/core/streams/byte_stream_tee_engine.h
+++ b/third_party/blink/renderer/core/streams/byte_stream_tee_engine.h
@@ -69,7 +69,7 @@
 
   Member<ReadableStream> stream_;
   Member<ReadableStreamGenericReader> reader_;
-  Member<ScriptPromiseResolver<IDLPromise>> cancel_promise_;
+  Member<ScriptPromiseResolver<IDLPromise<IDLUndefined>>> cancel_promise_;
   bool reading_ = false;
 
   // The standard contains a number of pairs of variables with one for each
diff --git a/third_party/blink/renderer/core/streams/tee_engine.cc b/third_party/blink/renderer/core/streams/tee_engine.cc
index ea6a328..3ab5780 100644
--- a/third_party/blink/renderer/core/streams/tee_engine.cc
+++ b/third_party/blink/renderer/core/streams/tee_engine.cc
@@ -323,7 +323,8 @@
 
   // 12. Let cancelPromise be a new promise.
   cancel_promise_ =
-      MakeGarbageCollected<ScriptPromiseResolver<IDLPromise>>(script_state);
+      MakeGarbageCollected<ScriptPromiseResolver<IDLPromise<IDLUndefined>>>(
+          script_state);
 
   // 13. Let pullAlgorithm be the following steps:
   // (steps are defined in PullAlgorithm::Run()).
diff --git a/third_party/blink/renderer/core/streams/tee_engine.h b/third_party/blink/renderer/core/streams/tee_engine.h
index d20a8a1..a011141 100644
--- a/third_party/blink/renderer/core/streams/tee_engine.h
+++ b/third_party/blink/renderer/core/streams/tee_engine.h
@@ -61,7 +61,7 @@
 
   Member<ReadableStream> stream_;
   Member<ReadableStreamDefaultReader> reader_;
-  Member<ScriptPromiseResolver<IDLPromise>> cancel_promise_;
+  Member<ScriptPromiseResolver<IDLPromise<IDLUndefined>>> cancel_promise_;
   bool reading_ = false;
   bool read_again_ = false;
   bool clone_for_branch2_ = false;
diff --git a/third_party/blink/renderer/core/streams/transferable_streams.cc b/third_party/blink/renderer/core/streams/transferable_streams.cc
index 68ec3b2..af796f9 100644
--- a/third_party/blink/renderer/core/streams/transferable_streams.cc
+++ b/third_party/blink/renderer/core/streams/transferable_streams.cc
@@ -803,7 +803,7 @@
    public:
     explicit ConcatenatingUnderlyingSourceReadRequest(
         ConcatenatingUnderlyingSource* source,
-        ScriptPromiseResolver<IDLPromise>* resolver)
+        ScriptPromiseResolver<IDLPromise<IDLAny>>* resolver)
         : source_(source), resolver_(resolver) {}
 
     void ChunkSteps(ScriptState* script_state,
@@ -862,7 +862,7 @@
 
    private:
     Member<ConcatenatingUnderlyingSource> source_;
-    Member<ScriptPromiseResolver<IDLPromise>> resolver_;
+    Member<ScriptPromiseResolver<IDLPromise<IDLAny>>> resolver_;
   };
 
   ConcatenatingUnderlyingSource(ScriptState* script_state,
@@ -891,7 +891,8 @@
       return source2_->Pull(script_state, exception_state);
     }
     auto* promise =
-        MakeGarbageCollected<ScriptPromiseResolver<IDLPromise>>(script_state);
+        MakeGarbageCollected<ScriptPromiseResolver<IDLPromise<IDLAny>>>(
+            script_state);
     auto* read_request =
         MakeGarbageCollected<ConcatenatingUnderlyingSourceReadRequest>(this,
                                                                        promise);
diff --git a/third_party/blink/renderer/core/streams/underlying_source_cancel_callback.idl b/third_party/blink/renderer/core/streams/underlying_source_cancel_callback.idl
index 2626c7a..8fa43b2d 100644
--- a/third_party/blink/renderer/core/streams/underlying_source_cancel_callback.idl
+++ b/third_party/blink/renderer/core/streams/underlying_source_cancel_callback.idl
@@ -4,4 +4,4 @@
 
 // https://streams.spec.whatwg.org/#callbackdef-underlyingsourcecancelcallback
 
-callback UnderlyingSourceCancelCallback = Promise<void> (optional any reason);
+callback UnderlyingSourceCancelCallback = Promise<undefined> (optional any reason);
diff --git a/third_party/blink/renderer/core/streams/underlying_source_pull_callback.idl b/third_party/blink/renderer/core/streams/underlying_source_pull_callback.idl
index c2200c0e..8d1e59b 100644
--- a/third_party/blink/renderer/core/streams/underlying_source_pull_callback.idl
+++ b/third_party/blink/renderer/core/streams/underlying_source_pull_callback.idl
@@ -4,4 +4,4 @@
 
 // https://streams.spec.whatwg.org/#callbackdef-underlyingsourcepullcallback
 
-callback UnderlyingSourcePullCallback = Promise<void> (ReadableStreamController controller);
+callback UnderlyingSourcePullCallback = Promise<undefined> (ReadableStreamController controller);
diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc
index 8b131e8..f4f4e83 100644
--- a/third_party/blink/renderer/core/testing/internals.cc
+++ b/third_party/blink/renderer/core/testing/internals.cc
@@ -3942,7 +3942,8 @@
   object
       ->Set(script_state->GetContext(),
             V8String(script_state->GetIsolate(), "sink"),
-            ToV8Traits<IDLPromise>::ToV8(script_state, resolver->Promise()))
+            ToV8Traits<IDLPromise<IDLString>>::ToV8(script_state,
+                                                    resolver->Promise()))
       .Check();
   return ScriptValue(script_state->GetIsolate(), object);
 }
diff --git a/third_party/blink/renderer/core/view_transition/dom_view_transition.cc b/third_party/blink/renderer/core/view_transition/dom_view_transition.cc
index d8bcbfe2..2b68854 100644
--- a/third_party/blink/renderer/core/view_transition/dom_view_transition.cc
+++ b/third_party/blink/renderer/core/view_transition/dom_view_transition.cc
@@ -171,7 +171,7 @@
 
   dom_callback_result_ = DOMCallbackResult::kRunning;
 
-  ScriptPromiseUntyped result;
+  ScriptPromise<IDLUndefined> result;
 
   // It's ok to use the main world when there is no callback, since we're only
   // using it to call DOMChangeFinishedCallback which doesn't use the script
@@ -182,7 +182,7 @@
   ScriptState::Scope scope(script_state);
 
   if (update_dom_callback_) {
-    v8::Maybe<ScriptPromiseUntyped> maybe_result =
+    v8::Maybe<ScriptPromise<IDLUndefined>> maybe_result =
         update_dom_callback_->Invoke(nullptr);
 
     // If the callback couldn't be run for some reason, treat it as an empty
diff --git a/third_party/blink/renderer/core/view_transition/view_transition_callback.idl b/third_party/blink/renderer/core/view_transition/view_transition_callback.idl
index 7e5d82c..c5a50d1 100644
--- a/third_party/blink/renderer/core/view_transition/view_transition_callback.idl
+++ b/third_party/blink/renderer/core/view_transition/view_transition_callback.idl
@@ -5,5 +5,5 @@
 // TODO(vmpstr): Rename this to UpdateDOMCallback
 [
   SupportsTaskAttribution
-] callback ViewTransitionCallback = Promise<void>();
+] callback ViewTransitionCallback = Promise<undefined>();
 
diff --git a/third_party/blink/renderer/modules/accessibility/BUILD.gn b/third_party/blink/renderer/modules/accessibility/BUILD.gn
index 72c8104..20fded44 100644
--- a/third_party/blink/renderer/modules/accessibility/BUILD.gn
+++ b/third_party/blink/renderer/modules/accessibility/BUILD.gn
@@ -60,6 +60,7 @@
     "//ui/accessibility",
     "//ui/accessibility:ax_base",
     "//ui/accessibility:ax_enums_mojo_blink",
+    "//ui/accessibility/mojom:mojom_blink",
   ]
 
   # The modules/accessibility/ depends closely on core/ --
diff --git a/third_party/blink/renderer/modules/accessibility/DEPS b/third_party/blink/renderer/modules/accessibility/DEPS
index cbcbbc0..19f814a4 100644
--- a/third_party/blink/renderer/modules/accessibility/DEPS
+++ b/third_party/blink/renderer/modules/accessibility/DEPS
@@ -21,5 +21,7 @@
     "+ui/accessibility/ax_tree_data.h",
     "+ui/accessibility/ax_tree_id.h",
     "+ui/accessibility/ax_tree_serializer.h",
-    "+ui/accessibility/mojom/ax_relative_bounds.mojom-blink.h"
+    "+ui/accessibility/mojom/ax_relative_bounds.mojom-blink.h",
+    "+ui/accessibility/ax_location_and_scroll_updates.h",
+    "+ui/accessibility/mojom/ax_location_and_scroll_updates.mojom-blink.h",
 ]
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index ac57a5e..3f63b29 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -1474,7 +1474,9 @@
     dst.AddBoolAttribute(ax::mojom::blink::BoolAttribute::kIsLineBreakingObject,
                          true);
   }
-  AXObjectCache().SetCachedBoundingBox(AXObjectID(), dst.relative_bounds);
+  gfx::Point scroll_offset = GetScrollOffset();
+  AXObjectCache().SetCachedBoundingBox(AXObjectID(), dst.relative_bounds,
+                                       scroll_offset.x(), scroll_offset.y());
 }
 
 static bool AXShouldIncludePageScaleFactorInRoot() {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index a5d08e4..bf931d4 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -126,8 +126,10 @@
 #include "ui/accessibility/ax_common.h"
 #include "ui/accessibility/ax_enums.mojom-blink.h"
 #include "ui/accessibility/ax_event.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_node.h"
 #include "ui/accessibility/ax_role_properties.h"
+#include "ui/accessibility/mojom/ax_location_and_scroll_updates.mojom-blink.h"
 #include "ui/accessibility/mojom/ax_relative_bounds.mojom-blink.h"
 #if DCHECK_IS_ON()
 #include "third_party/blink/renderer/modules/accessibility/ax_debug_utils.h"
@@ -757,7 +759,6 @@
     DEBUG_STRING_CASE(kEditableTextContentChanged);
     DEBUG_STRING_CASE(kFocusableChanged);
     DEBUG_STRING_CASE(kIdChanged);
-    DEBUG_STRING_CASE(kMarkDirtyFromHandleScroll);
     DEBUG_STRING_CASE(kNodeIsAttached);
     DEBUG_STRING_CASE(kNodeGainedFocus);
     DEBUG_STRING_CASE(kNodeLostFocus);
@@ -1991,14 +1992,12 @@
     }
     // Allow the new AXObject for the same node to be serialized correctly.
     nodes_with_pending_children_changed_.erase(obj_id);
-    nodes_with_pending_scroll_changed_.erase(obj_id);
     computed_node_mapping_.erase(obj_id);
   } else {
     // Non-DOM ids should never find their way into these maps.
     DCHECK(!fixed_or_sticky_node_ids_.Contains(obj_id));
     DCHECK(!computed_node_mapping_.Contains(obj_id));
     DCHECK(!nodes_with_pending_children_changed_.Contains(obj_id));
-    DCHECK(!nodes_with_pending_scroll_changed_.Contains(obj_id));
   }
 }
 
@@ -3240,7 +3239,6 @@
       CHECK(tree_update_callback_queue_main_.empty());
       CHECK(tree_update_callback_queue_popup_.empty());
       CHECK(nodes_with_pending_children_changed_.empty());
-      CHECK(nodes_with_pending_scroll_changed_.empty());
 
       {
         lifecycle_.AdvanceTo(AXObjectCacheLifecycle::kFinalizingTree);
@@ -3256,7 +3254,6 @@
         CHECK(tree_update_callback_queue_main_.empty());
         CHECK(tree_update_callback_queue_popup_.empty());
         CHECK(nodes_with_pending_children_changed_.empty());
-        CHECK(nodes_with_pending_scroll_changed_.empty());
 
         // Updating the tree did not add dirty objects.
         DUMP_WILL_BE_CHECK(!IsDirty());
@@ -3301,9 +3298,10 @@
 
     // ***** Serialize Location Changes *****
     // Even if there are no dirty objects, we ensure pending location changes
-    // are sent. However, we wait until the document load is complete because
-    // layout often shifts during the load process.
-    if (reset_token_ && GetDocument().IsLoadCompleted()) {
+    // are sent.
+    if (reset_token_ && !changed_bounds_ids_.empty()) {
+      DCHECK(!did_serialize);  // Location changes should have been sent with
+                               // full serialization.
       SerializeLocationChanges();
     }
 
@@ -3402,9 +3400,16 @@
   // There should be no more dirty objects.
   CHECK(!HasObjectsPendingSerialization());
 
+  /* If there's location updates pending, send them on the way. */
+  ui::AXLocationAndScrollUpdates location_and_scroll_changes;
+  if (!changed_bounds_ids_.empty()) {
+    location_and_scroll_changes = TakeLocationChangsForSerialization();
+  }
+
   /* Send the actual serialization message.*/
   bool success = client->SendAccessibilitySerialization(
-      std::move(updates), std::move(events), had_load_complete_messages);
+      std::move(updates), std::move(events),
+      std::move(location_and_scroll_changes), had_load_complete_messages);
 
   if (!success) {
     // In some cases, like in web tests or if a11y is off, serialization doesn't
@@ -3516,7 +3521,6 @@
   TreeUpdateCallbackQueue old_tree_update_callback_queue;
   GetTreeUpdateCallbackQueue(document).swap(old_tree_update_callback_queue);
   nodes_with_pending_children_changed_.clear();
-  nodes_with_pending_scroll_changed_.clear();
   last_value_change_node_ = ui::AXNodeData::kInvalidAXID;
 
   for (TreeUpdateParams* tree_update : old_tree_update_callback_queue) {
@@ -3737,9 +3741,6 @@
       // When the id attribute changes, the relations its in may also change.
       MaybeNewRelationTarget(*node, ax_object);
       break;
-    case TreeUpdateReason::kMarkDirtyFromHandleScroll:
-      MarkAXObjectDirtyWithCleanLayout(Get(node));
-      break;
     case TreeUpdateReason::kNodeGainedFocus:
       HandleNodeGainedFocusWithCleanLayout(node);
       break;
@@ -4783,7 +4784,6 @@
     case TreeUpdateReason::kDelayEventFromPostNotification:
     case TreeUpdateReason::kFocusableChanged:
     case TreeUpdateReason::kIdChanged:
-    case TreeUpdateReason::kMarkDirtyFromHandleScroll:
     case TreeUpdateReason::kNodeIsAttached:
     case TreeUpdateReason::kPostNotificationFromHandleLoadStart:
     case TreeUpdateReason::kPostNotificationFromHandleScrolledToAnchor:
@@ -5253,12 +5253,70 @@
   return active_aria_modal_dialog_;
 }
 
+ui::AXLocationAndScrollUpdates
+AXObjectCacheImpl::TakeLocationChangsForSerialization() {
+  CHECK(!changed_bounds_ids_.empty());
+
+  TRACE_EVENT0("accessibility",
+               load_sent_ ? "TakeLocationChangsForSerialization"
+                          : "TakeLocationChangsForSerializationLoading");
+  SCOPED_UMA_HISTOGRAM_TIMER_MICROS(
+      "Accessibility.Performance.TakeLocationChangsForSerialization");
+
+  ui::AXLocationAndScrollUpdates changes;
+
+  // Reserve is just an optimization. The actual value doesn't have to be
+  // accurate but just an estimate. Assume the changes will always be half and
+  // half.
+  changes.location_changes.reserve(changed_bounds_ids_.size());
+  changes.scroll_changes.reserve(changed_bounds_ids_.size());
+
+  for (AXID changed_bounds_id : changed_bounds_ids_) {
+    if (AXObject* obj = ObjectFromAXID(changed_bounds_id)) {
+      DCHECK(!obj->IsDetached());
+      // Only update locations that are already known.
+      auto bounds = cached_bounding_boxes_.find(changed_bounds_id);
+      if (bounds == cached_bounding_boxes_.end()) {
+        continue;
+      }
+
+      ui::AXRelativeBounds new_location;
+      bool clips_children;
+      obj->PopulateAXRelativeBounds(new_location, &clips_children);
+      gfx::Point scroll_offset = obj->GetScrollOffset();
+
+      if (bounds->value.bounds != new_location) {
+        changes.location_changes.emplace_back(changed_bounds_id, new_location);
+      }
+
+      if (bounds->value.scroll_x != scroll_offset.x() ||
+          bounds->value.scroll_y != scroll_offset.y()) {
+        changes.scroll_changes.emplace_back(
+            changed_bounds_id, scroll_offset.x(), scroll_offset.y());
+      }
+
+      cached_bounding_boxes_.Set(
+          changed_bounds_id,
+          CachedLocationChange(new_location, scroll_offset.x(),
+                               scroll_offset.y()));
+    }
+  }
+
+  changed_bounds_ids_.clear();
+  last_location_serialization_time_ =
+      base::Time::Now();  // Since this method is non-recoverable, update the
+                          // time here and assume this serializtion will arrive.
+  return changes;
+}
+
 void AXObjectCacheImpl::SerializeLocationChanges() {
-  CHECK(GetDocument().IsActive());
-  if (changed_bounds_ids_.empty()) {
+  // We wait until the document load is complete because layout often shifts
+  // during the load process.
+  if (!GetDocument().IsLoadCompleted()) {
     return;
   }
 
+  CHECK(GetDocument().IsActive());
   TRACE_EVENT0("accessibility", load_sent_ ? "SerializeLocationChanges"
                                            : "SerializeLocationChangesLoading");
   SCOPED_UMA_HISTOGRAM_TIMER_MICROS(
@@ -5291,33 +5349,26 @@
 
   weak_factory_for_loc_updates_pipeline_.Invalidate();
 
-  Vector<mojom::blink::LocationChangesPtr> changes;
-  changes.reserve(changed_bounds_ids_.size());
-  for (AXID changed_bounds_id : changed_bounds_ids_) {
-    if (AXObject* obj = ObjectFromAXID(changed_bounds_id)) {
-      DCHECK(!obj->IsDetached());
-      // Only update locations that are already known.
-      auto bounds = cached_bounding_boxes_.find(changed_bounds_id);
-      if (bounds == cached_bounding_boxes_.end())
-        continue;
+  ui::AXLocationAndScrollUpdates changes = TakeLocationChangsForSerialization();
 
-      ui::AXRelativeBounds new_location;
-      bool clips_children;
-      obj->PopulateAXRelativeBounds(new_location, &clips_children);
-      if (bounds->value == new_location)
-        continue;
-
-      cached_bounding_boxes_.Set(changed_bounds_id, new_location);
-      changes.push_back(
-          mojom::blink::LocationChanges::New(changed_bounds_id, new_location));
-    }
+  // Convert to blink mojom type
+  ax::mojom::blink::AXLocationAndScrollUpdatesPtr location_and_scroll_changes =
+      ax::mojom::blink::AXLocationAndScrollUpdates::New();
+  for (auto& item : changes.location_changes) {
+    location_and_scroll_changes->location_changes.push_back(
+        ax::mojom::blink::AXLocationChange::New(item.id, item.new_location));
   }
-  changed_bounds_ids_.clear();
-  if (!changes.empty()) {
+  for (auto& item : changes.scroll_changes) {
+    location_and_scroll_changes->scroll_changes.push_back(
+        ax::mojom::blink::AXScrollChange::New(item.id, item.scroll_x,
+                                              item.scroll_y));
+  }
+
+  if (!location_and_scroll_changes->location_changes.empty() ||
+      !location_and_scroll_changes->scroll_changes.empty()) {
     CHECK(reset_token_);
     GetOrCreateRemoteRenderAccessibilityHost()->HandleAXLocationChanges(
-        std::move(changes), *reset_token_);
-    last_location_serialization_time_ = base::Time::Now();
+        std::move(location_and_scroll_changes), *reset_token_);
   }
 }
 
@@ -5884,13 +5935,15 @@
   changed_bounds_ids_.insert(id);
 }
 
-void AXObjectCacheImpl::SetCachedBoundingBox(
-    AXID id,
-    const ui::AXRelativeBounds& bounds) {
+void AXObjectCacheImpl::SetCachedBoundingBox(AXID id,
+                                             const ui::AXRelativeBounds& bounds,
+                                             const int scroll_x,
+                                             const int scroll_y) {
   // When a bounding box of a node is serialized, we store the last value for it
   // in cached_bounding_boxes_, to help with comparing if it really changed
   // or not when sending another serialization later.
-  cached_bounding_boxes_.Set(id, bounds);
+  cached_bounding_boxes_.Set(id,
+                             CachedLocationChange(bounds, scroll_x, scroll_y));
 }
 
 void AXObjectCacheImpl::HandleScrollPositionChanged(
@@ -5908,12 +5961,7 @@
 
   Node* node = GetClosestNodeForLayoutObject(layout_object);
   if (node) {
-    if (!nodes_with_pending_scroll_changed_.insert(node->GetDomNodeId())
-             .is_new_entry) {
-      return;
-    }
-
-    DeferTreeUpdate(TreeUpdateReason::kMarkDirtyFromHandleScroll, node);
+    InvalidateBoundingBox(node->GetDomNodeId());
   }
 }
 
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
index 72c7337..f6e0e1e 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -65,6 +65,7 @@
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 #include "ui/accessibility/ax_enums.mojom-blink-forward.h"
 #include "ui/accessibility/ax_error_types.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_mode.h"
 #include "ui/accessibility/ax_tree_serializer.h"
 
@@ -345,7 +346,10 @@
   void InvalidateBoundingBox(const LayoutObject*) override;
   void InvalidateBoundingBox(const AXID&);
 
-  void SetCachedBoundingBox(AXID id, const ui::AXRelativeBounds& bounds);
+  void SetCachedBoundingBox(AXID id,
+                            const ui::AXRelativeBounds& bounds,
+                            const int scroll_x,
+                            const int scroll_y);
 
   const AtomicString& ComputedRoleForNode(Node*) override;
   String ComputedNameForNode(Node*) override;
@@ -530,9 +534,12 @@
   }
 
   // Retrieves a vector of all AXObjects whose bounding boxes may have changed
-  // since the last query. Sends the resulting vector over mojo to the browser
-  // process. Clears the vector so that the next time it's
-  // called, it will only retrieve objects that have changed since now.
+  // since the last query. Note that this function is destructive and clears the
+  // vector so that the next time it's called, it will only retrieve objects
+  // that have changed since now.
+  ui::AXLocationAndScrollUpdates TakeLocationChangsForSerialization();
+
+  // Sends the location changes over mojo to the browser process.
   void SerializeLocationChanges();
 
   // This method is used to fulfill AXTreeSnapshotter requests.
@@ -705,7 +712,6 @@
     kEditableTextContentChanged,
     kFocusableChanged,
     kIdChanged,
-    kMarkDirtyFromHandleScroll,
     kNodeIsAttached,
     kNodeGainedFocus,
     kNodeLostFocus,
@@ -1121,7 +1127,6 @@
 
   // Help de-dupe processing of repetitive events.
   HashSet<AXID> nodes_with_pending_children_changed_;
-  HashSet<AXID> nodes_with_pending_scroll_changed_;
 
   // Nodes with document markers that have received accessibility updates.
   HashSet<AXID> nodes_with_spelling_or_grammar_markers_;
@@ -1185,8 +1190,13 @@
   AXID current_menu_list_axid_ = 0;
 
   // Known locations and sizes of bounding boxes that are known to have been
-  // serialized.
-  HashMap<AXID, ui::AXRelativeBounds> cached_bounding_boxes_;
+  // serialized as well as their scroll offsets.
+  struct CachedLocationChange {
+    ui::AXRelativeBounds bounds;
+    int scroll_x;
+    int scroll_y;
+  };
+  HashMap<AXID, CachedLocationChange> cached_bounding_boxes_;
 
   // The list of node IDs whose position is fixed or sticky.
   HashSet<AXID> fixed_or_sticky_node_ids_;
diff --git a/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl b/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl
index 81a10ac4..3654a73f 100644
--- a/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl
+++ b/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl
@@ -60,7 +60,7 @@
   Promise<DOMString> directFromSellerSignalsHeaderAdSlot;
 
   [RuntimeEnabled=FledgeDeprecatedRenderURLReplacements]
-  Promise<record<USVString, USVString>> deprecatedRenderURLReplacements;
+  Promise<record<USVString, USVString>?> deprecatedRenderURLReplacements;
 
   unsigned long long sellerTimeout;
   unsigned short sellerExperimentGroupId;
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_item.cc b/third_party/blink/renderer/modules/clipboard/clipboard_item.cc
index eb87fd1..58bcb4bd6 100644
--- a/third_party/blink/renderer/modules/clipboard/clipboard_item.cc
+++ b/third_party/blink/renderer/modules/clipboard/clipboard_item.cc
@@ -19,7 +19,7 @@
 
 // static
 ClipboardItem* ClipboardItem::Create(
-    const HeapVector<std::pair<String, ScriptPromiseUntyped>>& representations,
+    const HeapVector<std::pair<String, ScriptPromise<Blob>>>& representations,
     ExceptionState& exception_state) {
   // Check that incoming dictionary isn't empty. If it is, it's possible that
   // Javascript bindings implicitly converted an Object (like a
@@ -32,8 +32,7 @@
 }
 
 ClipboardItem::ClipboardItem(
-    const HeapVector<std::pair<String, ScriptPromiseUntyped>>&
-        representations) {
+    const HeapVector<std::pair<String, ScriptPromise<Blob>>>& representations) {
   for (const auto& representation : representations) {
     String web_custom_format =
         Clipboard::ParseWebCustomFormat(representation.first);
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_item.h b/third_party/blink/renderer/modules/clipboard/clipboard_item.h
index 9a5b0c4..c459b36 100644
--- a/third_party/blink/renderer/modules/clipboard/clipboard_item.h
+++ b/third_party/blink/renderer/modules/clipboard/clipboard_item.h
@@ -25,8 +25,7 @@
   // If `representations` is empty, writes error info to `exception_state` and
   // returns nullptr.
   static ClipboardItem* Create(
-      const HeapVector<std::pair<String, ScriptPromiseUntyped>>&
-          representations,
+      const HeapVector<std::pair<String, ScriptPromise<Blob>>>& representations,
       ExceptionState& exception_state);
 
   // Constructs a `ClipboardItem` instance from `representations`.
@@ -35,7 +34,7 @@
   // If an empty `ClipboardItem` is a valid use-case, use the constructor
   // directly, else use `Create` method.
   explicit ClipboardItem(
-      const HeapVector<std::pair<String, ScriptPromiseUntyped>>&
+      const HeapVector<std::pair<String, ScriptPromise<Blob>>>&
           representations);
 
   // Returns the MIME types contained in the `ClipboardItem`.
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc b/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
index d9e8dbe..d7b16966 100644
--- a/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
+++ b/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
@@ -356,12 +356,14 @@
     return;
   }
   ScriptState::Scope scope(script_state);
-  HeapVector<std::pair<String, ScriptPromiseUntyped>> items;
+  HeapVector<std::pair<String, ScriptPromise<Blob>>> items;
   items.ReserveInitialCapacity(clipboard_item_data_.size());
 
   for (const auto& item : clipboard_item_data_) {
-    ScriptPromiseUntyped promise =
-        ToResolvedPromise<IDLNullable<Blob>>(script_state, item.second);
+    if (!item.second) {
+      continue;
+    }
+    auto promise = ToResolvedPromise<Blob>(script_state, item.second);
     items.emplace_back(item.first, promise);
   }
   HeapVector<Member<ClipboardItem>> clipboard_items = {
diff --git a/third_party/blink/renderer/modules/mediasession/media_session.cc b/third_party/blink/renderer/modules/mediasession/media_session.cc
index 50947c8..034dd74c 100644
--- a/third_party/blink/renderer/modules/mediasession/media_session.cc
+++ b/third_party/blink/renderer/modules/mediasession/media_session.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <optional>
 
+#include "base/notreached.h"
 #include "base/time/default_tick_clock.h"
 #include "base/time/time.h"
 #include "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom-blink.h"
@@ -14,6 +15,7 @@
 #include "third_party/blink/renderer/bindings/modules/v8/v8_media_position_state.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_action_details.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_action_handler.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_playback_state.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_seek_to_action_details.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -32,133 +34,109 @@
 
 using ::media_session::mojom::blink::MediaSessionAction;
 
-const AtomicString& MojomActionToActionName(MediaSessionAction action) {
-  DEFINE_STATIC_LOCAL(const AtomicString, play_action_name, ("play"));
-  DEFINE_STATIC_LOCAL(const AtomicString, pause_action_name, ("pause"));
-  DEFINE_STATIC_LOCAL(const AtomicString, previous_track_action_name,
-                      ("previoustrack"));
-  DEFINE_STATIC_LOCAL(const AtomicString, next_track_action_name,
-                      ("nexttrack"));
-  DEFINE_STATIC_LOCAL(const AtomicString, seek_backward_action_name,
-                      ("seekbackward"));
-  DEFINE_STATIC_LOCAL(const AtomicString, seek_forward_action_name,
-                      ("seekforward"));
-  DEFINE_STATIC_LOCAL(const AtomicString, skip_ad_action_name, ("skipad"));
-  DEFINE_STATIC_LOCAL(const AtomicString, stop_action_name, ("stop"));
-  DEFINE_STATIC_LOCAL(const AtomicString, seek_to_action_name, ("seekto"));
-  DEFINE_STATIC_LOCAL(const AtomicString, toggle_microphone_action_name,
-                      ("togglemicrophone"));
-  DEFINE_STATIC_LOCAL(const AtomicString, toggle_camera_action_name,
-                      ("togglecamera"));
-  DEFINE_STATIC_LOCAL(const AtomicString, hang_up_action_name, ("hangup"));
-  DEFINE_STATIC_LOCAL(const AtomicString, previous_slide_action_name,
-                      ("previousslide"));
-  DEFINE_STATIC_LOCAL(const AtomicString, next_slide_action_name,
-                      ("nextslide"));
-  DEFINE_STATIC_LOCAL(const AtomicString, enter_picture_in_picture_action_name,
-                      ("enterpictureinpicture"));
-
+V8MediaSessionAction::Enum MojomActionToActionEnum(MediaSessionAction action) {
   switch (action) {
     case MediaSessionAction::kPlay:
-      return play_action_name;
+      return V8MediaSessionAction::Enum::kPlay;
     case MediaSessionAction::kPause:
-      return pause_action_name;
+      return V8MediaSessionAction::Enum::kPause;
     case MediaSessionAction::kPreviousTrack:
-      return previous_track_action_name;
+      return V8MediaSessionAction::Enum::kPrevioustrack;
     case MediaSessionAction::kNextTrack:
-      return next_track_action_name;
+      return V8MediaSessionAction::Enum::kNexttrack;
     case MediaSessionAction::kSeekBackward:
-      return seek_backward_action_name;
+      return V8MediaSessionAction::Enum::kSeekbackward;
     case MediaSessionAction::kSeekForward:
-      return seek_forward_action_name;
+      return V8MediaSessionAction::Enum::kSeekforward;
     case MediaSessionAction::kSkipAd:
-      return skip_ad_action_name;
+      return V8MediaSessionAction::Enum::kSkipad;
     case MediaSessionAction::kStop:
-      return stop_action_name;
+      return V8MediaSessionAction::Enum::kStop;
     case MediaSessionAction::kSeekTo:
-      return seek_to_action_name;
+      return V8MediaSessionAction::Enum::kSeekto;
     case MediaSessionAction::kToggleMicrophone:
-      return toggle_microphone_action_name;
+      return V8MediaSessionAction::Enum::kTogglemicrophone;
     case MediaSessionAction::kToggleCamera:
-      return toggle_camera_action_name;
+      return V8MediaSessionAction::Enum::kTogglecamera;
     case MediaSessionAction::kHangUp:
-      return hang_up_action_name;
+      return V8MediaSessionAction::Enum::kHangup;
     case MediaSessionAction::kPreviousSlide:
-      return previous_slide_action_name;
+      return V8MediaSessionAction::Enum::kPreviousslide;
     case MediaSessionAction::kNextSlide:
-      return next_slide_action_name;
+      return V8MediaSessionAction::Enum::kNextslide;
     case MediaSessionAction::kEnterPictureInPicture:
-      return enter_picture_in_picture_action_name;
-    default:
-      NOTREACHED_IN_MIGRATION();
+      return V8MediaSessionAction::Enum::kEnterpictureinpicture;
+    case MediaSessionAction::kScrubTo:
+    case MediaSessionAction::kExitPictureInPicture:
+    case MediaSessionAction::kSwitchAudioDevice:
+    case MediaSessionAction::kEnterAutoPictureInPicture:
+    case MediaSessionAction::kSetMute:
+    case MediaSessionAction::kRaise:
+      NOTREACHED();
   }
-  return WTF::g_empty_atom;
+  NOTREACHED();
 }
 
-std::optional<MediaSessionAction> ActionNameToMojomAction(
-    const String& action_name) {
-  if ("play" == action_name)
-    return MediaSessionAction::kPlay;
-  if ("pause" == action_name)
-    return MediaSessionAction::kPause;
-  if ("previoustrack" == action_name)
-    return MediaSessionAction::kPreviousTrack;
-  if ("nexttrack" == action_name)
-    return MediaSessionAction::kNextTrack;
-  if ("seekbackward" == action_name)
-    return MediaSessionAction::kSeekBackward;
-  if ("seekforward" == action_name)
-    return MediaSessionAction::kSeekForward;
-  if ("skipad" == action_name)
-    return MediaSessionAction::kSkipAd;
-  if ("stop" == action_name)
-    return MediaSessionAction::kStop;
-  if ("seekto" == action_name)
-    return MediaSessionAction::kSeekTo;
-  if ("togglemicrophone" == action_name)
-    return MediaSessionAction::kToggleMicrophone;
-  if ("togglecamera" == action_name)
-    return MediaSessionAction::kToggleCamera;
-  if ("hangup" == action_name)
-    return MediaSessionAction::kHangUp;
-  if ("previousslide" == action_name)
-    return MediaSessionAction::kPreviousSlide;
-  if ("nextslide" == action_name)
-    return MediaSessionAction::kNextSlide;
-  if ("enterpictureinpicture" == action_name) {
-    return MediaSessionAction::kEnterPictureInPicture;
+MediaSessionAction ActionEnumToMojomAction(V8MediaSessionAction::Enum action) {
+  switch (action) {
+    case V8MediaSessionAction::Enum::kPlay:
+      return MediaSessionAction::kPlay;
+    case V8MediaSessionAction::Enum::kPause:
+      return MediaSessionAction::kPause;
+    case V8MediaSessionAction::Enum::kPrevioustrack:
+      return MediaSessionAction::kPreviousTrack;
+    case V8MediaSessionAction::Enum::kNexttrack:
+      return MediaSessionAction::kNextTrack;
+    case V8MediaSessionAction::Enum::kSeekbackward:
+      return MediaSessionAction::kSeekBackward;
+    case V8MediaSessionAction::Enum::kSeekforward:
+      return MediaSessionAction::kSeekForward;
+    case V8MediaSessionAction::Enum::kSkipad:
+      return MediaSessionAction::kSkipAd;
+    case V8MediaSessionAction::Enum::kStop:
+      return MediaSessionAction::kStop;
+    case V8MediaSessionAction::Enum::kSeekto:
+      return MediaSessionAction::kSeekTo;
+    case V8MediaSessionAction::Enum::kTogglemicrophone:
+      return MediaSessionAction::kToggleMicrophone;
+    case V8MediaSessionAction::Enum::kTogglecamera:
+      return MediaSessionAction::kToggleCamera;
+    case V8MediaSessionAction::Enum::kHangup:
+      return MediaSessionAction::kHangUp;
+    case V8MediaSessionAction::Enum::kPreviousslide:
+      return MediaSessionAction::kPreviousSlide;
+    case V8MediaSessionAction::Enum::kNextslide:
+      return MediaSessionAction::kNextSlide;
+    case V8MediaSessionAction::Enum::kEnterpictureinpicture:
+      return MediaSessionAction::kEnterPictureInPicture;
   }
-
-  NOTREACHED_IN_MIGRATION();
-  return std::nullopt;
+  NOTREACHED();
 }
 
-const AtomicString& MediaSessionPlaybackStateToString(
+V8MediaSessionPlaybackState::Enum MediaSessionPlaybackStateToEnum(
     mojom::blink::MediaSessionPlaybackState state) {
-  DEFINE_STATIC_LOCAL(const AtomicString, none_value, ("none"));
-  DEFINE_STATIC_LOCAL(const AtomicString, paused_value, ("paused"));
-  DEFINE_STATIC_LOCAL(const AtomicString, playing_value, ("playing"));
-
   switch (state) {
     case mojom::blink::MediaSessionPlaybackState::NONE:
-      return none_value;
+      return V8MediaSessionPlaybackState::Enum::kNone;
     case mojom::blink::MediaSessionPlaybackState::PAUSED:
-      return paused_value;
+      return V8MediaSessionPlaybackState::Enum::kPaused;
     case mojom::blink::MediaSessionPlaybackState::PLAYING:
-      return playing_value;
+      return V8MediaSessionPlaybackState::Enum::kPlaying;
   }
-  NOTREACHED_IN_MIGRATION();
-  return WTF::g_empty_atom;
+  NOTREACHED();
 }
 
-mojom::blink::MediaSessionPlaybackState StringToMediaSessionPlaybackState(
-    const String& state_name) {
-  if (state_name == "none")
-    return mojom::blink::MediaSessionPlaybackState::NONE;
-  if (state_name == "paused")
-    return mojom::blink::MediaSessionPlaybackState::PAUSED;
-  DCHECK_EQ(state_name, "playing");
-  return mojom::blink::MediaSessionPlaybackState::PLAYING;
+mojom::blink::MediaSessionPlaybackState EnumToMediaSessionPlaybackState(
+    const V8MediaSessionPlaybackState::Enum& state) {
+  switch (state) {
+    case V8MediaSessionPlaybackState::Enum::kNone:
+      return mojom::blink::MediaSessionPlaybackState::NONE;
+    case V8MediaSessionPlaybackState::Enum::kPaused:
+      return mojom::blink::MediaSessionPlaybackState::PAUSED;
+    case V8MediaSessionPlaybackState::Enum::kPlaying:
+      return mojom::blink::MediaSessionPlaybackState::PLAYING;
+  }
+  NOTREACHED();
 }
 
 }  // anonymous namespace
@@ -182,8 +160,9 @@
       service_(navigator.GetExecutionContext()),
       client_receiver_(this, navigator.DomWindow()) {}
 
-void MediaSession::setPlaybackState(const String& playback_state) {
-  playback_state_ = StringToMediaSessionPlaybackState(playback_state);
+void MediaSession::setPlaybackState(
+    const V8MediaSessionPlaybackState& playback_state) {
+  playback_state_ = EnumToMediaSessionPlaybackState(playback_state.AsEnum());
 
   RecalculatePositionState(/*was_set=*/false);
 
@@ -192,8 +171,9 @@
     service->SetPlaybackState(playback_state_);
 }
 
-String MediaSession::playbackState() {
-  return MediaSessionPlaybackStateToString(playback_state_);
+V8MediaSessionPlaybackState MediaSession::playbackState() {
+  return V8MediaSessionPlaybackState(
+      MediaSessionPlaybackStateToEnum(playback_state_));
 }
 
 void MediaSession::setMetadata(MediaMetadata* metadata) {
@@ -226,10 +206,11 @@
       MediaMetadataSanitizer::SanitizeAndConvertToMojo(metadata_, context));
 }
 
-void MediaSession::setActionHandler(const String& action,
+void MediaSession::setActionHandler(const V8MediaSessionAction& action,
                                     V8MediaSessionActionHandler* handler,
                                     ExceptionState& exception_state) {
-  if (action == "skipad") {
+  auto action_value = action.AsEnum();
+  if (action_value == V8MediaSessionAction::Enum::kSkipad) {
     LocalDOMWindow* window = GetSupplementable()->DomWindow();
     if (!RuntimeEnabledFeatures::SkipAdEnabled(window)) {
       exception_state.ThrowTypeError(
@@ -242,7 +223,7 @@
   }
 
   if (!RuntimeEnabledFeatures::MediaSessionEnterPictureInPictureEnabled()) {
-    if ("enterpictureinpicture" == action) {
+    if (action_value == V8MediaSessionAction::Enum::kEnterpictureinpicture) {
       exception_state.ThrowTypeError(
           "The provided value 'enterpictureinpicture'"
           " is not a valid enum "
@@ -252,19 +233,20 @@
   }
 
   if (handler) {
-    auto add_result = action_handlers_.Set(action, handler);
+    auto add_result = action_handlers_.Set(action_value, handler);
 
     if (!add_result.is_new_entry)
       return;
 
-    NotifyActionChange(action, ActionChangeType::kActionEnabled);
+    NotifyActionChange(action_value, ActionChangeType::kActionEnabled);
   } else {
-    if (action_handlers_.find(action) == action_handlers_.end())
+    if (action_handlers_.find(action_value) == action_handlers_.end()) {
       return;
+    }
 
-    action_handlers_.erase(action);
+    action_handlers_.erase(action_value);
 
-    NotifyActionChange(action, ActionChangeType::kActionDisabled);
+    NotifyActionChange(action_value, ActionChangeType::kActionDisabled);
   }
 }
 
@@ -358,21 +340,19 @@
   }
 }
 
-void MediaSession::NotifyActionChange(const String& action,
+void MediaSession::NotifyActionChange(V8MediaSessionAction::Enum action,
                                       ActionChangeType type) {
   mojom::blink::MediaSessionService* service = GetService();
   if (!service)
     return;
 
-  auto mojom_action = ActionNameToMojomAction(action);
-  DCHECK(mojom_action.has_value());
-
+  auto mojom_action = ActionEnumToMojomAction(action);
   switch (type) {
     case ActionChangeType::kActionEnabled:
-      service->EnableAction(mojom_action.value());
+      service->EnableAction(mojom_action);
       break;
     case ActionChangeType::kActionDisabled:
-      service->DisableAction(mojom_action.value());
+      service->DisableAction(mojom_action);
       break;
   }
 }
@@ -448,16 +428,16 @@
       window->GetFrame(),
       mojom::blink::UserActivationNotificationType::kInteraction);
 
-  auto& name = MojomActionToActionName(action);
+  auto v8_action = MojomActionToActionEnum(action);
 
-  auto iter = action_handlers_.find(name);
+  auto iter = action_handlers_.find(v8_action);
   if (iter == action_handlers_.end())
     return;
 
   const auto* blink_details =
       mojo::TypeConverter<const blink::MediaSessionActionDetails*,
                           blink::mojom::blink::MediaSessionActionDetailsPtr>::
-          ConvertWithActionName(details, name);
+          ConvertWithV8Action(details, v8_action);
 
   iter->value->InvokeAndReportException(this, blink_details);
 }
diff --git a/third_party/blink/renderer/modules/mediasession/media_session.h b/third_party/blink/renderer/modules/mediasession/media_session.h
index 3434af0b..d247bbc 100644
--- a/third_party/blink/renderer/modules/mediasession/media_session.h
+++ b/third_party/blink/renderer/modules/mediasession/media_session.h
@@ -8,6 +8,7 @@
 #include "base/memory/raw_ptr.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/public/mojom/mediasession/media_session.mojom-blink.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_action.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h"
@@ -30,6 +31,7 @@
 class MediaPositionState;
 class Navigator;
 class V8MediaSessionActionHandler;
+class V8MediaSessionPlaybackState;
 
 class MODULES_EXPORT MediaSession final
     : public ScriptWrappable,
@@ -42,13 +44,13 @@
   static MediaSession* mediaSession(Navigator&);
   explicit MediaSession(Navigator&);
 
-  void setPlaybackState(const String&);
-  String playbackState();
+  void setPlaybackState(const V8MediaSessionPlaybackState&);
+  V8MediaSessionPlaybackState playbackState();
 
   void setMetadata(MediaMetadata*);
   MediaMetadata* metadata() const;
 
-  void setActionHandler(const String& action,
+  void setActionHandler(const V8MediaSessionAction& action,
                         V8MediaSessionActionHandler*,
                         ExceptionState&);
 
@@ -73,7 +75,7 @@
     kActionDisabled,
   };
 
-  void NotifyActionChange(const String& action, ActionChangeType);
+  void NotifyActionChange(V8MediaSessionAction::Enum action, ActionChangeType);
 
   base::TimeDelta GetPositionNow() const;
 
@@ -92,7 +94,8 @@
   media_session::mojom::blink::MediaPositionPtr position_state_;
   double declared_playback_rate_ = 0.0;
   Member<MediaMetadata> metadata_;
-  HeapHashMap<String, Member<V8MediaSessionActionHandler>> action_handlers_;
+  HeapHashMap<V8MediaSessionAction::Enum, Member<V8MediaSessionActionHandler>>
+      action_handlers_;
   HeapMojoRemote<mojom::blink::MediaSessionService> service_;
   HeapMojoReceiver<blink::mojom::blink::MediaSessionClient, MediaSession>
       client_receiver_;
diff --git a/third_party/blink/renderer/modules/mediasession/media_session_test.cc b/third_party/blink/renderer/modules/mediasession/media_session_test.cc
index 55a5275..9f5879d 100644
--- a/third_party/blink/renderer/modules/mediasession/media_session_test.cc
+++ b/third_party/blink/renderer/modules/mediasession/media_session_test.cc
@@ -9,6 +9,7 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_media_position_state.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_playback_state.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/testing/page_test_base.h"
@@ -106,8 +107,8 @@
                                      exception_state);
   }
 
-  void SetPlaybackState(const String& state) {
-    media_session_->setPlaybackState(state);
+  void SetPlaybackState(V8MediaSessionPlaybackState::Enum state) {
+    media_session_->setPlaybackState(V8MediaSessionPlaybackState(state));
   }
 
   MockMediaSessionService& service() { return *mock_service_.get(); }
@@ -134,7 +135,7 @@
         loop.Quit();
       }));
 
-  SetPlaybackState("none");
+  SetPlaybackState(V8MediaSessionPlaybackState::Enum::kNone);
   SetPositionState(10, 5, 1.0);
   loop.Run();
 }
@@ -151,7 +152,7 @@
         loop.Quit();
       }));
 
-  SetPlaybackState("paused");
+  SetPlaybackState(V8MediaSessionPlaybackState::Enum::kPaused);
   SetPositionState(10, 5, 1.0);
   loop.Run();
 }
@@ -168,7 +169,7 @@
         loop.Quit();
       }));
 
-  SetPlaybackState("playing");
+  SetPlaybackState(V8MediaSessionPlaybackState::Enum::kPlaying);
   SetPositionState(10, 5, 1.0);
   loop.Run();
 }
@@ -185,13 +186,13 @@
         loop.Quit();
       }));
 
-  SetPlaybackState("none");
+  SetPlaybackState(V8MediaSessionPlaybackState::Enum::kNone);
   SetPositionState(std::numeric_limits<double>::infinity(), 5, 1.0);
   loop.Run();
 }
 
 TEST_F(MediaSessionTest, PlaybackPositionState_NaNDuration) {
-  SetPlaybackState("none");
+  SetPlaybackState(V8MediaSessionPlaybackState::Enum::kNone);
   SetPositionStateThrowsException(std::nan("10"), 5, 1.0);
 }
 
@@ -208,7 +209,7 @@
           loop.Quit();
         }));
 
-    SetPlaybackState("paused");
+    SetPlaybackState(V8MediaSessionPlaybackState::Enum::kPaused);
     SetPositionState(10, 5, 1.0);
     loop.Run();
   }
@@ -239,7 +240,7 @@
       }));
 
   SetPositionState(10, 5, 1.0);
-  SetPlaybackState("none");
+  SetPlaybackState(V8MediaSessionPlaybackState::Enum::kNone);
   loop.Run();
 }
 
@@ -274,7 +275,7 @@
           loop.Quit();
         }));
 
-    SetPlaybackState("paused");
+    SetPlaybackState(V8MediaSessionPlaybackState::Enum::kPaused);
     loop.Run();
   }
 
@@ -292,7 +293,7 @@
           loop.Quit();
         }));
 
-    SetPlaybackState("none");
+    SetPlaybackState(V8MediaSessionPlaybackState::Enum::kNone);
     loop.Run();
   }
 }
@@ -328,7 +329,7 @@
           loop.Quit();
         }));
 
-    SetPlaybackState("paused");
+    SetPlaybackState(V8MediaSessionPlaybackState::Enum::kPaused);
     loop.Run();
   }
 
@@ -346,7 +347,7 @@
           loop.Quit();
         }));
 
-    SetPlaybackState("playing");
+    SetPlaybackState(V8MediaSessionPlaybackState::Enum::kPlaying);
     loop.Run();
   }
 }
@@ -364,7 +365,7 @@
       }));
 
   SetPositionState(10, 5, 1.0);
-  SetPlaybackState("playing");
+  SetPlaybackState(V8MediaSessionPlaybackState::Enum::kPlaying);
   loop.Run();
 }
 
diff --git a/third_party/blink/renderer/modules/mediasession/media_session_type_converters.cc b/third_party/blink/renderer/modules/mediasession/media_session_type_converters.cc
index 52aeea55..2b1069a 100644
--- a/third_party/blink/renderer/modules/mediasession/media_session_type_converters.cc
+++ b/third_party/blink/renderer/modules/mediasession/media_session_type_converters.cc
@@ -9,10 +9,9 @@
 const blink::MediaSessionActionDetails*
 TypeConverter<const blink::MediaSessionActionDetails*,
               blink::mojom::blink::MediaSessionActionDetailsPtr>::
-    ConvertWithActionName(
+    ConvertWithV8Action(
         const blink::mojom::blink::MediaSessionActionDetailsPtr& details,
-        const WTF::AtomicString& action_name) {
-  DCHECK(!action_name.empty());
+        blink::V8MediaSessionAction::Enum action) {
   blink::MediaSessionActionDetails* blink_details;
 
   if (details && details->is_seek_to()) {
@@ -24,7 +23,7 @@
     blink_details = blink::MediaSessionActionDetails::Create();
   }
 
-  blink_details->setAction(action_name);
+  blink_details->setAction(action);
 
   return blink_details;
 }
diff --git a/third_party/blink/renderer/modules/mediasession/media_session_type_converters.h b/third_party/blink/renderer/modules/mediasession/media_session_type_converters.h
index 62baee8..ca2d6f1f 100644
--- a/third_party/blink/renderer/modules/mediasession/media_session_type_converters.h
+++ b/third_party/blink/renderer/modules/mediasession/media_session_type_converters.h
@@ -15,9 +15,9 @@
 template <>
 struct TypeConverter<const blink::MediaSessionActionDetails*,
                      blink::mojom::blink::MediaSessionActionDetailsPtr> {
-  static const blink::MediaSessionActionDetails* ConvertWithActionName(
+  static const blink::MediaSessionActionDetails* ConvertWithV8Action(
       const blink::mojom::blink::MediaSessionActionDetailsPtr& details,
-      const WTF::AtomicString& action_name);
+      blink::V8MediaSessionAction::Enum action);
 };
 
 template <>
diff --git a/third_party/blink/renderer/modules/notifications/notification_data.cc b/third_party/blink/renderer/modules/notifications/notification_data.cc
index 52d4391..96158a5 100644
--- a/third_party/blink/renderer/modules/notifications/notification_data.cc
+++ b/third_party/blink/renderer/modules/notifications/notification_data.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/modules/notifications/notification_data.h"
 
+#include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "third_party/blink/public/common/notifications/notification_constants.h"
 #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h"
@@ -25,24 +26,27 @@
 namespace {
 
 mojom::blink::NotificationDirection ToDirectionEnumValue(
-    const String& direction) {
-  if (direction == "ltr")
-    return mojom::blink::NotificationDirection::LEFT_TO_RIGHT;
-  if (direction == "rtl")
-    return mojom::blink::NotificationDirection::RIGHT_TO_LEFT;
-  if (direction == "auto")
-    return mojom::blink::NotificationDirection::AUTO;
-  NOTREACHED_IN_MIGRATION() << "Unknown direction: " << direction;
-  return mojom::blink::NotificationDirection::AUTO;
+    const V8NotificationDirection& direction) {
+  switch (direction.AsEnum()) {
+    case V8NotificationDirection::Enum::kLtr:
+      return mojom::blink::NotificationDirection::LEFT_TO_RIGHT;
+    case V8NotificationDirection::Enum::kRtl:
+      return mojom::blink::NotificationDirection::RIGHT_TO_LEFT;
+    case V8NotificationDirection::Enum::kAuto:
+      return mojom::blink::NotificationDirection::AUTO;
+  }
+  NOTREACHED();
 }
 
-mojom::blink::NotificationScenario ToScenarioEnumValue(const String& scenario) {
-  if (scenario == "default")
-    return mojom::blink::NotificationScenario::DEFAULT;
-  if (scenario == "incoming-call")
-    return mojom::blink::NotificationScenario::INCOMING_CALL;
-  NOTREACHED_IN_MIGRATION() << "Unknown scenario: " << scenario;
-  return mojom::blink::NotificationScenario::DEFAULT;
+mojom::blink::NotificationScenario ToScenarioEnumValue(
+    const V8NotificationScenario& scenario) {
+  switch (scenario.AsEnum()) {
+    case V8NotificationScenario::Enum::kDefault:
+      return mojom::blink::NotificationScenario::DEFAULT;
+    case V8NotificationScenario::Enum::kIncomingCall:
+      return mojom::blink::NotificationScenario::INCOMING_CALL;
+  }
+  NOTREACHED();
 }
 
 KURL CompleteURL(ExecutionContext* context, const String& string_url) {
diff --git a/third_party/blink/renderer/modules/payments/payment_request_event.idl b/third_party/blink/renderer/modules/payments/payment_request_event.idl
index 3e26c35..b1a2393 100644
--- a/third_party/blink/renderer/modules/payments/payment_request_event.idl
+++ b/third_party/blink/renderer/modules/payments/payment_request_event.idl
@@ -21,7 +21,7 @@
 
     [CallWith=ScriptState] Promise<WindowClient?> openWindow(USVString url);
     [CallWith=ScriptState, RaisesException] Promise<PaymentRequestDetailsUpdate?> changePaymentMethod(DOMString methodName, optional object? methodDetails = null);
-    [CallWith=ScriptState, RaisesException] void respondWith(Promise<PaymentResponse> response);
+    [CallWith=ScriptState, RaisesException] void respondWith(Promise<PaymentHandlerResponse> response);
     [CallWith=ScriptState, RaisesException] Promise<PaymentRequestDetailsUpdate?> changeShippingAddress(AddressInit shippingAddress);
     [CallWith=ScriptState, RaisesException] Promise<PaymentRequestDetailsUpdate?> changeShippingOption(DOMString shippingOption);
 };
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc
index 83b1643..3eeec56 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc
@@ -436,28 +436,12 @@
   buffered_amount_low_threshold_ = threshold;
 }
 
-String RTCDataChannel::binaryType() const {
-  switch (binary_type_) {
-    case kBinaryTypeBlob:
-      return "blob";
-    case kBinaryTypeArrayBuffer:
-      return "arraybuffer";
-  }
-  NOTREACHED_IN_MIGRATION();
-  return String();
+V8BinaryType RTCDataChannel::binaryType() const {
+  return V8BinaryType(binary_type_);
 }
 
-void RTCDataChannel::setBinaryType(const String& binary_type,
-                                   ExceptionState& exception_state) {
-  if (binary_type == "arraybuffer") {
-    binary_type_ = kBinaryTypeArrayBuffer;
-    return;
-  }
-  if (binary_type == "blob") {
-    binary_type_ = kBinaryTypeBlob;
-    return;
-  }
-  NOTREACHED();
+void RTCDataChannel::setBinaryType(const V8BinaryType& binary_type) {
+  binary_type_ = binary_type.AsEnum();
 }
 
 bool RTCDataChannel::ValidateSendLength(uint64_t length,
@@ -735,21 +719,23 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (buffer.binary) {
-    if (binary_type_ == kBinaryTypeBlob) {
-      auto blob_data = std::make_unique<BlobData>();
-      blob_data->AppendBytes(base::make_span(buffer.data));
-      uint64_t blob_size = blob_data->length();
-      auto* blob = MakeGarbageCollected<Blob>(
-          BlobDataHandle::Create(std::move(blob_data), blob_size));
-      DispatchEvent(*MessageEvent::Create(blob));
-      return;
+    switch (binary_type_) {
+      case V8BinaryType::Enum::kBlob: {
+        auto blob_data = std::make_unique<BlobData>();
+        blob_data->AppendBytes(base::make_span(buffer.data));
+        uint64_t blob_size = blob_data->length();
+        auto* blob = MakeGarbageCollected<Blob>(
+            BlobDataHandle::Create(std::move(blob_data), blob_size));
+        DispatchEvent(*MessageEvent::Create(blob));
+        return;
+      }
+      case V8BinaryType::Enum::kArraybuffer: {
+        DOMArrayBuffer* dom_buffer = DOMArrayBuffer::Create(buffer.data);
+        DispatchEvent(*MessageEvent::Create(dom_buffer));
+        return;
+      }
     }
-    if (binary_type_ == kBinaryTypeArrayBuffer) {
-      DOMArrayBuffer* dom_buffer = DOMArrayBuffer::Create(buffer.data);
-      DispatchEvent(*MessageEvent::Create(dom_buffer));
-      return;
-    }
-    NOTREACHED_IN_MIGRATION();
+    NOTREACHED();
   } else {
     String text =
         buffer.data.size() > 0
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.h b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.h
index 48d70fd..9a0879b 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.h
@@ -30,6 +30,7 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_checker.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_binary_type.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
 #include "third_party/blink/renderer/core/fileapi/file_error.h"
@@ -87,8 +88,8 @@
   unsigned bufferedAmountLowThreshold() const;
   void setBufferedAmountLowThreshold(unsigned);
 
-  String binaryType() const;
-  void setBinaryType(const String&, ExceptionState&);
+  V8BinaryType binaryType() const;
+  void setBinaryType(const V8BinaryType&);
 
   String priority() const;
 
@@ -197,8 +198,7 @@
   webrtc::DataChannelInterface::DataState state_ =
       webrtc::DataChannelInterface::kConnecting;
 
-  enum BinaryType { kBinaryTypeBlob, kBinaryTypeArrayBuffer };
-  BinaryType binary_type_ = kBinaryTypeArrayBuffer;
+  V8BinaryType::Enum binary_type_ = V8BinaryType::Enum::kArraybuffer;
 
   FRIEND_TEST_ALL_PREFIXES(RTCDataChannelTest, Open);
   FRIEND_TEST_ALL_PREFIXES(RTCDataChannelTest, Close);
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.idl b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.idl
index 547d2ba..39622b6f 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.idl
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.idl
@@ -55,7 +55,7 @@
              attribute EventHandler onclose;
     void close();
              attribute EventHandler onmessage;
-    [RaisesException=Setter] attribute BinaryType binaryType;
+    attribute BinaryType binaryType;
     [RaisesException] void send(USVString data);
     [RaisesException] void send(Blob data);
     [RaisesException] void send(ArrayBuffer data);
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
index 2e030b3..74a49a5c 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
@@ -234,13 +234,14 @@
   transport_ = transport;
 }
 
-String RTCRtpReceiver::TransceiverDirection() {
+V8RTCRtpTransceiverDirection RTCRtpReceiver::TransceiverDirection() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   // `transceiver_` is always initialized to a valid value.
   return transceiver_->direction();
 }
 
-String RTCRtpReceiver::TransceiverCurrentDirection() {
+std::optional<V8RTCRtpTransceiverDirection>
+RTCRtpReceiver::TransceiverCurrentDirection() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   // `transceiver_` is always initialized to a valid value.
   return transceiver_->currentDirection();
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.h b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.h
index 8abba4d..e15009a 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.h
@@ -13,6 +13,7 @@
 #include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_contributing_source.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_receive_parameters.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_synchronization_source.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_transceiver_direction.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
 #include "third_party/blink/renderer/modules/mediastream/media_stream.h"
 #include "third_party/blink/renderer/modules/mediastream/media_stream_track.h"
@@ -95,8 +96,8 @@
   void set_transceiver(RTCRtpTransceiver*);
   void set_transport(RTCDtlsTransport*);
 
-  String TransceiverDirection();
-  String TransceiverCurrentDirection();
+  V8RTCRtpTransceiverDirection TransceiverDirection();
+  std::optional<V8RTCRtpTransceiverDirection> TransceiverCurrentDirection();
 
   // ExecutionContextLifecycleObserver
   void ContextDestroyed() override;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_script_transform.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_script_transform.cc
index b5250348..59438b6 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_script_transform.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_script_transform.cc
@@ -55,8 +55,15 @@
   return event;
 }
 
-bool IsValidReceiverDirection(const String& direction) {
-  return (direction == "sendrecv" || direction == "recvonly");
+bool IsValidReceiverDirection(
+    std::optional<V8RTCRtpTransceiverDirection> direction) {
+  if (!direction.has_value()) {
+    return false;
+  }
+  return direction.value().AsEnum() ==
+             V8RTCRtpTransceiverDirection::Enum::kSendrecv ||
+         direction.value().AsEnum() ==
+             V8RTCRtpTransceiverDirection::Enum::kRecvonly;
 }
 
 }  // namespace
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver.cc
index cd1cc49..986eccae 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver.cc
@@ -19,70 +19,62 @@
 
 namespace {
 
-String TransceiverDirectionToString(
+V8RTCRtpTransceiverDirection::Enum TransceiverDirectionToEnum(
     const webrtc::RtpTransceiverDirection& direction) {
   switch (direction) {
     case webrtc::RtpTransceiverDirection::kSendRecv:
-      return "sendrecv";
+      return V8RTCRtpTransceiverDirection::Enum::kSendrecv;
     case webrtc::RtpTransceiverDirection::kSendOnly:
-      return "sendonly";
+      return V8RTCRtpTransceiverDirection::Enum::kSendonly;
     case webrtc::RtpTransceiverDirection::kRecvOnly:
-      return "recvonly";
+      return V8RTCRtpTransceiverDirection::Enum::kRecvonly;
     case webrtc::RtpTransceiverDirection::kInactive:
-      return "inactive";
+      return V8RTCRtpTransceiverDirection::Enum::kInactive;
     case webrtc::RtpTransceiverDirection::kStopped:
-      return "stopped";
-    default:
-      NOTREACHED_IN_MIGRATION();
-      return String();
+      return V8RTCRtpTransceiverDirection::Enum::kStopped;
   }
+  NOTREACHED();
 }
 
-String OptionalTransceiverDirectionToString(
+std::optional<V8RTCRtpTransceiverDirection::Enum>
+OptionalTransceiverDirectionToEnum(
     const std::optional<webrtc::RtpTransceiverDirection>& direction) {
-  return direction ? TransceiverDirectionToString(*direction)
-                   : String();  // null
+  if (!direction) {
+    return std::nullopt;
+  }
+  return TransceiverDirectionToEnum(*direction);
 }
 
-bool TransceiverDirectionFromString(
-    const String& direction_string,
+bool TransceiverDirectionFromEnum(
+    V8RTCRtpTransceiverDirection::Enum direction,
     std::optional<webrtc::RtpTransceiverDirection>* direction_out) {
-  if (!direction_string) {
-    *direction_out = std::nullopt;
-    return true;
+  switch (direction) {
+    case V8RTCRtpTransceiverDirection::Enum::kSendrecv:
+      *direction_out = webrtc::RtpTransceiverDirection::kSendRecv;
+      return true;
+    case V8RTCRtpTransceiverDirection::Enum::kSendonly:
+      *direction_out = webrtc::RtpTransceiverDirection::kSendOnly;
+      return true;
+    case V8RTCRtpTransceiverDirection::Enum::kRecvonly:
+      *direction_out = webrtc::RtpTransceiverDirection::kRecvOnly;
+      return true;
+    case V8RTCRtpTransceiverDirection::Enum::kInactive:
+      *direction_out = webrtc::RtpTransceiverDirection::kInactive;
+      return true;
+    case V8RTCRtpTransceiverDirection::Enum::kStopped:
+      return false;
   }
-  if (direction_string == "sendrecv") {
-    *direction_out = webrtc::RtpTransceiverDirection::kSendRecv;
-    return true;
-  }
-  if (direction_string == "sendonly") {
-    *direction_out = webrtc::RtpTransceiverDirection::kSendOnly;
-    return true;
-  }
-  if (direction_string == "recvonly") {
-    *direction_out = webrtc::RtpTransceiverDirection::kRecvOnly;
-    return true;
-  }
-  if (direction_string == "inactive") {
-    *direction_out = webrtc::RtpTransceiverDirection::kInactive;
-    return true;
-  }
-  return false;
+  NOTREACHED();
 }
 
-bool OptionalTransceiverDirectionFromStringWithStopped(
-    const String& direction_string,
+bool OptionalTransceiverDirectionFromEnumWithStopped(
+    V8RTCRtpTransceiverDirection::Enum direction,
     std::optional<webrtc::RtpTransceiverDirection>* direction_out) {
-  if (direction_string == "stopped") {
+  if (direction == V8RTCRtpTransceiverDirection::Enum::kStopped) {
     *direction_out = webrtc::RtpTransceiverDirection::kStopped;
     return true;
   }
-  std::optional<webrtc::RtpTransceiverDirection> base_direction;
-  bool result =
-      TransceiverDirectionFromString(direction_string, &base_direction);
-  if (base_direction)
-    *direction_out = *base_direction;
-  return result;
+  return TransceiverDirectionFromEnum(direction, direction_out);
 }
 
 }  // namespace
@@ -94,7 +86,7 @@
   webrtc::RtpTransceiverInit webrtc_init;
   std::optional<webrtc::RtpTransceiverDirection> direction;
   if (init->hasDirection() &&
-      TransceiverDirectionFromString(init->direction(), &direction) &&
+      TransceiverDirectionFromEnum(init->direction().AsEnum(), &direction) &&
       direction) {
     webrtc_init.direction = *direction;
   }
@@ -144,17 +136,18 @@
 bool RTCRtpTransceiver::stopped() const {
   // Non-standard attribute reflecting being "stopping", whether or not we are
   // "stopped" per current_direction_.
-  return direction_ == "stopped";
+  return direction_ == V8RTCRtpTransceiverDirection::Enum::kStopped;
 }
 
-String RTCRtpTransceiver::direction() const {
-  return direction_;
+V8RTCRtpTransceiverDirection RTCRtpTransceiver::direction() const {
+  return V8RTCRtpTransceiverDirection(direction_);
 }
 
-void RTCRtpTransceiver::setDirection(String direction,
-                                     ExceptionState& exception_state) {
+void RTCRtpTransceiver::setDirection(
+    const V8RTCRtpTransceiverDirection& direction,
+    ExceptionState& exception_state) {
   std::optional<webrtc::RtpTransceiverDirection> webrtc_direction;
-  if (!TransceiverDirectionFromString(direction, &webrtc_direction) ||
+  if (!TransceiverDirectionFromEnum(direction.AsEnum(), &webrtc_direction) ||
       !webrtc_direction) {
     exception_state.ThrowTypeError("Invalid RTCRtpTransceiverDirection.");
     return;
@@ -164,12 +157,12 @@
                                       "The peer connection is closed.");
     return;
   }
-  if (current_direction_ == "stopped") {
+  if (current_direction_ == V8RTCRtpTransceiverDirection::Enum::kStopped) {
     exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
                                       "The transceiver is stopped.");
     return;
   }
-  if (direction_ == "stopped") {
+  if (direction_ == V8RTCRtpTransceiverDirection::Enum::kStopped) {
     exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
                                       "The transceiver is stopping.");
     return;
@@ -183,20 +176,24 @@
   UpdateMembers();
 }
 
-String RTCRtpTransceiver::currentDirection() const {
-  return current_direction_;
+std::optional<V8RTCRtpTransceiverDirection>
+RTCRtpTransceiver::currentDirection() const {
+  if (!current_direction_) {
+    return std::nullopt;
+  }
+  return V8RTCRtpTransceiverDirection(current_direction_.value());
 }
 
 void RTCRtpTransceiver::UpdateMembers() {
-  if (current_direction_ == "stopped") {
+  if (current_direction_ == V8RTCRtpTransceiverDirection::Enum::kStopped) {
     // No need to update, stopped is a permanent state. Also: on removal, the
     // state of `platform_transceiver_` becomes obsolete and may not reflect
     // being stopped, so let's not update the members anymore.
     return;
   }
   mid_ = platform_transceiver_->Mid();
-  direction_ = TransceiverDirectionToString(platform_transceiver_->Direction());
-  current_direction_ = OptionalTransceiverDirectionToString(
+  direction_ = TransceiverDirectionToEnum(platform_transceiver_->Direction());
+  current_direction_ = OptionalTransceiverDirectionToEnum(
       platform_transceiver_->CurrentDirection());
   fired_direction_ = platform_transceiver_->FiredDirection();
 }
@@ -205,9 +202,9 @@
   receiver_->set_streams(MediaStreamVector());
   mid_ = String();
   direction_ =
-      TransceiverDirectionToString(webrtc::RtpTransceiverDirection::kStopped);
+      TransceiverDirectionToEnum(webrtc::RtpTransceiverDirection::kStopped);
   current_direction_ =
-      TransceiverDirectionToString(webrtc::RtpTransceiverDirection::kStopped);
+      TransceiverDirectionToEnum(webrtc::RtpTransceiverDirection::kStopped);
   fired_direction_ = webrtc::RtpTransceiverDirection::kStopped;
 }
 
@@ -329,8 +326,8 @@
     }
 
     std::optional<webrtc::RtpTransceiverDirection> direction;
-    if (!OptionalTransceiverDirectionFromStringWithStopped(hdr_ext->direction(),
-                                                           &direction) ||
+    if (!OptionalTransceiverDirectionFromEnumWithStopped(
+            hdr_ext->direction().AsEnum(), &direction) ||
         !direction) {
       exception_state.ThrowTypeError("Invalid RTCRtpTransceiverDirection.");
       return;
@@ -360,7 +357,7 @@
   HeapVector<Member<RTCRtpHeaderExtensionCapability>> exts;
   for (const auto& webrtc_ext : webrtc_exts) {
     auto* ext = MakeGarbageCollected<RTCRtpHeaderExtensionCapability>();
-    ext->setDirection(TransceiverDirectionToString(webrtc_ext.direction));
+    ext->setDirection(TransceiverDirectionToEnum(webrtc_ext.direction));
     ext->setUri(webrtc_ext.uri.c_str());
     exts.push_back(ext);
   }
@@ -373,7 +370,7 @@
   HeapVector<Member<RTCRtpHeaderExtensionCapability>> exts;
   for (const auto& webrtc_ext : webrtc_exts) {
     auto* ext = MakeGarbageCollected<RTCRtpHeaderExtensionCapability>();
-    ext->setDirection(TransceiverDirectionToString(webrtc_ext.direction));
+    ext->setDirection(TransceiverDirectionToEnum(webrtc_ext.direction));
     ext->setUri(webrtc_ext.uri.c_str());
     exts.push_back(ext);
   }
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver.h b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver.h
index 0206e30..d08d2dc 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver.h
@@ -8,6 +8,7 @@
 #include <optional>
 
 #include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_codec_capability.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_transceiver_direction.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtp_transceiver_init.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
@@ -45,9 +46,10 @@
   RTCRtpReceiver* receiver() const;
   bool stopped() const;
   // Enum type RTCRtpTransceiverDirection
-  String direction() const;
-  void setDirection(String direction, ExceptionState&);
-  String currentDirection() const;
+  V8RTCRtpTransceiverDirection direction() const;
+  void setDirection(const V8RTCRtpTransceiverDirection& direction,
+                    ExceptionState&);
+  std::optional<V8RTCRtpTransceiverDirection> currentDirection() const;
   void stop(ExceptionState&);
   void setCodecPreferences(
       const HeapVector<Member<RTCRtpCodecCapability>>& codecs,
@@ -89,8 +91,8 @@
   Member<RTCRtpSender> sender_;
   Member<RTCRtpReceiver> receiver_;
   String mid_;
-  String direction_;
-  String current_direction_;
+  V8RTCRtpTransceiverDirection::Enum direction_;
+  std::optional<V8RTCRtpTransceiverDirection::Enum> current_direction_;
   std::optional<webrtc::RtpTransceiverDirection> fired_direction_;
 };
 
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_session_description.cc b/third_party/blink/renderer/modules/peerconnection/rtc_session_description.cc
index 4d52dcd..cbecaf1 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_session_description.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_session_description.cc
@@ -44,7 +44,7 @@
     const RTCSessionDescriptionInit* description_init_dict) {
   String type;
   if (description_init_dict->hasType())
-    type = description_init_dict->type();
+    type = String(description_init_dict->type());
   else
     UseCounter::Count(context, WebFeature::kRTCSessionDescriptionInitNoType);
 
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet_global_scope.cc b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet_global_scope.cc
index 5818579..05ce62e 100644
--- a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet_global_scope.cc
+++ b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet_global_scope.cc
@@ -428,7 +428,7 @@
     return;
   }
 
-  v8::Maybe<ScriptPromiseUntyped> result = registered_run_function->Invoke(
+  v8::Maybe<ScriptPromise<IDLAny>> result = registered_run_function->Invoke(
       instance.Get(isolate), urls_param, *data_param);
 
   if (try_catch.HasCaught()) {
@@ -449,7 +449,7 @@
   auto* unresolved_request = MakeGarbageCollected<UnresolvedSelectURLRequest>(
       urls.size(), std::move(combined_operation_completion_cb));
 
-  ScriptPromiseUntyped promise = result.FromJust();
+  ScriptPromise<IDLAny> promise = result.FromJust();
 
   auto* success_callback = MakeGarbageCollected<ScriptFunction>(
       script_state, MakeGarbageCollected<SelectURLResolutionSuccessCallback>(
@@ -504,7 +504,7 @@
     return;
   }
 
-  v8::Maybe<ScriptPromiseUntyped> result =
+  v8::Maybe<ScriptPromise<IDLAny>> result =
       registered_run_function->Invoke(instance.Get(isolate), *data_param);
 
   if (try_catch.HasCaught()) {
@@ -523,7 +523,7 @@
   auto* unresolved_request = MakeGarbageCollected<UnresolvedRunRequest>(
       std::move(combined_operation_completion_cb));
 
-  ScriptPromiseUntyped promise = result.FromJust();
+  ScriptPromise<IDLAny> promise = result.FromJust();
 
   auto* success_callback = MakeGarbageCollected<ScriptFunction>(
       script_state,
diff --git a/third_party/blink/renderer/modules/smart_card/smart_card_connection.cc b/third_party/blink/renderer/modules/smart_card/smart_card_connection.cc
index 0b3db7cc..9619943 100644
--- a/third_party/blink/renderer/modules/smart_card/smart_card_connection.cc
+++ b/third_party/blink/renderer/modules/smart_card/smart_card_connection.cc
@@ -99,7 +99,7 @@
                                    v8::ExceptionContext::kOperation,
                                    "SmartCardConnection", "startTransaction");
 
-    if (value.IsUndefined()) {
+    if (value.IsUndefined() || value.IsNull()) {
       connection_->OnTransactionCallbackDone(SmartCardDisposition::kReset);
       return ScriptValue();
     }
@@ -685,8 +685,7 @@
 
   ScriptState::Scope scope(script_state);
   v8::TryCatch try_catch(script_state->GetIsolate());
-  v8::Maybe<ScriptPromiseUntyped> transaction_result =
-      transaction_callback->Invoke(nullptr);
+  auto transaction_result = transaction_callback->Invoke(nullptr);
 
   if (transaction_result.IsNothing()) {
     if (try_catch.HasCaught()) {
@@ -702,7 +701,7 @@
     return;
   }
 
-  ScriptPromiseUntyped promise = transaction_result.FromJust();
+  auto promise = transaction_result.FromJust();
   promise.Then(MakeGarbageCollected<ScriptFunction>(
                    script_state,
                    MakeGarbageCollected<TransactionFulfilledFunction>(this)),
diff --git a/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc b/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc
index 6ffc6ec..c2675e5 100644
--- a/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc
+++ b/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc
@@ -245,13 +245,13 @@
       std::move(callback).Run();
     };
 
-    const auto& mailbox = dst_frame->mailbox_holder(0).mailbox;
+    const auto mailbox = dst_frame->mailbox_holder(0).mailbox;
     sii->CopyToGpuMemoryBufferAsync(
         blit_done_sync_token, mailbox,
         base::BindOnce(std::move(copy_to_gmb_done_lambda),
                        std::move(callback)));
   } else {
-    const auto& mailbox = dst_frame->mailbox_holder(/*plane=*/0).mailbox;
+    const auto mailbox = dst_frame->mailbox_holder(/*texture_index=*/0).mailbox;
     sii->CopyToGpuMemoryBuffer(blit_done_sync_token, mailbox);
   }
 
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests
index 3327a21..5d5d864c 100644
--- a/third_party/blink/web_tests/SlowTests
+++ b/third_party/blink/web_tests/SlowTests
@@ -1487,3 +1487,8 @@
 
 # Slow because it contains a large number of subtests
 crbug.com/369600187 external/wpt/css/css-anchor-position/anchor-size-parse-valid.html [ Slow ]
+
+# Slow because it needs to run wait for up to 100 updates, one of which will
+# introduce a 5-10s delay until the following one.
+crbug.com/370726578 external/wpt/compute-pressure/compute_pressure_rate_obfuscation_mitigation_triggered.https.window.html?globalScope=dedicated_worker [ Slow ]
+crbug.com/370726578 external/wpt/compute-pressure/compute_pressure_rate_obfuscation_mitigation_triggered.https.window.html?globalScope=window [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index a2a5e71..45c477d 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2619,6 +2619,7 @@
 crbug.com/370032367 virtual/media-foundation-for-clear-dcomp/external/wpt/media-source/last-frame-dimensions.html [ Timeout ]
 crbug.com/369652659 [ Mac15-arm64 ] external/wpt/webrtc/RTCPeerConnection-getStats-timestamp.https.html [ Skip Timeout ]
 crbug.com/369652659 [ Mac15 ] external/wpt/webrtc/RTCPeerConnection-getStats-timestamp.https.html [ Skip Timeout ]
+crbug.com/369956891 [ Mac12 ] virtual/threaded/external/wpt/css/css-backgrounds/background-size/vector/tall--auto--percent-width-nonpercent-height.html [ Failure ]
 crbug.com/369956891 [ Mac14 ] virtual/threaded/external/wpt/css/css-backgrounds/background-size/vector/tall--auto--percent-width-nonpercent-height.html [ Failure ]
 crbug.com/369956891 [ Mac14 ] virtual/threaded/external/wpt/css/css-backgrounds/background-size/vector/tall--cover--height.html [ Failure ]
 crbug.com/369956891 [ Mac14 ] virtual/threaded/external/wpt/css/css-backgrounds/background-size/vector/wide--12px-auto--percent-width-percent-height.html [ Failure ]
@@ -2633,10 +2634,13 @@
 crbug.com/369685643 [ Mac12 ] virtual/view-transition-mpa-serialization/external/wpt/css/css-view-transitions/animating-new-content-subset.html [ Failure ]
 crbug.com/369685643 [ Mac14 ] virtual/view-transition-mpa-serialization/external/wpt/css/css-view-transitions/animating-new-content-subset.html [ Failure ]
 crbug.com/369668292 [ Mac12 ] virtual/threaded/external/wpt/css/css-view-transitions/animating-new-content-subset.html [ Failure ]
+crbug.com/369668292 [ Mac13 ] virtual/threaded/external/wpt/css/css-view-transitions/animating-new-content-subset.html [ Failure ]
+crbug.com/369668292 [ Mac14 ] virtual/threaded/external/wpt/css/css-view-transitions/animating-new-content-subset.html [ Failure ]
 crbug.com/369236541 external/wpt/css/css-text-decor/text-underline-position-auto-001.html [ Failure ]
 crbug.com/369236542 [ Mac13-arm64 ] virtual/fsa-incognito/external/wpt/fs/FileSystemDirectoryHandle-getDirectoryHandle.https.any.worker.html [ Timeout ]
 crbug.com/369270133 [ Mac12 ] virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/animating-new-content-subset.html [ Failure ]
 crbug.com/369270133 [ Mac14 ] virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/animating-new-content-subset.html [ Failure ]
+crbug.com/369270133 [ Mac15 ] virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/animating-new-content-subset.html [ Failure ]
 crbug.com/368657256 external/wpt/css/css-text-decor/text-emphasis-position-auto-001.html [ Failure ]
 crbug.com/368512272 [ Mac12 ] external/wpt/fs/FileSystemDirectoryHandle-getDirectoryHandle.https.any.worker.html [ Timeout ]
 crbug.com/368512272 [ Mac12 ] external/wpt/fs/FileSystemDirectoryHandle-getDirectoryHandle.https.any.html [ Failure Pass ]
@@ -7070,7 +7074,6 @@
 crbug.com/40943541 [ Win11-arm64 ] external/wpt/webtransport/echo-large-bidirectional-streams.https.any.html [ Failure Pass Timeout ] # Flaky
 crbug.com/326123178 accessibility/selection-change-notification-on-selection-removed.html [ Failure Pass Timeout ] # Flaky
 crbug.com/326123298 virtual/third-party-cookie-phaseout-enabled/external/wpt/cookies/third-party-cookies/third-party-cookie-heuristics.tentative.https.html [ Failure Pass Timeout ]
-crbug.com/40899204 accessibility/scroll-div-horiz-sends-notification.html [ Failure Pass Timeout ] # Flaky
 
 # Flaky tests: 2024-02-21
 crbug.com/40271908 virtual/fenced-frame-mparch/external/wpt/fenced-frame/navigate-ancestor-top-level-fenced-frame.https.html [ Failure Pass Timeout ] # Flaky
diff --git a/third_party/blink/web_tests/accessibility/scroll-div-horiz-sends-notification.html b/third_party/blink/web_tests/accessibility/scroll-div-horiz-sends-notification.html
deleted file mode 100644
index 05afb57..0000000
--- a/third_party/blink/web_tests/accessibility/scroll-div-horiz-sends-notification.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-  <script src="../resources/testharness.js"></script>
-  <script src="../resources/testharnessreport.js"></script>
-<style>
-.container {
-  padding: 100px;
-  margin: 100px;
-  border: 1px solid #000;
-  height: 900px;
-  overflow: scroll;
-}
-.inner {
-  width: 2000px;
-}
-.bigbutton {
-  display:inline-block;
-  width: 600px;
-  height: 600px;
-}
-</style>
-</head>
-<body>
-
-<div id="container" class="container">
-    <div class="inner">
-        <button class="bigbutton">One</button>
-        <button class="bigbutton">Two</button>
-        <button class="bigbutton">Three</button>
-    </div>
-</div>
-
-<script>
-
-async_test((t) => {
-  var container = document.getElementById('container');
-
-  accessibilityController.addNotificationListener(t.step_func((target, notification) => {
-    if (target.role == 'AXRole: AXGenericContainer') {
-      console.log('Got notification on container div');
-      assert_equals(container.scrollLeft, 500);
-      t.done();
-    }
-  }));
-
-  window.setTimeout(function() {
-    container.scrollLeft = 500;
-  }, 0);
-
-  window.setTimeout(t.step_func_done(() => {
-    assert_unreached();
-  }), 200);
-}, "This test ensures that scrolling the window sends a notification.");
-
-</script>
-
-</body>
-</html>
diff --git a/third_party/blink/web_tests/accessibility/scroll-div-sends-notification.html b/third_party/blink/web_tests/accessibility/scroll-div-sends-notification.html
deleted file mode 100644
index 53f292c..0000000
--- a/third_party/blink/web_tests/accessibility/scroll-div-sends-notification.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<style>
-.container {
-  padding: 100px;
-  margin: 100px;
-  border: 1px solid #000;
-  height: 900px;
-  overflow: scroll;
-}
-.bigbutton {
-  display:block;
-  width: 600px;
-  height: 600px;
-}
-</style>
-</head>
-<body>
-
-<div id="container" class="container" role="group">
-    <button class="bigbutton">One</button>
-    <button class="bigbutton">Two</button>
-    <button class="bigbutton">Three</button>
-</div>
-
-<script>
-
-function scrollPromise(scroller, scrollPosition) {
-  return new Promise(resolve => {
-    scroller.addEventListener('scrollend', resolve, { once: true });
-    // Ensure page is rendered before adjusting the scroll position.
-    requestAnimationFrame(() => {
-      requestAnimationFrame(() => {
-        scroller.scrollTop = scrollPosition;
-      });
-    });
-  });
-}
-
-function scrollNotificationPromise(expectedScroll) {
-  return new Promise(resolve => {
-    accessibilityController.addNotificationListener(target => {
-      if (target.role == 'AXRole: AXGroup' &&
-          target.scrollY() == expectedScroll) {
-        accessibilityController.removeNotificationListener();
-        resolve();
-      }
-    });
-  });
-}
-
-promise_test(async (t) => {
-  const container = document.getElementById('container');
-  const scrollPosition = 500;
-  return Promise.all([
-    scrollNotificationPromise(scrollPosition),
-    scrollPromise(container, scrollPosition)
-  ]).then(results => {
-    assert_equals(container.scrollTop, scrollPosition);
-  });
-}, "This test ensures that scrolling the window sends a notification.");
-
-</script>
-
-</body>
-</html>
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index d91598d..aadfc0d 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -304952,7 +304952,7 @@
      []
     ],
     "README.md": [
-     "2b92e470ac19b59777ee39b82ebd7b3bd85763f1",
+     "2f23e76b6fa01fcd4edd8a287a8cc10b3b501054",
      []
     ],
     "WEB_FEATURES.yml": [
@@ -304986,10 +304986,6 @@
       "90ed0a78576edc041caaa2ae70c319837152b726",
       []
      ],
-     "pressure-helpers.js": [
-      "5234cf2d78c90d559d3cfd8ee1b86d9b3fa97861",
-      []
-     ],
      "support-iframe.html": [
       "6b2b3097926b192df23c3e21dd19742bb19e69d4",
       []
@@ -368675,7 +368671,7 @@
    "fledge": {
     "tentative": {
      "TODO": [
-      "09cda1beb54c1430941b5e3b9042d66ff5329784",
+      "e05fe65911d4154f3e8bee9214b21e0ec64ba3af",
       []
      ],
      "auction-config-passed-to-worklets.https.window_1-5-expected.txt": [
@@ -368807,6 +368803,14 @@
        "dea8427266f1245e297795a69538b3a4f0007af2",
        []
       ],
+      "service-worker-helper.js": [
+       "cc00181359740b51f83c3289cfc215252123b67e",
+       []
+      ],
+      "service-worker-helper.js.headers": [
+       "98dfc8c8674edc62c4f6498a0b2a97c25447de96",
+       []
+      ],
       "set-cookie.asis": [
        "96d9f07c578c34085dd789d2a11b37cd4a51c42c",
        []
@@ -390148,7 +390152,7 @@
      []
     ],
     "audio-session.idl": [
-     "f542347c710143e6003e96907c989614a40c701a",
+     "7fd75024ee8fa5c505955a4dfc581eb8d774b97b",
      []
     ],
     "autoplay-detection.idl": [
@@ -390656,7 +390660,7 @@
      []
     ],
     "mediacapture-viewport.idl": [
-     "a9dcf74e17cdf38d3d3cea8c7323c510d07653a1",
+     "c4d1892b0b9932a034b15caa8f80d3f16f096f5f",
      []
     ],
     "mediaqueries-5.idl": [
@@ -390664,7 +390668,7 @@
      []
     ],
     "mediasession.idl": [
-     "00bfe6ad21649d719511537db4f4ee046f8086b1",
+     "5c6942be5a0786234d5f9fddaa302c98c8d92f97",
      []
     ],
     "mediastream-recording.idl": [
@@ -390692,7 +390696,7 @@
      []
     ],
     "observable.idl": [
-     "b0f0949a23a09700c08911f3ee4719d0752cdc2b",
+     "55bdbb21e417d6abd10963e82587c9416b689adb",
      []
     ],
     "observable.tentative.idl": [
@@ -390884,7 +390888,7 @@
      []
     ],
     "selection-api.idl": [
-     "a84536ab0f58bbb45a210870a6b9873c37df20e1",
+     "49d718d0777ae4aba36c39b0945d6fb0065e6bf7",
      []
     ],
     "serial.idl": [
@@ -390896,7 +390900,7 @@
      []
     ],
     "service-workers.idl": [
-     "87d48398f72b540b14544165ca7216a0090d79f6",
+     "d9ff2f651f8235968dd29bd6d7f86e9e8fdcb4cf",
      []
     ],
     "shape-detection-api.idl": [
@@ -390904,7 +390908,7 @@
      []
     ],
     "shared-storage.idl": [
-     "6f8e92708881f0bc496b093939c006a5ec712e12",
+     "85906bedbcff138cc1bf940a77a6485b695a6715",
      []
     ],
     "speech-api.idl": [
@@ -390952,7 +390956,7 @@
      []
     ],
     "turtledove.idl": [
-     "77360d0dd10d8a8bf584b6d6939479bce2c1b5c2",
+     "ff48d311914e49e9de8a96f7ac3a26da144da818",
      []
     ],
     "ua-client-hints.idl": [
@@ -391096,7 +391100,7 @@
      []
     ],
     "webgpu.idl": [
-     "74021895a8f740c71cbb048a8089186a2ca77d86",
+     "421685c7a8fe4516e5e0b803f617181650d1d62a",
      []
     ],
     "webhid.idl": [
@@ -391112,7 +391116,7 @@
      []
     ],
     "webnn.idl": [
-     "9a71f73954cd1dc99e157c7d60571632959dbf2f",
+     "8329e7d2b33eec5ffe030e9f1b826b5276d6088a",
      []
     ],
     "webrtc-encoded-transform.idl": [
@@ -391140,7 +391144,7 @@
      []
     ],
     "webrtc.idl": [
-     "32500f9a5600b03372ea438ad42e4a8f9fcb9cb6",
+     "174ead6261c6c28eac7bd9dd5a1feb374d521b4d",
      []
     ],
     "websockets.idl": [
@@ -391631,7 +391635,7 @@
     ]
    },
    "lint.ignore": [
-    "62ad931cb83b0fb0681f02f92b24ffd895973663",
+    "3e1d05be28de3836888b62d527ebc4a0781397b1",
     []
    ],
    "loading": {
@@ -396990,6 +396994,10 @@
       "360e6686bfb65ed33d811d15e1ba7183a736d552",
       []
      ],
+     "green.png": [
+      "28a1faab37797ef39454aa1deac1b470712f7be4",
+      []
+     ],
      "link-header-referrer-policy.html": [
       "dd2144d5075c68c3ad6d6c7ea393b8f58c24e057",
       []
@@ -399584,14 +399592,6 @@
       "c9980e1285b7e14a85cba19f2c870f480e303946",
       []
      ],
-     "mock-pressure-service.js": [
-      "610d02a9164ce5aba99e0cd20e37321c054af252",
-      []
-     ],
-     "mock-pressure-service.js.headers": [
-      "6805c323df5a975231648b830e33ce183c3cbbd3",
-      []
-     ],
      "mock-subapps.js": [
       "b81936713b17db941ef380d4019cecfbe563caf6",
       []
@@ -401402,7 +401402,7 @@
      ]
     },
     "idlharness.https.any.serviceworker-expected.txt": [
-     "3857e59ccc797418d1d158563d3c25d1242ce2b4",
+     "d6b8ea51c60c4ae9ceaa43a320193775e51656e1",
      []
     ],
     "idlharness.https.any.sharedworker-expected.txt": [
@@ -444653,7 +444653,7 @@
    },
    "compute-pressure": {
     "compute_pressure_basic.https.window.js": [
-     "ff50ef4e5613a7154d601699da7b3387a26256fe",
+     "a120f97a403621c9baa6c2769f5989f7bfadd43d",
      [
       "compute-pressure/compute_pressure_basic.https.window.html?globalScope=dedicated_worker",
       {
@@ -444735,248 +444735,327 @@
       }
      ]
     ],
-    "compute_pressure_detached_iframe.https.html": [
-     "6123521248cb7f6d6368bf916c1004f6a84dd5db",
+    "compute_pressure_detached_iframe.https.window.js": [
+     "a43d6b0fc2dc7ed0263dbf3bde7c242dc421cea4",
      [
-      null,
-      {}
-     ]
-    ],
-    "compute_pressure_disconnect.https.any.js": [
-     "f8bc3fb357811a35201b30f86361846452b15faf",
-     [
-      "compute-pressure/compute_pressure_disconnect.https.any.html",
+      "compute-pressure/compute_pressure_detached_iframe.https.window.html?globalScope=window",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
-        ],
-        [
-         "global",
-         "window,dedicatedworker,sharedworker"
-        ]
-       ]
-      }
-     ],
-     [
-      "compute-pressure/compute_pressure_disconnect.https.any.sharedworker.html",
-      {
-       "script_metadata": [
-        [
-         "script",
-         "/resources/test-only-api.js"
+         "/resources/testdriver.js"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
-        ],
-        [
-         "global",
-         "window,dedicatedworker,sharedworker"
-        ]
-       ]
-      }
-     ],
-     [
-      "compute-pressure/compute_pressure_disconnect.https.any.worker.html",
-      {
-       "script_metadata": [
-        [
-         "script",
-         "/resources/test-only-api.js"
+         "/resources/testdriver-vendor.js"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/common/utils.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ]
     ],
-    "compute_pressure_disconnect_idempotent.https.any.js": [
-     "3c9a6688a42fb8e3e4decbee393e51a52554b6f5",
+    "compute_pressure_disconnect.https.window.js": [
+     "0a27b16a926b35b3d9d7f1878542f379bb7cb7f3",
      [
-      "compute-pressure/compute_pressure_disconnect_idempotent.https.any.html",
+      "compute-pressure/compute_pressure_disconnect.https.window.html?globalScope=dedicated_worker",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ],
      [
-      "compute-pressure/compute_pressure_disconnect_idempotent.https.any.sharedworker.html",
+      "compute-pressure/compute_pressure_disconnect.https.window.html?globalScope=window",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
-        ],
-        [
-         "global",
-         "window,dedicatedworker,sharedworker"
-        ]
-       ]
-      }
-     ],
-     [
-      "compute-pressure/compute_pressure_disconnect_idempotent.https.any.worker.html",
-      {
-       "script_metadata": [
-        [
-         "script",
-         "/resources/test-only-api.js"
+         "/resources/testdriver.js"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver-vendor.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ]
     ],
-    "compute_pressure_disconnect_immediately.https.any.js": [
-     "86963e242aba383ff5c687549f23bbdf58d3a237",
+    "compute_pressure_disconnect_idempotent.https.window.js": [
+     "b7c440502d4f9e92df6c3a719f638f2b94682b8f",
      [
-      "compute-pressure/compute_pressure_disconnect_immediately.https.any.html",
+      "compute-pressure/compute_pressure_disconnect_idempotent.https.window.html?globalScope=dedicated_worker",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ],
      [
-      "compute-pressure/compute_pressure_disconnect_immediately.https.any.sharedworker.html",
+      "compute-pressure/compute_pressure_disconnect_idempotent.https.window.html?globalScope=window",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
-        ],
-        [
-         "global",
-         "window,dedicatedworker,sharedworker"
-        ]
-       ]
-      }
-     ],
-     [
-      "compute-pressure/compute_pressure_disconnect_immediately.https.any.worker.html",
-      {
-       "script_metadata": [
-        [
-         "script",
-         "/resources/test-only-api.js"
+         "/resources/testdriver.js"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver-vendor.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ]
     ],
-    "compute_pressure_duplicate_updates.https.any.js": [
-     "609fb5ad7083f3cce6e10d8c0b461ffb01e853be",
+    "compute_pressure_disconnect_immediately.https.window.js": [
+     "f411a1ea85c2d326f6bc2f7ee6984fc2576e48d6",
      [
-      "compute-pressure/compute_pressure_duplicate_updates.https.any.html",
+      "compute-pressure/compute_pressure_disconnect_immediately.https.window.html?globalScope=dedicated_worker",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ],
      [
-      "compute-pressure/compute_pressure_duplicate_updates.https.any.sharedworker.html",
+      "compute-pressure/compute_pressure_disconnect_immediately.https.window.html?globalScope=window",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
+        ]
+       ]
+      }
+     ]
+    ],
+    "compute_pressure_duplicate_updates.https.window.js": [
+     "f11a59b4cbbad30b4b9b0700e243bd12f5ea68d5",
+     [
+      "compute-pressure/compute_pressure_duplicate_updates.https.window.html?globalScope=dedicated_worker",
+      {
+       "script_metadata": [
+        [
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
+        ],
+        [
+         "script",
+         "/resources/testdriver.js"
+        ],
+        [
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ],
      [
-      "compute-pressure/compute_pressure_duplicate_updates.https.any.worker.html",
+      "compute-pressure/compute_pressure_duplicate_updates.https.window.html?globalScope=window",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
@@ -445018,121 +445097,147 @@
       }
      ]
     ],
-    "compute_pressure_multiple.https.any.js": [
-     "8c50cc4b3df27e99e7fcb445d59609aa41d54fc9",
+    "compute_pressure_multiple.https.window.js": [
+     "a5d2f530a0944f470f7581c076edd1eef01d83f8",
      [
-      "compute-pressure/compute_pressure_multiple.https.any.html",
+      "compute-pressure/compute_pressure_multiple.https.window.html?globalScope=dedicated_worker",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ],
      [
-      "compute-pressure/compute_pressure_multiple.https.any.sharedworker.html",
+      "compute-pressure/compute_pressure_multiple.https.window.html?globalScope=window",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
-        ],
-        [
-         "global",
-         "window,dedicatedworker,sharedworker"
-        ]
-       ]
-      }
-     ],
-     [
-      "compute-pressure/compute_pressure_multiple.https.any.worker.html",
-      {
-       "script_metadata": [
-        [
-         "script",
-         "/resources/test-only-api.js"
+         "/resources/testdriver.js"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver-vendor.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ]
     ],
-    "compute_pressure_observe_idempotent.https.any.js": [
-     "9fcbb49814b6c0aac163c31d35d76b473d87a274",
+    "compute_pressure_observe_idempotent.https.window.js": [
+     "af719097db23dd95b780ae5ae89c47363fdf07e5",
      [
-      "compute-pressure/compute_pressure_observe_idempotent.https.any.html",
+      "compute-pressure/compute_pressure_observe_idempotent.https.window.html?globalScope=dedicated_worker",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ],
      [
-      "compute-pressure/compute_pressure_observe_idempotent.https.any.sharedworker.html",
+      "compute-pressure/compute_pressure_observe_idempotent.https.window.html?globalScope=window",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
-        ],
-        [
-         "global",
-         "window,dedicatedworker,sharedworker"
-        ]
-       ]
-      }
-     ],
-     [
-      "compute-pressure/compute_pressure_observe_idempotent.https.any.worker.html",
-      {
-       "script_metadata": [
-        [
-         "script",
-         "/resources/test-only-api.js"
+         "/resources/testdriver.js"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver-vendor.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
@@ -445174,70 +445279,83 @@
       }
      ]
     ],
-    "compute_pressure_options.https.any.js": [
-     "ecf3c29dbf031d4014c8b7896bdf8f305596db27",
+    "compute_pressure_options.https.window.js": [
+     "0cf0b8e11fd0b7f798b2873d8df3a6ade87abcd0",
      [
-      "compute-pressure/compute_pressure_options.https.any.html",
+      "compute-pressure/compute_pressure_options.https.window.html?globalScope=dedicated_worker",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ],
      [
-      "compute-pressure/compute_pressure_options.https.any.sharedworker.html",
+      "compute-pressure/compute_pressure_options.https.window.html?globalScope=window",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
-        ],
-        [
-         "global",
-         "window,dedicatedworker,sharedworker"
-        ]
-       ]
-      }
-     ],
-     [
-      "compute-pressure/compute_pressure_options.https.any.worker.html",
-      {
-       "script_metadata": [
-        [
-         "script",
-         "/resources/test-only-api.js"
+         "/resources/testdriver.js"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver-vendor.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ]
     ],
     "compute_pressure_rate_obfuscation_mitigation_not_triggered.https.window.js": [
-     "f3e966de24183f729918ca5a96add3941df1a40e",
+     "96cb29025406fce294d511367cd82603b31199a9",
      [
-      "compute-pressure/compute_pressure_rate_obfuscation_mitigation_not_triggered.https.window.html",
+      "compute-pressure/compute_pressure_rate_obfuscation_mitigation_not_triggered.https.window.html?globalScope=dedicated_worker",
       {
        "script_metadata": [
         [
@@ -445245,16 +445363,72 @@
          "long"
         ],
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
+        ]
+       ],
+       "timeout": "long"
+      }
+     ],
+     [
+      "compute-pressure/compute_pressure_rate_obfuscation_mitigation_not_triggered.https.window.html?globalScope=window",
+      {
+       "script_metadata": [
+        [
+         "timeout",
+         "long"
+        ],
+        [
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
+        ],
+        [
+         "script",
+         "/resources/testdriver.js"
+        ],
+        [
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ],
        "timeout": "long"
@@ -445262,9 +445436,9 @@
      ]
     ],
     "compute_pressure_rate_obfuscation_mitigation_triggered.https.window.js": [
-     "b481cf6c87d87d0853468ebd7b3e257cd66ae5e3",
+     "b87452a9ddffa74a69b0577a2572667eadbdb2ba",
      [
-      "compute-pressure/compute_pressure_rate_obfuscation_mitigation_triggered.https.window.html",
+      "compute-pressure/compute_pressure_rate_obfuscation_mitigation_triggered.https.window.html?globalScope=dedicated_worker",
       {
        "script_metadata": [
         [
@@ -445272,197 +445446,468 @@
          "long"
         ],
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
+        ]
+       ],
+       "timeout": "long"
+      }
+     ],
+     [
+      "compute-pressure/compute_pressure_rate_obfuscation_mitigation_triggered.https.window.html?globalScope=window",
+      {
+       "script_metadata": [
+        [
+         "timeout",
+         "long"
+        ],
+        [
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
+        ],
+        [
+         "script",
+         "/resources/testdriver.js"
+        ],
+        [
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ],
        "timeout": "long"
       }
      ]
     ],
-    "compute_pressure_take_records.https.any.js": [
-     "55660b228be22453c3d48a907d8501e3d9a55c00",
+    "compute_pressure_take_records.https.window.js": [
+     "0025dd61701b52f38e1f8428124ffba133dfc62a",
      [
-      "compute-pressure/compute_pressure_take_records.https.any.html",
+      "compute-pressure/compute_pressure_take_records.https.window.html?globalScope=dedicated_worker",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ],
      [
-      "compute-pressure/compute_pressure_take_records.https.any.sharedworker.html",
+      "compute-pressure/compute_pressure_take_records.https.window.html?globalScope=window",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
-        ],
-        [
-         "global",
-         "window,dedicatedworker,sharedworker"
-        ]
-       ]
-      }
-     ],
-     [
-      "compute-pressure/compute_pressure_take_records.https.any.worker.html",
-      {
-       "script_metadata": [
-        [
-         "script",
-         "/resources/test-only-api.js"
+         "/resources/testdriver.js"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver-vendor.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ]
     ],
-    "compute_pressure_timestamp.https.any.js": [
-     "18db1dac461dd175bf7ee67ff96e6084a61964ad",
+    "compute_pressure_timestamp.https.window.js": [
+     "0f35eef522a454bfde3db8fcf0d2fce49f3f2bb6",
      [
-      "compute-pressure/compute_pressure_timestamp.https.any.html",
+      "compute-pressure/compute_pressure_timestamp.https.window.html?globalScope=dedicated_worker",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "timeout",
+         "long"
+        ],
+        [
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ],
      [
-      "compute-pressure/compute_pressure_timestamp.https.any.sharedworker.html",
+      "compute-pressure/compute_pressure_timestamp.https.window.html?globalScope=window",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "timeout",
+         "long"
+        ],
+        [
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
-       ]
-      }
-     ],
-     [
-      "compute-pressure/compute_pressure_timestamp.https.any.worker.html",
-      {
-       "script_metadata": [
-        [
-         "script",
-         "/resources/test-only-api.js"
-        ],
-        [
-         "script",
-         "resources/pressure-helpers.js"
-        ],
-        [
-         "global",
-         "window,dedicatedworker,sharedworker"
-        ]
-       ]
+       ],
+       "timeout": "long"
       }
      ]
     ],
-    "compute_pressure_update_toJSON.https.any.js": [
-     "7f726698d61dd30afe588f4b477de5dc6bdbe407",
+    "compute_pressure_timestamp_continuously_increasing.https.window.js": [
+     "bdf5dbae6f513ccd0603f97b4c29f6f6c65f1c12",
      [
-      "compute-pressure/compute_pressure_update_toJSON.https.any.html",
+      "compute-pressure/compute_pressure_timestamp_continuously_increasing.https.window.html?globalScope=dedicated_worker",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "timeout",
+         "long"
+        ],
+        [
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
+        ]
+       ],
+       "timeout": "long"
+      }
+     ],
+     [
+      "compute-pressure/compute_pressure_timestamp_continuously_increasing.https.window.html?globalScope=window",
+      {
+       "script_metadata": [
+        [
+         "timeout",
+         "long"
+        ],
+        [
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
+        ],
+        [
+         "script",
+         "/resources/testdriver.js"
+        ],
+        [
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
+        ]
+       ],
+       "timeout": "long"
+      }
+     ]
+    ],
+    "compute_pressure_timestamp_faster_collector.https.window.js": [
+     "40ffe3b5b006e3ed8e1d1aae7ad3db40be2a17a3",
+     [
+      "compute-pressure/compute_pressure_timestamp_faster_collector.https.window.html?globalScope=dedicated_worker",
+      {
+       "script_metadata": [
+        [
+         "timeout",
+         "long"
+        ],
+        [
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
+        ],
+        [
+         "script",
+         "/resources/testdriver.js"
+        ],
+        [
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
+        ]
+       ],
+       "timeout": "long"
+      }
+     ],
+     [
+      "compute-pressure/compute_pressure_timestamp_faster_collector.https.window.html?globalScope=window",
+      {
+       "script_metadata": [
+        [
+         "timeout",
+         "long"
+        ],
+        [
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
+        ],
+        [
+         "script",
+         "/resources/testdriver.js"
+        ],
+        [
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
+        ]
+       ],
+       "timeout": "long"
+      }
+     ]
+    ],
+    "compute_pressure_update_toJSON.https.window.js": [
+     "4ba8142c72edf96919f3ddf6fb9cd3eb7708f970",
+     [
+      "compute-pressure/compute_pressure_update_toJSON.https.window.html?globalScope=dedicated_worker",
+      {
+       "script_metadata": [
+        [
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
+        ],
+        [
+         "script",
+         "/resources/testdriver.js"
+        ],
+        [
+         "script",
+         "/resources/testdriver-vendor.js"
+        ],
+        [
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
      ],
      [
-      "compute-pressure/compute_pressure_update_toJSON.https.any.sharedworker.html",
+      "compute-pressure/compute_pressure_update_toJSON.https.window.html?globalScope=window",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
+        ],
+        [
+         "variant",
+         "?globalScope=dedicated_worker"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
-        ],
-        [
-         "global",
-         "window,dedicatedworker,sharedworker"
-        ]
-       ]
-      }
-     ],
-     [
-      "compute-pressure/compute_pressure_update_toJSON.https.any.worker.html",
-      {
-       "script_metadata": [
-        [
-         "script",
-         "/resources/test-only-api.js"
+         "/resources/testdriver.js"
         ],
         [
          "script",
-         "resources/pressure-helpers.js"
+         "/resources/testdriver-vendor.js"
         ],
         [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "script",
+         "/common/utils.js"
+        ],
+        [
+         "script",
+         "/common/dispatcher/dispatcher.js"
+        ],
+        [
+         "script",
+         "./resources/common.js"
         ]
        ]
       }
@@ -445528,61 +445973,34 @@
       }
      ]
     ],
-    "observe_return_type.https.any.js": [
-     "b24878ab394d236db4babb395e5703682b28c95d",
+    "observe_return_type.https.window.js": [
+     "6653f9a89eed083974ce9d1a4c31f34c4aec4407",
      [
-      "compute-pressure/observe_return_type.https.any.html",
+      "compute-pressure/observe_return_type.https.window.html?globalScope=dedicated_worker",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
         ],
         [
-         "script",
-         "resources/pressure-helpers.js"
-        ],
-        [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "variant",
+         "?globalScope=dedicated_worker"
         ]
        ]
       }
      ],
      [
-      "compute-pressure/observe_return_type.https.any.sharedworker.html",
+      "compute-pressure/observe_return_type.https.window.html?globalScope=window",
       {
        "script_metadata": [
         [
-         "script",
-         "/resources/test-only-api.js"
+         "variant",
+         "?globalScope=window"
         ],
         [
-         "script",
-         "resources/pressure-helpers.js"
-        ],
-        [
-         "global",
-         "window,dedicatedworker,sharedworker"
-        ]
-       ]
-      }
-     ],
-     [
-      "compute-pressure/observe_return_type.https.any.worker.html",
-      {
-       "script_metadata": [
-        [
-         "script",
-         "/resources/test-only-api.js"
-        ],
-        [
-         "script",
-         "resources/pressure-helpers.js"
-        ],
-        [
-         "global",
-         "window,dedicatedworker,sharedworker"
+         "variant",
+         "?globalScope=dedicated_worker"
         ]
        ]
       }
@@ -502358,6 +502776,13 @@
          }
         ]
        ],
+       "listed-form-element-reset.html": [
+        "29f524dd9e7de2f9036dd3f69f8268523dfd6d2e",
+        [
+         null,
+         {}
+        ]
+       ],
        "modal-dialog.html": [
         "fa9eeae85eb13daf948c20406b1b907575c1c1f6",
         [
@@ -548636,6 +549061,41 @@
        }
       ]
      ],
+     "service-worker-request-visibility.https.window.js": [
+      "91214f01ef1e521f8d9f7d514129693288e5cf19",
+      [
+       "fledge/tentative/service-worker-request-visibility.https.window.html?1-last",
+       {
+        "script_metadata": [
+         [
+          "script",
+          "/resources/testdriver.js"
+         ],
+         [
+          "script",
+          "/common/utils.js"
+         ],
+         [
+          "script",
+          "resources/fledge-util.sub.js"
+         ],
+         [
+          "script",
+          "/common/subset-tests.js"
+         ],
+         [
+          "timeout",
+          "long"
+         ],
+         [
+          "variant",
+          "?1-last"
+         ]
+        ],
+        "timeout": "long"
+       }
+      ]
+     ],
      "tie.https.window.js": [
       "c87d10f2016fa94d6a1e722fa9dfe1d3bb5c4def",
       [
@@ -635422,7 +635882,7 @@
      ]
     ],
     "prefetch-headers.https.html": [
-     "0a475c7d7735cb535f24b62339fdd42d4d5443cb",
+     "74f654a3636008f591a959454673e7885adee948",
      [
       null,
       {}
@@ -635445,7 +635905,7 @@
      ]
     ],
     "prefetch-types.https.html": [
-     "276439e5440b2157eb2bfaf6a2fbe8b4ec05b3ff",
+     "da034252562c3bc7483f81d556adf5592efc8436",
      [
       null,
       {}
@@ -657373,7 +657833,7 @@
      "tentative": {
       "static-router": {
        "static-router-resource-timing.https.html": [
-        "796beb916a68ec58c1a8a0315a03133d6ae3bc63",
+        "74d84eb3c9f8b90492992167475b2cbdd11c9e52",
         [
          null,
          {}
diff --git a/third_party/blink/web_tests/external/wpt/clipboard-apis/clipboard-item.https-expected.txt b/third_party/blink/web_tests/external/wpt/clipboard-apis/clipboard-item.https-expected.txt
index 6e41632..f19e513 100644
--- a/third_party/blink/web_tests/external/wpt/clipboard-apis/clipboard-item.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/clipboard-apis/clipboard-item.https-expected.txt
@@ -1,7 +1,7 @@
 This is a testharness.js-based test.
 [FAIL] getType(DOMString valid type) converts DOMString to Blob
-  assert_equals: expected (string) "text/plain" but got (undefined) undefined
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to construct 'ClipboardItem': Failed to convert value to 'Blob'."
 [FAIL] getType(DOMString invalid type) converts DOMString to Blob
-  assert_equals: expected (string) "not a/real type" but got (undefined) undefined
+  promise_test: Unhandled rejection with value: object "TypeError: Failed to construct 'ClipboardItem': Failed to convert value to 'Blob'."
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/fedcm/support/fedcm-helper.sub.js b/third_party/blink/web_tests/external/wpt/fedcm/support/fedcm-helper.sub.js
index 767c044..4337adf 100644
--- a/third_party/blink/web_tests/external/wpt/fedcm/support/fedcm-helper.sub.js
+++ b/third_party/blink/web_tests/external/wpt/fedcm/support/fedcm-helper.sub.js
@@ -124,8 +124,6 @@
 // Test wrapper which does FedCM-specific setup.
 export function fedcm_test(test_func, test_name) {
   promise_test(async t => {
-    // Ensure we start from a clean slate.
-    await test_driver.delete_all_cookies();
     // Turn off delays that are not useful in tests.
     try {
       await test_driver.set_fedcm_delay_enabled(false);
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/auction-config.https.window.js b/third_party/blink/web_tests/external/wpt/fledge/tentative/auction-config.https.window.js
index 4efef29..d85271ee 100644
--- a/third_party/blink/web_tests/external/wpt/fledge/tentative/auction-config.https.window.js
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/auction-config.https.window.js
@@ -472,7 +472,10 @@
 makeTest({
   name: 'perBuyerCurrencies not convertible to dictionary',
   expect: EXPECT_PROMISE_ERROR,
-  expectPromiseError: EXPECT_EXCEPTION(TypeError),
+  // Because this is not convertible by IDL to the proper dictionary type, this
+  // will immediately be converted to a rejected promise inside of the
+  // runBasicFledgeAuction() invocation, and that await will handle the
+  // rejection. Therefore, no expectPromiseError.
   auctionConfigOverrides: {perBuyerCurrencies: 123}
 });
 
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/audio-session.idl b/third_party/blink/web_tests/external/wpt/interfaces/audio-session.idl
index f542347..7fd7502 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/audio-session.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/audio-session.idl
@@ -3,10 +3,12 @@
 // (https://github.com/w3c/webref)
 // Source: Audio Session (https://w3c.github.io/audio-session/)
 
-enum AudioSessionState {
-  "inactive",
-  "active",
-  "interrupted"
+[Exposed=Window]
+interface AudioSession : EventTarget {
+  attribute AudioSessionType type;
+
+  readonly attribute AudioSessionState state;
+  attribute EventHandler onstatechange;
 };
 
 enum AudioSessionType {
@@ -18,16 +20,14 @@
   "play-and-record"
 };
 
+enum AudioSessionState {
+  "inactive",
+  "active",
+  "interrupted"
+};
+
 [Exposed=Window]
 partial interface Navigator {
   // The default audio session that the user agent will use when media elements start/stop playing.
   readonly attribute AudioSession audioSession;
 };
-
-[Exposed=Window]
-interface AudioSession : EventTarget {
-  attribute AudioSessionType type;
-
-  readonly attribute AudioSessionState state;
-  attribute EventHandler onstatechange;
-};
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/mediacapture-viewport.idl b/third_party/blink/web_tests/external/wpt/interfaces/mediacapture-viewport.idl
index a9dcf74..c4d1892b 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/mediacapture-viewport.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/mediacapture-viewport.idl
@@ -5,10 +5,5 @@
 
 partial interface MediaDevices {
   Promise<MediaStream> getViewportMedia(
-      optional ViewportMediaStreamConstraints constraints = {});
-};
-
-dictionary ViewportMediaStreamConstraints {
-  (boolean or MediaTrackConstraints) video = true;
-  (boolean or MediaTrackConstraints) audio = false;
+      optional DisplayMediaStreamOptions options = {});
 };
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/mediasession.idl b/third_party/blink/web_tests/external/wpt/interfaces/mediasession.idl
index 00bfe6a..5c6942b 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/mediasession.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/mediasession.idl
@@ -98,17 +98,8 @@
 
 dictionary MediaSessionActionDetails {
   required MediaSessionAction action;
-};
-
-dictionary MediaSessionSeekActionDetails : MediaSessionActionDetails {
   double seekOffset;
-};
-
-dictionary MediaSessionSeekToActionDetails : MediaSessionActionDetails {
-  required double seekTime;
+  double seekTime;
   boolean fastSeek;
-};
-
-dictionary MediaSessionCaptureActionDetails : MediaSessionActionDetails {
   boolean isActivating;
 };
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/observable.idl b/third_party/blink/web_tests/external/wpt/interfaces/observable.idl
index b0f0949..55bdbb2 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/observable.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/observable.idl
@@ -81,7 +81,7 @@
   Observable drop(unsigned long long amount);
   Observable flatMap(Mapper mapper);
   Observable switchMap(Mapper mapper);
-  Observable inspect(optional ObservableInspectorUnion inspect_observer = {});
+  Observable inspect(optional ObservableInspectorUnion inspectorUnion = {});
   Observable catch(CatchCallback callback);
   Observable finally(VoidFunction callback);
 
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/selection-api.idl b/third_party/blink/web_tests/external/wpt/interfaces/selection-api.idl
index a84536ab..49d718d 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/selection-api.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/selection-api.idl
@@ -18,7 +18,7 @@
   undefined removeRange(Range range);
   undefined removeAllRanges();
   undefined empty();
-  sequence<StaticRange> getComposedRanges(ShadowRoot... shadowRoots);
+  sequence<StaticRange> getComposedRanges(optional GetComposedRangesOptions options = {});
   undefined collapse(Node? node, optional unsigned long offset = 0);
   undefined setPosition(Node? node, optional unsigned long offset = 0);
   undefined collapseToStart();
@@ -32,6 +32,10 @@
   stringifier;
 };
 
+dictionary GetComposedRangesOptions {
+  sequence<ShadowRoot> shadowRoots = [];
+};
+
 partial interface Document {
   Selection? getSelection();
 };
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/service-workers.idl b/third_party/blink/web_tests/external/wpt/interfaces/service-workers.idl
index 87d48398..d9ff2f6 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/service-workers.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/service-workers.idl
@@ -167,6 +167,7 @@
 
 [Exposed=ServiceWorker]
 interface InstallEvent : ExtendableEvent {
+  constructor(DOMString type, optional ExtendableEventInit eventInitDict = {});
   Promise<undefined> addRoutes((RouterRule or sequence<RouterRule>) rules);
 };
 
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/shared-storage.idl b/third_party/blink/web_tests/external/wpt/interfaces/shared-storage.idl
index 6f8e927..85906bed 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/shared-storage.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/shared-storage.idl
@@ -89,6 +89,7 @@
   boolean resolveToConfig = false;
   boolean keepAlive = false;
   SharedStoragePrivateAggregationConfig privateAggregationConfig;
+  DOMString savedQuery;
 };
 
 dictionary SharedStorageWorkletOptions : WorkletOptions {
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/turtledove.idl b/third_party/blink/web_tests/external/wpt/interfaces/turtledove.idl
index 77360d0..ff48d311 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/turtledove.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/turtledove.idl
@@ -128,16 +128,22 @@
   Promise<AdAuctionData> getInterestGroupAdAuctionData(AdAuctionDataConfig config);
 };
 
-dictionary AdAuctionDataConfig {
-  required USVString seller;
-  required USVString coordinatorOrigin;
-};
-
 dictionary AdAuctionData {
   required Uint8Array request;
   required USVString requestId;
 };
 
+dictionary AdAuctionDataConfig {
+  required USVString seller;
+  required USVString coordinatorOrigin;
+  unsigned long requestSize;
+  record<USVString, AdAuctionDataBuyerConfig> perBuyerConfig;
+};
+
+dictionary AdAuctionDataBuyerConfig {
+  unsigned long targetSize;
+};
+
 [SecureContext]
 partial interface Navigator {
   Promise<DOMString> createAuctionNonce();
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webgpu.idl b/third_party/blink/web_tests/external/wpt/interfaces/webgpu.idl
index 7402189..421685c7 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/webgpu.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/webgpu.idl
@@ -78,7 +78,7 @@
 };
 
 dictionary GPURequestAdapterOptions {
-    any featureLevel;
+    DOMString featureLevel;
     GPUPowerPreference powerPreference;
     boolean forceFallbackAdapter = false;
 };
@@ -1183,6 +1183,7 @@
     undefined configure(GPUCanvasConfiguration configuration);
     undefined unconfigure();
 
+    GPUCanvasConfiguration? getConfiguration();
     GPUTexture getCurrentTexture();
 };
 
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webnn.idl b/third_party/blink/web_tests/external/wpt/interfaces/webnn.idl
index 9a71f739..8329e7d2 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/webnn.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/webnn.idl
@@ -90,7 +90,7 @@
 
 dictionary MLOperandDescriptor {
   required MLOperandDataType dataType;
-  sequence<[EnforceRange] unsigned long> shape = [];
+  required sequence<[EnforceRange] unsigned long> shape;
 };
 
 [SecureContext, Exposed=(Window, DedicatedWorker)]
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webrtc.idl b/third_party/blink/web_tests/external/wpt/interfaces/webrtc.idl
index 32500f9a..174ead62 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/webrtc.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/webrtc.idl
@@ -503,7 +503,7 @@
   "closed"
 };
 
-[Exposed=Window]
+[Exposed=(Window,DedicatedWorker), Transferable]
 interface RTCDataChannel : EventTarget {
   readonly attribute USVString label;
   readonly attribute boolean ordered;
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/idlharness.https.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/service-workers/idlharness.https.any.serviceworker-expected.txt
index 3857e59c..d6b8ea5 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/idlharness.https.any.serviceworker-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/service-workers/idlharness.https.any.serviceworker-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 33 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 32 FAIL, 0 TIMEOUT, 0 NOTRUN.
 [FAIL] ServiceWorkerContainer interface: existence and properties of interface object
   assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing
 [FAIL] ServiceWorkerContainer interface object length
@@ -58,8 +58,6 @@
   assert_equals: wrong typeof object expected "object" but got "undefined"
 [FAIL] WindowClient interface: attribute ancestorOrigins
   assert_true: The prototype object must have a property "ancestorOrigins" expected true got false
-[FAIL] InstallEvent interface object length
-  assert_equals: wrong value for InstallEvent.length expected 0 but got 1
 [FAIL] FetchEvent interface: attribute replacesClientId
   assert_true: The prototype object must have a property "replacesClientId" expected true got false
 [FAIL] FetchEvent interface: new FetchEvent("type", { request: new Request("") }) must inherit property "replacesClientId" with the proper type
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/resources/fetch-event-synthetic-respond-with-worker.js b/third_party/blink/web_tests/http/tests/serviceworker/resources/fetch-event-synthetic-respond-with-worker.js
index 1ac62bb..d08c95c90 100644
--- a/third_party/blink/web_tests/http/tests/serviceworker/resources/fetch-event-synthetic-respond-with-worker.js
+++ b/third_party/blink/web_tests/http/tests/serviceworker/resources/fetch-event-synthetic-respond-with-worker.js
@@ -2,6 +2,6 @@
 
 test(() => {
     var req = new Request('https://www.example.com/', {method: 'POST'});
-    new FetchEvent('fetch', {request: req}).respondWith('foo');
+    new FetchEvent('fetch', {request: req}).respondWith(new Response('foo'));
   }, 'Calling respondWith should not crash');
 
diff --git a/third_party/blink/web_tests/virtual/speech-with-unified-autoplay/DIR_METADATA b/third_party/blink/web_tests/virtual/speech-with-unified-autoplay/DIR_METADATA
new file mode 100644
index 0000000..fb0a9bc
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/speech-with-unified-autoplay/DIR_METADATA
@@ -0,0 +1,6 @@
+monorail: {
+  component: "Chromium > Blink > Media > Autoplay"
+}
+buganizer_public: {
+  component_id: 1456724
+}
\ No newline at end of file
diff --git a/third_party/chromite b/third_party/chromite
index f834f05..c621276 160000
--- a/third_party/chromite
+++ b/third_party/chromite
@@ -1 +1 @@
-Subproject commit f834f05d9e79b960930b90da2d6e8f824c85a9b1
+Subproject commit c621276d4f2ec43ef4346a40f5dd328aa8bcbaaf
diff --git a/third_party/crubit/.gitignore b/third_party/crubit/.gitignore
deleted file mode 100644
index e69de29..0000000
--- a/third_party/crubit/.gitignore
+++ /dev/null
diff --git a/third_party/crubit/LICENSE b/third_party/crubit/LICENSE
deleted file mode 100644
index 90d89d0..0000000
--- a/third_party/crubit/LICENSE
+++ /dev/null
@@ -1,234 +0,0 @@
-==============================================================================
-The Crubit project is under the Apache License v2.0 with LLVM Exceptions:
-==============================================================================
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-    1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-    2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-    3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-    4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-    5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-    6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-    7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-    8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-    9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-    END OF TERMS AND CONDITIONS
-
-    APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-    Copyright [yyyy] [name of copyright owner]
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
-
----- LLVM Exceptions to the Apache 2.0 License ----
-
-As an exception, if, as a result of your compiling your source code, portions
-of this Software are embedded into an Object form of such source code, you
-may redistribute such embedded portions in such Object form without complying
-with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
-
-In addition, if you combine or link compiled forms of this Software with
-software that is licensed under the GPLv2 ("Combined Software") and if a
-court of competent jurisdiction determines that the patent provision (Section
-3), the indemnity provision (Section 9) or other Section of the License
-conflicts with the conditions of the GPLv2, you may retroactively and
-prospectively choose to deem waived or otherwise exclude such Section(s) of
-the License, but only in their entirety and only with respect to the Combined
-Software.
-
-==============================================================================
-Software from third parties included in the Crubit project:
-==============================================================================
-The Crubit project contains third party software which is under different
-license terms. All such code will be identified clearly using at least one of
-two mechanisms:
-1) It will be in a separate directory tree with its own `LICENSE.txt` or
-   `LICENSE` file at the top containing the specific license and restrictions
-   which apply to that software, or
-2) It will contain specific license and restriction terms at the top of every
-   file.
\ No newline at end of file
diff --git a/third_party/crubit/OWNERS b/third_party/crubit/OWNERS
deleted file mode 100644
index ec1b1412..0000000
--- a/third_party/crubit/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://build/rust/OWNERS
diff --git a/third_party/crubit/README.chromium b/third_party/crubit/README.chromium
deleted file mode 100644
index d87173e..0000000
--- a/third_party/crubit/README.chromium
+++ /dev/null
@@ -1,31 +0,0 @@
-Name: Crubit: C++/Rust Bidirectional Interop Tool
-Short Name: crubit
-URL: https://github.com/google/crubit
-Version: 0
-Date: See the comments next to the `crubit_revision` in the //DEPS file
-Revision: See `crubit_revision` in the //DEPS file
-License: Apache 2.0
-License File: LICENSE
-Security Critical: no
-Shipped: no
-
-Description:
-
-Extremely experimental interop tooling for C++ and Rust.
-
-See also:
-
-- Google-internal "High-level Design of C++/Rust Interop" doc at
-  https://docs.google.com/document/d/1FDBHv0qQQpvV8URRW1crgKWlVm3UEh87pJrmFAxuFrI/edit?usp=sharing
-
-- //build/rust/rs_bindings_from_cc.gni (support for using Crubit for generating
-  C++/Rust bindings during Chromium build using `bin/rs_bindings_from_cc` tool
-  + for building such generated files against
-  `./src/rs_bindings_from_cc/support` libraries).
-
-- //tools/rust/build_crubit.py (for building `bin/rs_bindings_from_cc` tool for
-  packaging and distribution via `gclient sync`)
-
-Local Modifications:
-- Added BUILD.gn that covers `src/rs_bindings_from_cc/support'
-  (see https://crrev.com/c/3756719)
diff --git a/third_party/crubit/src b/third_party/crubit/src
deleted file mode 160000
index f5cbdf4..0000000
--- a/third_party/crubit/src
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit f5cbdf4b54b0e6b9f63a4464a2c901c82e0f0209
diff --git a/third_party/dawn b/third_party/dawn
index 690b037..9d1b7b4 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit 690b037a7532f18b68e4907ddb0ddff6b1a8f1e7
+Subproject commit 9d1b7b42eb282d2ce24e329a8bf41c89fdd67973
diff --git a/third_party/depot_tools b/third_party/depot_tools
index 6dec852..cc39a56 160000
--- a/third_party/depot_tools
+++ b/third_party/depot_tools
@@ -1 +1 @@
-Subproject commit 6dec85272d23ae587984cdd78eae428ce3b2ad9b
+Subproject commit cc39a5681f48f42e8f0d16b9979bd3085c93de0a
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal
index 51db6cf..84c1220 160000
--- a/third_party/devtools-frontend-internal
+++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@
-Subproject commit 51db6cf38207673d6bfa25c8e136277c3cfb6e9c
+Subproject commit 84c1220a80b203163a2c3d124ca103f63580d8ce
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 5fea877..b40634d 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 5fea877e0b17578765cd4520857b5b3b172b5199
+Subproject commit b40634d52b0f5dcde839e73c8bdac4909458217a
diff --git a/third_party/libunwind/src b/third_party/libunwind/src
index b7cdaca..37c7d98 160000
--- a/third_party/libunwind/src
+++ b/third_party/libunwind/src
@@ -1 +1 @@
-Subproject commit b7cdacaadbc4d121081ad6b146c7e94acec4c7ff
+Subproject commit 37c7d984b0b8520a0f99c6e6bbb0514e9996edc8
diff --git a/third_party/openscreen/src b/third_party/openscreen/src
index 6508900..1335531 160000
--- a/third_party/openscreen/src
+++ b/third_party/openscreen/src
@@ -1 +1 @@
-Subproject commit 6508900f6f6cbe87a61abdc337fcdfc289c43cea
+Subproject commit 1335531d0d7847625b52e9365902d7fcba82f3c6
diff --git a/third_party/pdfium b/third_party/pdfium
index fba5ab2..cd4887c 160000
--- a/third_party/pdfium
+++ b/third_party/pdfium
@@ -1 +1 @@
-Subproject commit fba5ab2f1c9c9b66b61e94d00662f9c12fcb692b
+Subproject commit cd4887caa580fe6b54be2fd5abe87dc3fb4de27e
diff --git a/third_party/perfetto b/third_party/perfetto
index 077bb36..226197a 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit 077bb360edecb33551e88c8097035e4b8cef245b
+Subproject commit 226197a61ac2b08b3860b5c73f8411ba0ba43947
diff --git a/third_party/rust/bytes/v1/BUILD.gn b/third_party/rust/bytes/v1/BUILD.gn
index 807fae6..57f46d0e 100644
--- a/third_party/rust/bytes/v1/BUILD.gn
+++ b/third_party/rust/bytes/v1/BUILD.gn
@@ -13,33 +13,33 @@
   epoch = "1"
   crate_type = "rlib"
   crate_root =
-      "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/lib.rs"
+      "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/buf_impl.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/buf_mut.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/chain.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/iter.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/limit.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/reader.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/take.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/uninit_slice.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/vec_deque.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/writer.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/bytes.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/bytes_mut.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/fmt/debug.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/fmt/hex.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/fmt/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/lib.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/loom.rs",
-    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/serde.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/buf_impl.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/buf_mut.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/chain.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/iter.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/limit.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/reader.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/take.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/uninit_slice.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/vec_deque.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/writer.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/bytes.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/bytes_mut.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/fmt/debug.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/fmt/hex.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/fmt/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/loom.rs",
+    "//third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/serde.rs",
   ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2018"
-  cargo_pkg_version = "1.7.1"
+  cargo_pkg_version = "1.7.2"
   cargo_pkg_authors =
       "Carl Lerche <me@carllerche.com>, Sean McArthur <sean@seanmonstar.com>"
   cargo_pkg_name = "bytes"
diff --git a/third_party/rust/bytes/v1/README.chromium b/third_party/rust/bytes/v1/README.chromium
index 463abb3..dca7273 100644
--- a/third_party/rust/bytes/v1/README.chromium
+++ b/third_party/rust/bytes/v1/README.chromium
@@ -1,9 +1,9 @@
 Name: bytes
 URL: https://crates.io/crates/bytes
 Description: Types and traits for working with bytes
-Version: 1.7.1
+Version: 1.7.2
 Security Critical: no
 Shipped: no
 License: MIT
-License File: //third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/LICENSE
-Revision: dc4fb3e8f45650500187f8cdbad5ac8ffdb7df0a
+License File: //third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/LICENSE
+Revision: d7c1d658d90c922eeee1dbc29bc6f6fd9a1a1a66
diff --git a/third_party/rust/chromium_crates_io/Cargo.lock b/third_party/rust/chromium_crates_io/Cargo.lock
index 592f639c..ea8da12b 100644
--- a/third_party/rust/chromium_crates_io/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/Cargo.lock
@@ -70,12 +70,12 @@
 
 [[package]]
 name = "bytes"
-version = "1.7.1"
+version = "1.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "cc"
-version = "1.1.20"
+version = "1.1.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "shlex",
@@ -220,7 +220,7 @@
 
 [[package]]
 name = "fdeflate"
-version = "0.3.4"
+version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "simd-adler32",
@@ -233,7 +233,7 @@
 
 [[package]]
 name = "flate2"
-version = "1.0.33"
+version = "1.0.34"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "crc32fast",
@@ -298,7 +298,7 @@
 
 [[package]]
 name = "libc"
-version = "0.2.158"
+version = "0.2.159"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -449,7 +449,7 @@
 
 [[package]]
 name = "read-fonts"
-version = "0.22.0"
+version = "0.22.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bytemuck",
diff --git a/third_party/rust/chromium_crates_io/supply-chain/audits.toml b/third_party/rust/chromium_crates_io/supply-chain/audits.toml
index c9cca4b..0e47a492 100644
--- a/third_party/rust/chromium_crates_io/supply-chain/audits.toml
+++ b/third_party/rust/chromium_crates_io/supply-chain/audits.toml
@@ -417,6 +417,11 @@
 delta = "1.6.1 -> 1.7.1"
 notes = "Many changes but they seem to meet the low bar of safe-to-run."
 
+[[audits.bytes]]
+who = "Lukasz Anforowicz <lukasza@chromium.org>"
+criteria = ["safe-to-run", "does-not-implement-crypto"]
+delta = "1.7.1 -> 1.7.2"
+
 [[audits.cfg-if]]
 who = "Lukasz Anforowicz <lukasza@chromium.org>"
 criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-0"]
@@ -880,6 +885,11 @@
 can be found at go/image-crate-chromium-security-review.
 '''
 
+[[audits.fdeflate]]
+who = "Lukasz Anforowicz <lukasza@chromium.org>"
+criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-0"]
+delta = "0.3.4 -> 0.3.5"
+
 [[audits.fend-core]]
 who = "jiwan@chromium.org"
 criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-0"]
@@ -979,6 +989,22 @@
 and therefore hasn't been covered by this partial audit.
 """
 
+[[audits.flate2]]
+who = "Lukasz Anforowicz <lukasza@chromium.org>"
+criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-2"]
+delta = "1.0.33 -> 1.0.34"
+notes = """
+WARNING: This certification is a result of a **partial** audit.  The
+`any_zlib` code has **not** been audited.  See the audit of 1.0.30 for
+more details.
+
+The delta can be seen at https://diff.rs/flate2/1.0.33/1.0.34
+The delta bumps up `libz-rs-sys` dependency from `0.2.1` to `0.3.0`
+The delta in `lib.rs` only tweaks comments and has no code changes.
+The delta also contains some changes to `src/ffi/c.rs` which is *NOT* used by Chromium
+and therefore hasn't been covered by this partial audit.
+"""
+
 [[audits.font-types]]
 who = "Lukasz Anforowicz <lukasza@chromium.org>"
 criteria = ["ub-risk-0", "safe-to-deploy", "does-not-implement-crypto"]
@@ -1505,6 +1531,11 @@
 delta = "0.20.0 -> 0.22.0"
 notes = "Changes for incremental font transfer, Ankr, Feat tables, and support for getting access to the SVG document from the SVG table, as well as Avar2."
 
+[[audits.read-fonts]]
+who = "Lukasz Anforowicz <lukasza@chromium.org>"
+criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-0"]
+delta = "0.22.0 -> 0.22.1"
+
 [[audits.regex]]
 who = "danakj@chromium.org"
 criteria = ["safe-to-run", "does-not-implement-crypto"]
diff --git a/third_party/rust/chromium_crates_io/supply-chain/config.toml b/third_party/rust/chromium_crates_io/supply-chain/config.toml
index 36535a8..fdb4857 100644
--- a/third_party/rust/chromium_crates_io/supply-chain/config.toml
+++ b/third_party/rust/chromium_crates_io/supply-chain/config.toml
@@ -74,10 +74,10 @@
 [policy."byteorder:1.5.0"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
-[policy."bytes:1.7.1"]
+[policy."bytes:1.7.2"]
 criteria = ["crypto-safe", "safe-to-run"]
 
-[policy."cc:1.1.20"]
+[policy."cc:1.1.23"]
 criteria = []
 
 [policy."cfg-if:1.0.0"]
@@ -113,13 +113,13 @@
 [policy."either:1.13.0"]
 criteria = ["crypto-safe", "safe-to-run"]
 
-[policy."fdeflate:0.3.4"]
+[policy."fdeflate:0.3.5"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [policy."fend-core:1.5.2"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
-[policy."flate2:1.0.33"]
+[policy."flate2:1.0.34"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [policy."font-types:0.7.1"]
@@ -149,7 +149,7 @@
 [policy."lazy_static:1.5.0"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
-[policy."libc:0.2.158"]
+[policy."libc:0.2.159"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [policy."link-cplusplus:1.0.9"]
@@ -206,7 +206,7 @@
 [policy."rand_pcg:0.3.1"]
 criteria = ["crypto-safe", "safe-to-run"]
 
-[policy."read-fonts:0.22.0"]
+[policy."read-fonts:0.22.1"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [policy."regex-automata:0.4.7"]
diff --git a/third_party/rust/chromium_crates_io/supply-chain/imports.lock b/third_party/rust/chromium_crates_io/supply-chain/imports.lock
index 05a86ab..eccc4f8 100644
--- a/third_party/rust/chromium_crates_io/supply-chain/imports.lock
+++ b/third_party/rust/chromium_crates_io/supply-chain/imports.lock
@@ -2,8 +2,8 @@
 # cargo-vet imports lock
 
 [[publisher.libc]]
-version = "0.2.158"
-when = "2024-08-19"
+version = "0.2.159"
+when = "2024-09-24"
 user-id = 55123
 user-login = "rust-lang-owner"
 
@@ -145,16 +145,6 @@
 criteria = ["safe-to-run", "does-not-implement-crypto"]
 version = "0.4.3"
 
-[[audits.chromeos.audits.log]]
-who = "ChromeOS"
-criteria = ["safe-to-run", "does-not-implement-crypto"]
-version = "0.4.17"
-
-[[audits.chromeos.audits.log]]
-who = "George Burgess IV <gbiv@google.com>"
-criteria = ["safe-to-run", "does-not-implement-crypto"]
-delta = "0.4.17 -> 0.4.20"
-
 [[audits.chromeos.audits.memchr]]
 who = "Ying Hsu <yinghsu@chromium.org>"
 criteria = ["safe-to-run", "does-not-implement-crypto"]
@@ -175,6 +165,16 @@
 criteria = ["safe-to-run", "does-not-implement-crypto"]
 version = "0.1.0"
 
+[[audits.chromeos.audits.syn]]
+who = "Ying Hsu <yinghsu@chromium.org>"
+criteria = ["safe-to-run", "does-not-implement-crypto"]
+version = "2.0.58"
+
+[[audits.chromeos.audits.syn]]
+who = "Hung-Hsien Chen <hunghsienchen@chromium.org>"
+criteria = ["safe-to-run", "does-not-implement-crypto"]
+delta = "2.0.58 -> 2.0.77"
+
 [audits.fuchsia.criteria.ub-risk-0]
 description = """
 No unsafe code.
@@ -287,9 +287,3 @@
 criteria = ["does-not-implement-crypto", "ub-risk-2"]
 version = "1.13.1"
 notes = "Reviewed in CL 561111794"
-
-[[audits.google.audits.log]]
-who = "Ben Saunders <bsaunders@google.com>"
-criteria = ["does-not-implement-crypto", "ub-risk-1"]
-version = "0.4.20"
-notes = "Reviewed in CL 563853923"
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/.cargo_vcs_info.json
deleted file mode 100644
index e159ec8..0000000
--- a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "dc4fb3e8f45650500187f8cdbad5ac8ffdb7df0a"
-  },
-  "path_in_vcs": ""
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/Cargo.toml
deleted file mode 100644
index 56cbcd7..0000000
--- a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/Cargo.toml
+++ /dev/null
@@ -1,55 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies.
-#
-# If you are reading this file be aware that the original Cargo.toml
-# will likely look very different (and much more reasonable).
-# See Cargo.toml.orig for the original contents.
-
-[package]
-edition = "2018"
-rust-version = "1.39"
-name = "bytes"
-version = "1.7.1"
-authors = [
-    "Carl Lerche <me@carllerche.com>",
-    "Sean McArthur <sean@seanmonstar.com>",
-]
-description = "Types and traits for working with bytes"
-readme = "README.md"
-keywords = [
-    "buffers",
-    "zero-copy",
-    "io",
-]
-categories = [
-    "network-programming",
-    "data-structures",
-]
-license = "MIT"
-repository = "https://github.com/tokio-rs/bytes"
-
-[package.metadata.docs.rs]
-rustdoc-args = [
-    "--cfg",
-    "docsrs",
-]
-
-[dependencies.serde]
-version = "1.0.60"
-features = ["alloc"]
-optional = true
-default-features = false
-
-[dev-dependencies.serde_test]
-version = "1.0"
-
-[features]
-default = ["std"]
-std = []
-
-[target."cfg(loom)".dev-dependencies.loom]
-version = "0.7"
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/.cargo_vcs_info.json
new file mode 100644
index 0000000..3ace00d
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "d7c1d658d90c922eeee1dbc29bc6f6fd9a1a1a66"
+  },
+  "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/.github/workflows/ci.yml b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/.github/workflows/ci.yml
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/.github/workflows/ci.yml
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/.github/workflows/ci.yml
index c0658a14..d0136c4 100644
--- a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/.github/workflows/ci.yml
+++ b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/.github/workflows/ci.yml
@@ -13,7 +13,7 @@
 env:
   RUSTFLAGS: -Dwarnings
   RUST_BACKTRACE: 1
-  nightly: nightly-2022-11-12
+  nightly: nightly-2024-09-15
 
 defaults:
   run:
@@ -136,6 +136,8 @@
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v4
+      - name: Install Rust
+        run: rustup update $nightly && rustup default $nightly
       - name: Miri
         run: ci/miri.sh
 
@@ -160,6 +162,7 @@
       - minrust
       - cross
       - tsan
+      - miri
       - loom
     runs-on: ubuntu-latest
     steps:
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/.gitignore b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/.gitignore
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/.gitignore
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/.gitignore
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/CHANGELOG.md b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/CHANGELOG.md
similarity index 97%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/CHANGELOG.md
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/CHANGELOG.md
index 93c1419c..91c0fa4 100644
--- a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/CHANGELOG.md
+++ b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/CHANGELOG.md
@@ -1,3 +1,17 @@
+# 1.7.2 (September 17, 2024)
+
+### Fixed
+
+- Fix default impl of `Buf::{get_int, get_int_le}` (#732)
+
+### Documented
+
+- Fix double spaces in comments and doc comments (#731)
+
+### Internal changes
+
+- Ensure BytesMut::advance reduces capacity (#728) 
+
 # 1.7.1 (August 1, 2024)
 
 This release reverts the following change due to a regression:
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/Cargo.toml
new file mode 100644
index 0000000..286c891
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/Cargo.toml
@@ -0,0 +1,120 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies.
+#
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
+
+[package]
+edition = "2018"
+rust-version = "1.39"
+name = "bytes"
+version = "1.7.2"
+authors = [
+    "Carl Lerche <me@carllerche.com>",
+    "Sean McArthur <sean@seanmonstar.com>",
+]
+build = false
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
+description = "Types and traits for working with bytes"
+readme = "README.md"
+keywords = [
+    "buffers",
+    "zero-copy",
+    "io",
+]
+categories = [
+    "network-programming",
+    "data-structures",
+]
+license = "MIT"
+repository = "https://github.com/tokio-rs/bytes"
+
+[package.metadata.docs.rs]
+rustdoc-args = [
+    "--cfg",
+    "docsrs",
+]
+
+[lib]
+name = "bytes"
+path = "src/lib.rs"
+
+[[test]]
+name = "test_buf"
+path = "tests/test_buf.rs"
+
+[[test]]
+name = "test_buf_mut"
+path = "tests/test_buf_mut.rs"
+
+[[test]]
+name = "test_bytes"
+path = "tests/test_bytes.rs"
+
+[[test]]
+name = "test_bytes_odd_alloc"
+path = "tests/test_bytes_odd_alloc.rs"
+
+[[test]]
+name = "test_bytes_vec_alloc"
+path = "tests/test_bytes_vec_alloc.rs"
+
+[[test]]
+name = "test_chain"
+path = "tests/test_chain.rs"
+
+[[test]]
+name = "test_debug"
+path = "tests/test_debug.rs"
+
+[[test]]
+name = "test_iter"
+path = "tests/test_iter.rs"
+
+[[test]]
+name = "test_reader"
+path = "tests/test_reader.rs"
+
+[[test]]
+name = "test_serde"
+path = "tests/test_serde.rs"
+
+[[test]]
+name = "test_take"
+path = "tests/test_take.rs"
+
+[[bench]]
+name = "buf"
+path = "benches/buf.rs"
+
+[[bench]]
+name = "bytes"
+path = "benches/bytes.rs"
+
+[[bench]]
+name = "bytes_mut"
+path = "benches/bytes_mut.rs"
+
+[dependencies.serde]
+version = "1.0.60"
+features = ["alloc"]
+optional = true
+default-features = false
+
+[dev-dependencies.serde_test]
+version = "1.0"
+
+[features]
+default = ["std"]
+std = []
+
+[target."cfg(loom)".dev-dependencies.loom]
+version = "0.7"
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/Cargo.toml.orig
similarity index 97%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/Cargo.toml.orig
index e072539..8083901a 100644
--- a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/Cargo.toml.orig
@@ -4,7 +4,7 @@
 # When releasing to crates.io:
 # - Update CHANGELOG.md.
 # - Create "v1.x.y" git tag.
-version = "1.7.1"
+version = "1.7.2"
 edition = "2018"
 rust-version = "1.39"
 license = "MIT"
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/LICENSE b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/LICENSE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/LICENSE
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/LICENSE
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/README.md b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/README.md
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/SECURITY.md b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/SECURITY.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/SECURITY.md
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/SECURITY.md
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/benches/buf.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/benches/buf.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/benches/buf.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/benches/buf.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/benches/bytes.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/benches/bytes.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/benches/bytes.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/benches/bytes.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/benches/bytes_mut.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/benches/bytes_mut.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/benches/bytes_mut.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/benches/bytes_mut.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/ci/miri.sh b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/ci/miri.sh
similarity index 66%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/ci/miri.sh
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/ci/miri.sh
index 0158756..7df29f3 100755
--- a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/ci/miri.sh
+++ b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/ci/miri.sh
@@ -1,8 +1,7 @@
 #!/bin/bash
 set -e
 
-rustup toolchain install nightly --component miri
-rustup override set nightly
+rustup component add miri
 cargo miri setup
 
 export MIRIFLAGS="-Zmiri-strict-provenance"
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/ci/test-stable.sh b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/ci/test-stable.sh
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/ci/test-stable.sh
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/ci/test-stable.sh
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/ci/tsan.sh b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/ci/tsan.sh
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/ci/tsan.sh
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/ci/tsan.sh
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/clippy.toml b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/clippy.toml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/clippy.toml
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/clippy.toml
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/buf_impl.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/buf_impl.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/buf_impl.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/buf_impl.rs
index c44d4fb..9ef4640 100644
--- a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/buf_impl.rs
+++ b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/buf_impl.rs
@@ -66,6 +66,12 @@
     }};
 }
 
+// https://en.wikipedia.org/wiki/Sign_extension
+fn sign_extend(val: u64, nbytes: usize) -> i64 {
+    let shift = (8 - nbytes) * 8;
+    (val << shift) as i64 >> shift
+}
+
 /// Read bytes from a buffer.
 ///
 /// A buffer stores bytes in memory such that read operations are infallible.
@@ -923,7 +929,7 @@
     /// This function panics if there is not enough remaining data in `self`, or
     /// if `nbytes` is greater than 8.
     fn get_int(&mut self, nbytes: usize) -> i64 {
-        buf_get_impl!(be => self, i64, nbytes);
+        sign_extend(self.get_uint(nbytes), nbytes)
     }
 
     /// Gets a signed n-byte integer from `self` in little-endian byte order.
@@ -944,7 +950,7 @@
     /// This function panics if there is not enough remaining data in `self`, or
     /// if `nbytes` is greater than 8.
     fn get_int_le(&mut self, nbytes: usize) -> i64 {
-        buf_get_impl!(le => self, i64, nbytes);
+        sign_extend(self.get_uint_le(nbytes), nbytes)
     }
 
     /// Gets a signed n-byte integer from `self` in native-endian byte order.
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/buf_mut.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/buf_mut.rs
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/buf_mut.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/buf_mut.rs
index e13278d2..2a3b5e9e 100644
--- a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/buf_mut.rs
+++ b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/buf_mut.rs
@@ -1107,7 +1107,7 @@
         }
     }
 
-    /// Writes  an IEEE754 single-precision (4 bytes) floating point number to
+    /// Writes an IEEE754 single-precision (4 bytes) floating point number to
     /// `self` in big-endian byte order.
     ///
     /// The current position is advanced by 4.
@@ -1131,7 +1131,7 @@
         self.put_u32(n.to_bits());
     }
 
-    /// Writes  an IEEE754 single-precision (4 bytes) floating point number to
+    /// Writes an IEEE754 single-precision (4 bytes) floating point number to
     /// `self` in little-endian byte order.
     ///
     /// The current position is advanced by 4.
@@ -1183,7 +1183,7 @@
         self.put_u32_ne(n.to_bits());
     }
 
-    /// Writes  an IEEE754 double-precision (8 bytes) floating point number to
+    /// Writes an IEEE754 double-precision (8 bytes) floating point number to
     /// `self` in big-endian byte order.
     ///
     /// The current position is advanced by 8.
@@ -1207,7 +1207,7 @@
         self.put_u64(n.to_bits());
     }
 
-    /// Writes  an IEEE754 double-precision (8 bytes) floating point number to
+    /// Writes an IEEE754 double-precision (8 bytes) floating point number to
     /// `self` in little-endian byte order.
     ///
     /// The current position is advanced by 8.
@@ -1231,7 +1231,7 @@
         self.put_u64_le(n.to_bits());
     }
 
-    /// Writes  an IEEE754 double-precision (8 bytes) floating point number to
+    /// Writes an IEEE754 double-precision (8 bytes) floating point number to
     /// `self` in native-endian byte order.
     ///
     /// The current position is advanced by 8.
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/chain.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/chain.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/chain.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/chain.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/iter.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/iter.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/iter.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/iter.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/limit.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/limit.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/limit.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/limit.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/mod.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/reader.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/reader.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/reader.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/reader.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/take.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/take.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/take.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/take.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/uninit_slice.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/uninit_slice.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/uninit_slice.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/uninit_slice.rs
index 82ebdbb..aea096ae 100644
--- a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/uninit_slice.rs
+++ b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/uninit_slice.rs
@@ -110,7 +110,7 @@
         unsafe { self[index..].as_mut_ptr().write(byte) }
     }
 
-    /// Copies bytes  from `src` into `self`.
+    /// Copies bytes from `src` into `self`.
     ///
     /// The length of `src` must be the same as `self`.
     ///
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/vec_deque.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/vec_deque.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/vec_deque.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/vec_deque.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/writer.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/writer.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/buf/writer.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/buf/writer.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/bytes.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/bytes.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/bytes.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/bytes.rs
index e0c33b3..ec95e802 100644
--- a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/bytes.rs
+++ b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/bytes.rs
@@ -142,6 +142,7 @@
         Bytes::from_static(EMPTY)
     }
 
+    /// Creates a new empty `Bytes`.
     #[cfg(all(loom, test))]
     pub fn new() -> Self {
         const EMPTY: &[u8] = &[];
@@ -172,6 +173,7 @@
         }
     }
 
+    /// Creates a new `Bytes` from a static slice.
     #[cfg(all(loom, test))]
     pub fn from_static(bytes: &'static [u8]) -> Self {
         Bytes {
@@ -1301,7 +1303,7 @@
     offset: *const u8,
     len: usize,
 ) -> Bytes {
-    // If  the buffer is still tracked in a `Vec<u8>`. It is time to
+    // If the buffer is still tracked in a `Vec<u8>`. It is time to
     // promote the vec to an `Arc`. This could potentially be called
     // concurrently, so some care must be taken.
 
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/bytes_mut.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/bytes_mut.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/bytes_mut.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/bytes_mut.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/fmt/debug.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/fmt/debug.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/fmt/debug.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/fmt/debug.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/fmt/hex.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/fmt/hex.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/fmt/hex.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/fmt/hex.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/fmt/mod.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/fmt/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/fmt/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/fmt/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/lib.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/lib.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/loom.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/loom.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/loom.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/loom.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/serde.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/serde.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/src/serde.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/src/serde.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_buf.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_buf.rs
similarity index 86%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_buf.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_buf.rs
index 3940f92..5aadea43 100644
--- a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_buf.rs
+++ b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_buf.rs
@@ -37,6 +37,19 @@
 }
 
 #[test]
+fn test_get_int() {
+    let mut buf = &b"\xd6zomg"[..];
+    assert_eq!(-42, buf.get_int(1));
+    let mut buf = &b"\xd6zomg"[..];
+    assert_eq!(-42, buf.get_int_le(1));
+
+    let mut buf = &b"\xfe\x1d\xc0zomg"[..];
+    assert_eq!(0xffffffffffc01dfeu64 as i64, buf.get_int_le(3));
+    let mut buf = &b"\xfe\x1d\xc0zomg"[..];
+    assert_eq!(0xfffffffffffe1dc0u64 as i64, buf.get_int(3));
+}
+
+#[test]
 #[should_panic]
 fn test_get_u16_buffer_underflow() {
     let mut buf = &b"\x21"[..];
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_buf_mut.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_buf_mut.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_buf_mut.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_buf_mut.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_bytes.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_bytes.rs
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_bytes.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_bytes.rs
index 8e5d0ae1..59c967b 100644
--- a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_bytes.rs
+++ b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_bytes.rs
@@ -676,6 +676,43 @@
     assert_eq!(a, b"d zomg wat wat"[..]);
 }
 
+// Ensures BytesMut::advance reduces always capacity
+//
+// See https://github.com/tokio-rs/bytes/issues/725
+#[test]
+fn advance_bytes_mut_remaining_capacity() {
+    // reduce the search space under miri
+    let max_capacity = if cfg!(miri) { 16 } else { 256 };
+    for capacity in 0..=max_capacity {
+        for len in 0..=capacity {
+            for advance in 0..=len {
+                eprintln!("testing capacity={capacity}, len={len}, advance={advance}");
+                let mut buf = BytesMut::with_capacity(capacity);
+
+                buf.resize(len, 42);
+                assert_eq!(buf.len(), len, "resize should write `len` bytes");
+                assert_eq!(
+                    buf.remaining(),
+                    len,
+                    "Buf::remaining() should equal BytesMut::len"
+                );
+
+                buf.advance(advance);
+                assert_eq!(
+                    buf.remaining(),
+                    len - advance,
+                    "Buf::advance should reduce the remaining len"
+                );
+                assert_eq!(
+                    buf.capacity(),
+                    capacity - advance,
+                    "Buf::advance should reduce the remaining capacity"
+                );
+            }
+        }
+    }
+}
+
 #[test]
 #[should_panic]
 fn advance_past_len() {
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_bytes_odd_alloc.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_bytes_odd_alloc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_bytes_odd_alloc.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_bytes_odd_alloc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_bytes_vec_alloc.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_bytes_vec_alloc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_bytes_vec_alloc.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_bytes_vec_alloc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_chain.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_chain.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_chain.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_chain.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_debug.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_debug.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_debug.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_debug.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_iter.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_iter.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_iter.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_iter.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_reader.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_reader.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_reader.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_reader.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_serde.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_serde.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_serde.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_serde.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_take.rs b/third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_take.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/bytes-1.7.1/tests/test_take.rs
rename to third_party/rust/chromium_crates_io/vendor/bytes-1.7.2/tests/test_take.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/cc-1.1.20/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/cc-1.1.23/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cc-1.1.20/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/cc-1.1.23/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/cc-1.1.20/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/cc-1.1.23/Cargo.toml
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/cc-1.1.20/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/cc-1.1.23/Cargo.toml
index d2b1be7..35580dc 100644
--- a/third_party/rust/chromium_crates_io/vendor/cc-1.1.20/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/cc-1.1.23/Cargo.toml
@@ -10,7 +10,7 @@
 
 [package]
 name = "cc"
-version = "1.1.20"
+version = "1.1.23"
 
 [features]
 "jobserver" = []
diff --git a/third_party/rust/chromium_crates_io/vendor/cc-1.1.20/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/cc-1.1.23/src/lib.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/cc-1.1.20/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/cc-1.1.23/src/lib.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/.cargo_vcs_info.json
deleted file mode 100644
index bdb89f31..0000000
--- a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "11d05bdaec5f2ff9e5d1a8aed555958789f4cef8"
-  },
-  "path_in_vcs": ""
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/.cargo_vcs_info.json
new file mode 100644
index 0000000..63b4a3e5
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "e16928adc9496537794ce9ae93a55558b45db77a"
+  },
+  "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/Cargo.toml
similarity index 87%
rename from third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/Cargo.toml
index 9d31e895..18ca4565 100644
--- a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/Cargo.toml
@@ -13,14 +13,19 @@
 edition = "2021"
 rust-version = "1.57.0"
 name = "fdeflate"
-version = "0.3.4"
+version = "0.3.5"
 authors = ["The image-rs Developers"]
+build = false
 include = [
     "/src",
     "README.md",
     "LICENSE-APACHE",
     "LICENSE-MIT",
 ]
+autobins = false
+autoexamples = false
+autotests = false
+autobenches = false
 description = "Fast specialized deflate implementation"
 homepage = "https://github.com/image-rs/fdeflate"
 documentation = "https://docs.rs/fdeflate"
@@ -29,6 +34,10 @@
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/image-rs/fdeflate"
 
+[lib]
+name = "fdeflate"
+path = "src/lib.rs"
+
 [dependencies.simd-adler32]
 version = "0.3.4"
 
diff --git a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/Cargo.toml.orig
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/Cargo.toml.orig
index 59910ff..8578eee 100644
--- a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "fdeflate"
-version = "0.3.4"
+version = "0.3.5"
 edition = "2021"
 
 # note: when changed, also update test runner in `.github/workflows/rust.yml`
diff --git a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/README.md b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/README.md
rename to third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/compress.rs b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/compress.rs
similarity index 90%
rename from third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/compress.rs
rename to third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/compress.rs
index 027d0ef..b55116e 100644
--- a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/compress.rs
+++ b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/compress.rs
@@ -1,8 +1,5 @@
 use simd_adler32::Adler32;
-use std::{
-    convert::TryInto,
-    io::{self, Seek, SeekFrom, Write},
-};
+use std::io::{self, Seek, SeekFrom, Write};
 
 use crate::tables::{
     BITMASKS, HUFFMAN_CODES, HUFFMAN_LENGTHS, LENGTH_TO_LEN_EXTRA, LENGTH_TO_SYMBOL,
@@ -82,32 +79,13 @@
     }
 
     fn write_headers(&mut self) -> io::Result<()> {
-        self.write_bits(0x0178, 16)?; // zlib header
-
-        self.write_bits(0b1, 1)?; // BFINAL
-        self.write_bits(0b10, 2)?; // Dynamic Huffman block
-
-        self.write_bits((HUFFMAN_LENGTHS.len() - 257) as u64, 5)?; // # of length / literal codes
-        self.write_bits(0, 5)?; // 1 distance code
-        self.write_bits(15, 4)?; // 16 code length codes
-
-        // Write code lengths for code length alphabet
-        for _ in 0..3 {
-            self.write_bits(0, 3)?;
-        }
-        for _ in 0..16 {
-            self.write_bits(4, 3)?;
-        }
-
-        // Write code lengths for length/literal alphabet
-        for &len in &HUFFMAN_LENGTHS {
-            self.write_bits((len.reverse_bits() >> 4) as u64, 4)?;
-        }
-
-        // Write code lengths for distance alphabet
-        for _ in 0..1 {
-            self.write_bits(0b1000, 4)?;
-        }
+        const HEADER: [u8; 54] = [
+            120, 1, 237, 192, 3, 160, 36, 89, 150, 198, 241, 255, 119, 238, 141, 200, 204, 167,
+            114, 75, 99, 174, 109, 219, 182, 109, 219, 182, 109, 219, 182, 109, 105, 140, 158, 150,
+            74, 175, 158, 50, 51, 34, 238, 249, 118, 183, 106, 122, 166, 135, 59, 107, 213, 15,
+        ];
+        self.writer.write_all(&HEADER[..53]).unwrap();
+        self.write_bits(HEADER[53] as u64, 5)?;
 
         Ok(())
     }
diff --git a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/decompress.rs b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/decompress.rs
similarity index 93%
rename from third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/decompress.rs
rename to third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/decompress.rs
index cc2628eb..f89747e3 100644
--- a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/decompress.rs
+++ b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/decompress.rs
@@ -1,5 +1,3 @@
-use std::convert::TryInto;
-
 use simd_adler32::Adler32;
 
 use crate::tables::{
@@ -193,7 +191,7 @@
     fn fill_buffer(&mut self, input: &mut &[u8]) {
         if input.len() >= 8 {
             self.buffer |= u64::from_le_bytes(input[..8].try_into().unwrap()) << self.nbits;
-            *input = &mut &input[(63 - self.nbits as usize) / 8..];
+            *input = &input[(63 - self.nbits as usize) / 8..];
             self.nbits |= 56;
         } else {
             let nbytes = input.len().min((63 - self.nbits as usize) / 8);
@@ -203,7 +201,7 @@
                 .checked_shl(self.nbits as u32)
                 .unwrap_or(0);
             self.nbits += nbytes as u8 * 8;
-            *input = &mut &input[nbytes..];
+            *input = &input[nbytes..];
         }
     }
 
@@ -410,6 +408,12 @@
         compression: &mut CompressedBlock,
         max_search_bits: u8,
     ) -> Result<(), DecompressionError> {
+        // If there is no code assigned for the EOF symbol then the bitstream is invalid.
+        if code_lengths[256] == 0 {
+            // TODO: Return a dedicated error in this case.
+            return Err(DecompressionError::BadLiteralLengthHuffmanTree);
+        }
+
         // Build the literal/length code table.
         let lengths = &code_lengths[..288];
         let codes: [u16; 288] = crate::compute_codes(&lengths.try_into().unwrap())
@@ -745,7 +749,7 @@
                     (dist_entry >> 8) as u8,
                     dist_entry as u8,
                 )
-            } else {
+            } else if self.nbits > litlen_code_bits + length_extra_bits + 9 {
                 let mut dist_extra_bits = 0;
                 let mut dist_base = 0;
                 let mut dist_advance_bits = 0;
@@ -763,6 +767,8 @@
                     return Err(DecompressionError::InvalidDistanceCode);
                 }
                 (dist_base, dist_extra_bits, dist_advance_bits)
+            } else {
+                break;
             };
             bits >>= dist_code_bits;
 
@@ -1068,7 +1074,7 @@
 
 #[cfg(test)]
 mod tests {
-    use crate::tables::{self, LENGTH_TO_LEN_EXTRA, LENGTH_TO_SYMBOL};
+    use crate::tables::{LENGTH_TO_LEN_EXTRA, LENGTH_TO_SYMBOL};
 
     use super::*;
     use rand::Rng;
@@ -1084,7 +1090,7 @@
         let decompressed = decompress_to_vec(&compressed).unwrap();
         assert_eq!(decompressed.len(), data.len());
         for (i, (a, b)) in decompressed.chunks(1).zip(data.chunks(1)).enumerate() {
-            assert_eq!(a, b, "chunk {}..{}", i * 1, i * 1 + 1);
+            assert_eq!(a, b, "chunk {}..{}", i, i + 1);
         }
         assert_eq!(&decompressed, data);
     }
@@ -1095,8 +1101,8 @@
         //     .bytes()
         //     .collect::<Result<Vec<_>, _>>()
         //     .unwrap();
-        let decompressed = decompress_to_vec(&data).unwrap();
-        let decompressed2 = miniz_oxide::inflate::decompress_to_vec_zlib(&data).unwrap();
+        let decompressed = decompress_to_vec(data).unwrap();
+        let decompressed2 = miniz_oxide::inflate::decompress_to_vec_zlib(data).unwrap();
         for i in 0..decompressed.len().min(decompressed2.len()) {
             if decompressed[i] != decompressed2[i] {
                 panic!(
@@ -1171,7 +1177,7 @@
 
     #[test]
     fn constant() {
-        roundtrip_miniz_oxide(&vec![0; 50]);
+        roundtrip_miniz_oxide(&[0; 50]);
         roundtrip_miniz_oxide(&vec![5; 2048]);
         roundtrip_miniz_oxide(&vec![128; 2048]);
         roundtrip_miniz_oxide(&vec![254; 2048]);
@@ -1267,4 +1273,62 @@
             assert_eq!(output_written, 0);
         }
     }
+
+    mod test_utils;
+    use test_utils::{decompress_by_chunks, TestDecompressionError};
+
+    fn verify_no_sensitivity_to_input_chunking(
+        input: &[u8],
+    ) -> Result<Vec<u8>, TestDecompressionError> {
+        let r_whole = decompress_by_chunks(input, vec![input.len()], false);
+        let r_bytewise = decompress_by_chunks(input, std::iter::repeat(1), false);
+        assert_eq!(r_whole, r_bytewise);
+        r_whole // Returning an arbitrary result, since this is equal to `r_bytewise`.
+    }
+
+    /// This is a regression test found by the `buf_independent` fuzzer from the `png` crate.  When
+    /// this test case was found, the results were unexpectedly different when 1) decompressing the
+    /// whole input (successful result) vs 2) decompressing byte-by-byte
+    /// (`Err(InvalidDistanceCode)`).
+    #[test]
+    fn test_input_chunking_sensitivity_when_handling_distance_codes() {
+        let result = verify_no_sensitivity_to_input_chunking(include_bytes!(
+            "../tests/input-chunking-sensitivity-example1.zz"
+        ))
+        .unwrap();
+        assert_eq!(result.len(), 281);
+        assert_eq!(simd_adler32::adler32(&result.as_slice()), 751299);
+    }
+
+    /// This is a regression test found by the `inflate_bytewise3` fuzzer from the `fdeflate`
+    /// crate.  When this test case was found, the results were unexpectedly different when 1)
+    /// decompressing the whole input (`Err(DistanceTooFarBack)`) vs 2) decompressing byte-by-byte
+    /// (successful result)`).
+    #[test]
+    fn test_input_chunking_sensitivity_when_no_end_of_block_symbol_example1() {
+        let err = verify_no_sensitivity_to_input_chunking(include_bytes!(
+            "../tests/input-chunking-sensitivity-example2.zz"
+        ))
+        .unwrap_err();
+        assert_eq!(
+            err,
+            TestDecompressionError::ProdError(DecompressionError::BadLiteralLengthHuffmanTree)
+        );
+    }
+
+    /// This is a regression test found by the `inflate_bytewise3` fuzzer from the `fdeflate`
+    /// crate.  When this test case was found, the results were unexpectedly different when 1)
+    /// decompressing the whole input (`Err(InvalidDistanceCode)`) vs 2) decompressing byte-by-byte
+    /// (successful result)`).
+    #[test]
+    fn test_input_chunking_sensitivity_when_no_end_of_block_symbol_example2() {
+        let err = verify_no_sensitivity_to_input_chunking(include_bytes!(
+            "../tests/input-chunking-sensitivity-example3.zz"
+        ))
+        .unwrap_err();
+        assert_eq!(
+            err,
+            TestDecompressionError::ProdError(DecompressionError::BadLiteralLengthHuffmanTree)
+        );
+    }
 }
diff --git a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/decompress/tests/test_utils.rs b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/decompress/tests/test_utils.rs
new file mode 100644
index 0000000..bcec96ba
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/decompress/tests/test_utils.rs
@@ -0,0 +1,101 @@
+//! Testing utilities for testing `fdeflate::Decompressor`.
+//!
+//! These utilities are used by:
+//!
+//! * Unit tests (e.g. `#[test]` tests in `src/decompress.rs`)
+//! * Fuzzers (e.g. `fuzz/fuzz_targets/inflate_bytewise3.rs`)
+
+#[cfg(test)]
+use crate as fdeflate;
+
+use fdeflate::{DecompressionError, Decompressor};
+
+#[derive(Debug, PartialEq)]
+pub enum TestDecompressionError {
+    ProdError(DecompressionError),
+    TestError(TestErrorKind),
+}
+
+#[derive(Debug, Eq, PartialEq)]
+pub enum TestErrorKind {
+    OutputTooLarge,
+    TooManyIterations,
+}
+
+impl From<DecompressionError> for TestDecompressionError {
+    fn from(e: DecompressionError) -> Self {
+        Self::ProdError(e)
+    }
+}
+
+impl From<TestErrorKind> for TestDecompressionError {
+    fn from(kind: TestErrorKind) -> Self {
+        Self::TestError(kind)
+    }
+}
+
+/// Decompresses `input` when feeding it into a `Decompressor::read` in `chunks`.
+///
+/// `chunks` typically can be used to decode the whole input at once (setting `chunks` to
+/// `vec![input.len]`) or byte-by-byte (setting `chunks` to `std::iter::repeat(1)`).
+/// But `chunks` can also be used to replicate arbitrary chunking patterns (such as may be
+/// used by some fuzzing-based repros from the `png` crate).
+///
+/// `early_eof` is used to the last `end_of_input` argument of `Decompressor::read` calls.
+/// When `early_eof` is `false`, then `end_of_input` is `false` until the whole input is
+/// consumed (and then is `Decompressor::is_done` is still false, then `Decompressor::read`
+/// is called one or more times with empty input slice and `end_of_input` set to true).
+/// When `early_eof` is `true` then `end_of_input` is set to `true` as soon as the slice
+/// fed to `Decompressor::read` "reaches" the end of the whole input.
+///
+/// Unlike the `png` crate, this testing helper uses a big, fixed-size output buffer.
+/// (i.e. there is no simulation of `ZlibStream.compact_out_buffer_if_needed` from the `png`
+/// crate).
+pub fn decompress_by_chunks(
+    input: &[u8],
+    chunks: impl IntoIterator<Item = usize>,
+    early_eof: bool,
+) -> Result<Vec<u8>, TestDecompressionError> {
+    let mut chunks = chunks.into_iter();
+
+    // `iteration_counter` helps to prevent infinite loops (which may happen with `chunks` such
+    // as `std::iter::repeat(0)`).
+    let mut iteration_counter = 0;
+
+    // Ignoring checksums so that we can work with inputs generated by fuzzing.  (Fuzzing
+    // typically ignores checksums to make it easier to explore the space of possible inputs.)
+    let mut d = Decompressor::new();
+    d.ignore_adler32();
+
+    let mut out_buf = vec![0; 1_000_000];
+    let mut in_pos = 0;
+    let mut out_pos = 0;
+    while !d.is_done() {
+        iteration_counter += 1;
+        if iteration_counter > 5000 {
+            return Err(TestErrorKind::TooManyIterations.into());
+        }
+
+        let chunk_size = chunks.next().unwrap_or(0);
+        let start = in_pos;
+        let end = std::cmp::min(start + chunk_size, input.len());
+
+        let eof = if early_eof {
+            end == input.len()
+        } else {
+            start == input.len()
+        };
+
+        let (in_consumed, out_written) =
+            d.read(&input[start..end], out_buf.as_mut_slice(), out_pos, eof)?;
+
+        in_pos += in_consumed;
+        out_pos += out_written;
+        if out_pos == out_buf.len() && in_consumed == 0 && !d.is_done() {
+            return Err(TestErrorKind::OutputTooLarge.into());
+        }
+    }
+
+    out_buf.resize(out_pos, 0xFF);
+    Ok(out_buf)
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/lib.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/lib.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/tables.rs b/third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/tables.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/tables.rs
rename to third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/tables.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/.cargo_vcs_info.json
deleted file mode 100644
index 400c5269..0000000
--- a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "50852c6138789b255d5b2dfea2abb1a1dda99e99"
-  },
-  "path_in_vcs": ""
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/.cargo_vcs_info.json
new file mode 100644
index 0000000..de98063
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "1a28821dc116dac14178858be056e4a58ef8f501"
+  },
+  "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/CHANGELOG.md b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/CHANGELOG.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/CHANGELOG.md
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/CHANGELOG.md
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/Cargo.lock
similarity index 95%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/Cargo.lock
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/Cargo.lock
index ed1ee99d..589dce6 100644
--- a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/Cargo.lock
@@ -52,7 +52,7 @@
 
 [[package]]
 name = "flate2"
-version = "1.0.33"
+version = "1.0.34"
 dependencies = [
  "cloudflare-zlib-sys",
  "crc32fast",
@@ -93,9 +93,9 @@
 
 [[package]]
 name = "libz-rs-sys"
-version = "0.2.1"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ec231cd2039ed0e15e72467a2eabcdf6ff103e8a95e01eb8e2fb6f4c0661be7"
+checksum = "b6fe3b2b1132d0a04912e2ea4f1196212562ba7775abe9f3b32d49489b17b75d"
 dependencies = [
  "zlib-rs",
 ]
@@ -193,6 +193,6 @@
 
 [[package]]
 name = "zlib-rs"
-version = "0.2.1"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e942bb8453553ee59b701f977d5331a512f8dd07906153bbe050cb9bb58a4811"
+checksum = "4bf919c619da9eaede02291295e9c5ae230fc7b5f2a5f4257ff859b075111faf"
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/Cargo.toml
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/Cargo.toml
index 1970fe9..ae38f5c 100644
--- a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2018"
 rust-version = "1.56.1"
 name = "flate2"
-version = "1.0.33"
+version = "1.0.34"
 authors = [
     "Alex Crichton <alex@alexcrichton.com>",
     "Josh Triplett <josh@joshtriplett.org>",
@@ -177,7 +177,7 @@
 optional = true
 
 [dependencies.libz-rs-sys]
-version = "0.2.1"
+version = "0.3.0"
 features = [
     "std",
     "rust-allocator",
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/Cargo.toml.orig
similarity index 90%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/Cargo.toml.orig
index 47c7421d..1d79413d 100644
--- a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/Cargo.toml.orig
@@ -1,7 +1,7 @@
 [package]
 name = "flate2"
 authors = ["Alex Crichton <alex@alexcrichton.com>", "Josh Triplett <josh@joshtriplett.org>"]
-version = "1.0.33"
+version = "1.0.34"
 edition = "2018"
 license = "MIT OR Apache-2.0"
 readme = "README.md"
@@ -21,7 +21,8 @@
 [dependencies]
 libz-sys = { version = "1.1.20", optional = true, default-features = false }
 libz-ng-sys = { version = "1.1.16", optional = true }
-libz-rs-sys = { version = "0.2.1", optional = true, default-features = false, features = ["std", "rust-allocator"] }
+# this matches the default features, but we don't want to depend on the default features staying the same
+libz-rs-sys = { version = "0.3.0", optional = true, default-features = false, features = ["std", "rust-allocator"] }
 cloudflare-zlib-sys = { version = "0.3.0", optional = true }
 miniz_oxide = { version = "0.8.0", optional = true, default-features = false, features = ["with-alloc"] }
 crc32fast = "1.2.0"
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/MAINTENANCE.md b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/MAINTENANCE.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/MAINTENANCE.md
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/MAINTENANCE.md
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/README.md b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/README.md
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/compress_file.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/compress_file.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/compress_file.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/compress_file.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/decompress_file.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/decompress_file.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/decompress_file.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/decompress_file.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/deflatedecoder-bufread.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/deflatedecoder-bufread.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/deflatedecoder-bufread.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/deflatedecoder-bufread.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/deflatedecoder-read.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/deflatedecoder-read.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/deflatedecoder-read.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/deflatedecoder-read.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/deflatedecoder-write.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/deflatedecoder-write.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/deflatedecoder-write.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/deflatedecoder-write.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/deflateencoder-bufread.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/deflateencoder-bufread.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/deflateencoder-bufread.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/deflateencoder-bufread.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/deflateencoder-read.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/deflateencoder-read.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/deflateencoder-read.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/deflateencoder-read.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/deflateencoder-write.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/deflateencoder-write.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/deflateencoder-write.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/deflateencoder-write.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzbuilder.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzbuilder.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzbuilder.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzbuilder.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzdecoder-bufread.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzdecoder-bufread.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzdecoder-bufread.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzdecoder-bufread.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzdecoder-read.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzdecoder-read.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzdecoder-read.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzdecoder-read.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzdecoder-write.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzdecoder-write.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzdecoder-write.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzdecoder-write.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzencoder-bufread.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzencoder-bufread.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzencoder-bufread.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzencoder-bufread.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzencoder-read.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzencoder-read.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzencoder-read.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzencoder-read.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzencoder-write.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzencoder-write.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzencoder-write.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzencoder-write.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzmultidecoder-bufread.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzmultidecoder-bufread.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzmultidecoder-bufread.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzmultidecoder-bufread.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzmultidecoder-read.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzmultidecoder-read.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/gzmultidecoder-read.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/gzmultidecoder-read.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/hello_world.txt b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/hello_world.txt
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/hello_world.txt
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/hello_world.txt
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/hello_world.txt.gz b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/hello_world.txt.gz
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/hello_world.txt.gz
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/hello_world.txt.gz
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/zlibdecoder-bufread.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/zlibdecoder-bufread.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/zlibdecoder-bufread.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/zlibdecoder-bufread.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/zlibdecoder-read.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/zlibdecoder-read.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/zlibdecoder-read.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/zlibdecoder-read.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/zlibdecoder-write.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/zlibdecoder-write.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/zlibdecoder-write.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/zlibdecoder-write.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/zlibencoder-bufread.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/zlibencoder-bufread.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/zlibencoder-bufread.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/zlibencoder-bufread.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/zlibencoder-read.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/zlibencoder-read.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/zlibencoder-read.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/zlibencoder-read.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/zlibencoder-write.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/zlibencoder-write.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/examples/zlibencoder-write.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/examples/zlibencoder-write.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/bufreader.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/bufreader.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/bufreader.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/bufreader.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/crc.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/crc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/crc.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/crc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/deflate/bufread.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/deflate/bufread.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/deflate/bufread.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/deflate/bufread.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/deflate/mod.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/deflate/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/deflate/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/deflate/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/deflate/read.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/deflate/read.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/deflate/read.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/deflate/read.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/deflate/write.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/deflate/write.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/deflate/write.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/deflate/write.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/ffi/c.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/ffi/c.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/ffi/c.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/ffi/c.rs
index 867f2f9..05e5017 100644
--- a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/ffi/c.rs
+++ b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/ffi/c.rs
@@ -447,7 +447,7 @@
     #[cfg(feature = "zlib-ng")]
     const ZLIB_VERSION: &'static str = "2.1.0.devel\0";
     #[cfg(all(not(feature = "zlib-ng"), feature = "zlib-rs"))]
-    const ZLIB_VERSION: &'static str = "0.1.0\0";
+    const ZLIB_VERSION: &'static str = "1.3.0-zlib-rs-0.3.0\0";
     #[cfg(not(any(feature = "zlib-ng", feature = "zlib-rs")))]
     const ZLIB_VERSION: &'static str = "1.2.8\0";
 
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/ffi/mod.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/ffi/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/ffi/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/ffi/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/ffi/rust.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/ffi/rust.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/ffi/rust.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/ffi/rust.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/gz/bufread.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/gz/bufread.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/gz/bufread.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/gz/bufread.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/gz/mod.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/gz/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/gz/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/gz/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/gz/read.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/gz/read.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/gz/read.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/gz/read.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/gz/write.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/gz/write.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/gz/write.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/gz/write.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/lib.rs
similarity index 92%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/lib.rs
index d286ba2..c827413 100644
--- a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/lib.rs
+++ b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/lib.rs
@@ -192,6 +192,18 @@
     ///
     /// The integer here is typically on a scale of 0-9 where 0 means "no
     /// compression" and 9 means "take as long as you'd like".
+    ///
+    /// ### Backend differences
+    ///
+    /// The [`miniz_oxide`](https://crates.io/crates/miniz_oxide) backend for flate2
+    /// does not support level 0 or `Compression::none()`. Instead it interprets them
+    /// as the default compression level, which is quite slow.
+    /// `Compression::fast()` should be used instead.
+    ///
+    /// `miniz_oxide` also supports a non-compliant compression level 10.
+    /// It is even slower and may result in higher compression, but
+    /// **only miniz_oxide will be able to read the data** compressed with level 10.
+    /// Do **not** use level 10 if you need other software to be able to read it!
     pub const fn new(level: u32) -> Compression {
         Compression(level)
     }
@@ -213,7 +225,7 @@
     }
 
     /// Returns an integer representing the compression level, typically on a
-    /// scale of 0-9
+    /// scale of 0-9. See [`new`](Self::new) for details about compression levels.
     pub fn level(&self) -> u32 {
         self.0
     }
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/mem.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/mem.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/mem.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/mem.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zio.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zio.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zio.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zio.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zlib/bufread.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zlib/bufread.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zlib/bufread.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zlib/bufread.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zlib/mod.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zlib/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zlib/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zlib/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zlib/read.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zlib/read.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zlib/read.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zlib/read.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zlib/write.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zlib/write.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zlib/write.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zlib/write.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/corrupt-gz-file.bin b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/corrupt-gz-file.bin
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/corrupt-gz-file.bin
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/corrupt-gz-file.bin
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/early-flush.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/early-flush.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/early-flush.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/early-flush.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/empty-read.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/empty-read.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/empty-read.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/empty-read.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/good-file.gz b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/good-file.gz
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/good-file.gz
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/good-file.gz
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/good-file.txt b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/good-file.txt
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/good-file.txt
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/good-file.txt
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/gunzip.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/gunzip.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/gunzip.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/gunzip.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/multi.gz b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/multi.gz
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/multi.gz
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/multi.gz
Binary files differ
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/multi.txt b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/multi.txt
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/multi.txt
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/multi.txt
diff --git a/third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/zero-write.rs b/third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/zero-write.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/tests/zero-write.rs
rename to third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/tests/zero-write.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/.cargo_vcs_info.json
deleted file mode 100644
index 5f6f5ea0..0000000
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "c809c58c6873c05c9aa8cb3b9142f6c4d2818e57"
-  },
-  "path_in_vcs": ""
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/align.rs
deleted file mode 100644
index 4fdba9a6..0000000
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/align.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-s! {
-    #[repr(align(4))]
-    pub struct in6_addr {
-        pub s6_addr: [u8; 16],
-    }
-}
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/no_align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/no_align.rs
deleted file mode 100644
index f6b9f4c..0000000
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/no_align.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-s! {
-    pub struct in6_addr {
-        pub s6_addr: [u8; 16],
-        __align: [u32; 0],
-    }
-}
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/.cargo_vcs_info.json
new file mode 100644
index 0000000..9d2cedf
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "7373a1abe57da20efae9fd2ca891d7b905c19e03"
+  },
+  "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/.gitignore b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/.gitignore
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/.gitignore
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/.gitignore
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/.release-plz.toml b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/.release-plz.toml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/.release-plz.toml
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/.release-plz.toml
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/CHANGELOG.md b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/CHANGELOG.md
similarity index 61%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/CHANGELOG.md
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/CHANGELOG.md
index a5ac002..01c340a 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/CHANGELOG.md
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/CHANGELOG.md
@@ -2,6 +2,37 @@
 
 ## [Unreleased]
 
+## [0.2.159](https://github.com/rust-lang/libc/compare/0.2.158...0.2.159) - 2024-09-24
+
+### Added
+
+- Android: add more `AT_*` constants in <https://github.com/rust-lang/libc/pull/3779>
+- Apple: add missing `NOTE_*` constants in <https://github.com/rust-lang/libc/pull/3883>
+- Hermit: add missing error numbers in <https://github.com/rust-lang/libc/pull/3858>
+- Hurd: add `__timeval` for 64-bit support in <https://github.com/rust-lang/libc/pull/3786>
+- Linux: add `epoll_pwait2` in <https://github.com/rust-lang/libc/pull/3868>
+- Linux: add `mq_notify` in <https://github.com/rust-lang/libc/pull/3849>
+- Linux: add missing `NFT_CT_*` constants in <https://github.com/rust-lang/libc/pull/3844>
+- Linux: add the `fchmodat2` syscall in <https://github.com/rust-lang/libc/pull/3588>
+- Linux: add the `mseal` syscall in <https://github.com/rust-lang/libc/pull/3798>
+- OpenBSD: add `sendmmsg` and `recvmmsg` in <https://github.com/rust-lang/libc/pull/3831>
+- Unix: add `IN6ADDR_ANY_INIT` and `IN6ADDR_LOOPBACK_INIT` in <https://github.com/rust-lang/libc/pull/3693>
+- VxWorks: add `S_ISVTX` in <https://github.com/rust-lang/libc/pull/3768>
+- VxWorks: add `vxCpuLib` and `taskLib` functions <https://github.com/rust-lang/libc/pull/3861>
+- WASIp2: add definitions for `std::net` support in <https://github.com/rust-lang/libc/pull/3892>
+
+### Fixed
+
+- Correctly handle version checks when `clippy-driver` is used <https://github.com/rust-lang/libc/pull/3893>
+
+### Changed
+
+- EspIdf: change signal constants to c_int in <https://github.com/rust-lang/libc/pull/3895>
+- HorizonOS: update network definitions in <https://github.com/rust-lang/libc/pull/3863>
+- Linux: combine `ioctl` APIs in <https://github.com/rust-lang/libc/pull/3722>
+- WASI: enable CI testing in <https://github.com/rust-lang/libc/pull/3869>
+- WASIp2: enable CI testing in <https://github.com/rust-lang/libc/pull/3870>
+
 ## [0.2.158](https://github.com/rust-lang/libc/compare/0.2.157...0.2.158) - 2024-08-19
 
 ### Other
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/CONTRIBUTING.md b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/CONTRIBUTING.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/CONTRIBUTING.md
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/CONTRIBUTING.md
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/Cargo.toml
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/Cargo.toml
index cef9122..7f56824 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/Cargo.toml
@@ -11,7 +11,7 @@
 
 [package]
 name = "libc"
-version = "0.2.158"
+version = "0.2.159"
 authors = ["The Rust Project Developers"]
 build = "build.rs"
 exclude = [
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/Cargo.toml.orig
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/Cargo.toml.orig
index 8fe2ad6..3ca0827 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "libc"
-version = "0.2.158"
+version = "0.2.159"
 authors = ["The Rust Project Developers"]
 license = "MIT OR Apache-2.0"
 readme = "README.md"
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/README.md b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/README.md
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/build.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/build.rs
similarity index 91%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/build.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/build.rs
index 076bbc0..ce4541e6 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/build.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/build.rs
@@ -1,5 +1,5 @@
 use std::env;
-use std::process::Command;
+use std::process::{Command, Output};
 use std::str;
 
 // List of cfgs this build script is allowed to set. The list is needed to support check-cfg, as we
@@ -30,6 +30,7 @@
     "libc_thread_local",
     "libc_underscore_const_names",
     "libc_union",
+    "libc_ctest",
 ];
 
 // Extra values to allow for check-cfg.
@@ -193,6 +194,41 @@
     }
 }
 
+/// Run `rustc --version` and capture the output, adjusting arguments as needed if `clippy-driver`
+/// is used instead.
+fn rustc_version_cmd(is_clippy_driver: bool) -> Output {
+    let rustc = env::var_os("RUSTC").expect("Failed to get rustc version: missing RUSTC env");
+
+    let mut cmd = match env::var_os("RUSTC_WRAPPER") {
+        Some(ref wrapper) if wrapper.is_empty() => Command::new(rustc),
+        Some(wrapper) => {
+            let mut cmd = Command::new(wrapper);
+            cmd.arg(rustc);
+            if is_clippy_driver {
+                cmd.arg("--rustc");
+            }
+
+            cmd
+        }
+        None => Command::new(rustc),
+    };
+
+    cmd.arg("--version");
+
+    let output = cmd.output().ok().expect("Failed to get rustc version");
+
+    if !output.status.success() {
+        panic!(
+            "failed to run rustc: {}",
+            String::from_utf8_lossy(output.stderr.as_slice())
+        );
+    }
+
+    output
+}
+
+/// Return the minor version of `rustc`, as well as a bool indicating whether or not the version
+/// is a nightly.
 fn rustc_minor_nightly() -> (u32, bool) {
     macro_rules! otry {
         ($e:expr) => {
@@ -203,29 +239,14 @@
         };
     }
 
-    let rustc = env::var_os("RUSTC").expect("Failed to get rustc version: missing RUSTC env");
-    let mut cmd = match env::var_os("RUSTC_WRAPPER").as_ref() {
-        Some(wrapper) if !wrapper.is_empty() => {
-            let mut cmd = Command::new(wrapper);
-            cmd.arg(rustc);
-            cmd
-        }
-        _ => Command::new(rustc),
-    };
+    let mut output = rustc_version_cmd(false);
 
-    let output = cmd
-        .arg("--version")
-        .output()
-        .ok()
-        .expect("Failed to get rustc version");
-    if !output.status.success() {
-        panic!(
-            "failed to run rustc: {}",
-            String::from_utf8_lossy(output.stderr.as_slice())
-        );
+    if otry!(str::from_utf8(&output.stdout).ok()).starts_with("clippy") {
+        output = rustc_version_cmd(true);
     }
 
     let version = otry!(str::from_utf8(&output.stdout).ok());
+
     let mut pieces = version.split('.');
 
     if pieces.next() != Some("rustc 1") {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/rustfmt.toml b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/rustfmt.toml
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/rustfmt.toml
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/rustfmt.toml
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fixed_width_ints.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fixed_width_ints.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fixed_width_ints.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fixed_width_ints.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/aarch64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/aarch64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/aarch64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/aarch64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/no_align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/no_align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/no_align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/no_align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/riscv64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/riscv64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/riscv64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/riscv64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/x86_64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/x86_64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/x86_64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/hermit.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/hermit.rs
similarity index 74%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/hermit.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/hermit.rs
index 145d1241..77df54ae 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/hermit.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/hermit.rs
@@ -267,6 +267,140 @@
 
 pub const TCP_NODELAY: i32 = 1;
 
+pub const EPERM: i32 = 1;
+pub const ENOENT: i32 = 2;
+pub const ESRCH: i32 = 3;
+pub const EINTR: i32 = 4;
+pub const EIO: i32 = 5;
+pub const ENXIO: i32 = 6;
+pub const E2BIG: i32 = 7;
+pub const ENOEXEC: i32 = 8;
+pub const EBADF: i32 = 9;
+pub const ECHILD: i32 = 10;
+pub const EAGAIN: i32 = 11;
+pub const ENOMEM: i32 = 12;
+pub const EACCES: i32 = 13;
+pub const EFAULT: i32 = 14;
+pub const ENOTBLK: i32 = 15;
+pub const EBUSY: i32 = 16;
+pub const EEXIST: i32 = 17;
+pub const EXDEV: i32 = 18;
+pub const ENODEV: i32 = 19;
+pub const ENOTDIR: i32 = 20;
+pub const EISDIR: i32 = 21;
+pub const EINVAL: i32 = 22;
+pub const ENFILE: i32 = 23;
+pub const EMFILE: i32 = 24;
+pub const ENOTTY: i32 = 25;
+pub const ETXTBSY: i32 = 26;
+pub const EFBIG: i32 = 27;
+pub const ENOSPC: i32 = 28;
+pub const ESPIPE: i32 = 29;
+pub const EROFS: i32 = 30;
+pub const EMLINK: i32 = 31;
+pub const EPIPE: i32 = 32;
+pub const EDOM: i32 = 33;
+pub const ERANGE: i32 = 34;
+pub const EDEADLK: i32 = 35;
+pub const ENAMETOOLONG: i32 = 36;
+pub const ENOLCK: i32 = 37;
+pub const ENOSYS: i32 = 38;
+pub const ENOTEMPTY: i32 = 39;
+pub const ELOOP: i32 = 40;
+pub const EWOULDBLOCK: i32 = EAGAIN;
+pub const ENOMSG: i32 = 42;
+pub const EIDRM: i32 = 43;
+pub const ECHRNG: i32 = 44;
+pub const EL2NSYNC: i32 = 45;
+pub const EL3HLT: i32 = 46;
+pub const EL3RST: i32 = 47;
+pub const ELNRNG: i32 = 48;
+pub const EUNATCH: i32 = 49;
+pub const ENOCSI: i32 = 50;
+pub const EL2HLT: i32 = 51;
+pub const EBADE: i32 = 52;
+pub const EBADR: i32 = 53;
+pub const EXFULL: i32 = 54;
+pub const ENOANO: i32 = 55;
+pub const EBADRQC: i32 = 56;
+pub const EBADSLT: i32 = 57;
+pub const EDEADLOCK: i32 = EDEADLK;
+pub const EBFONT: i32 = 59;
+pub const ENOSTR: i32 = 60;
+pub const ENODATA: i32 = 61;
+pub const ETIME: i32 = 62;
+pub const ENOSR: i32 = 63;
+pub const ENONET: i32 = 64;
+pub const ENOPKG: i32 = 65;
+pub const EREMOTE: i32 = 66;
+pub const ENOLINK: i32 = 67;
+pub const EADV: i32 = 68;
+pub const ESRMNT: i32 = 69;
+pub const ECOMM: i32 = 70;
+pub const EPROTO: i32 = 71;
+pub const EMULTIHOP: i32 = 72;
+pub const EDOTDOT: i32 = 73;
+pub const EBADMSG: i32 = 74;
+pub const EOVERFLOW: i32 = 75;
+pub const ENOTUNIQ: i32 = 76;
+pub const EBADFD: i32 = 77;
+pub const EREMCHG: i32 = 78;
+pub const ELIBACC: i32 = 79;
+pub const ELIBBAD: i32 = 80;
+pub const ELIBSCN: i32 = 81;
+pub const ELIBMAX: i32 = 82;
+pub const ELIBEXEC: i32 = 83;
+pub const EILSEQ: i32 = 84;
+pub const ERESTART: i32 = 85;
+pub const ESTRPIPE: i32 = 86;
+pub const EUSERS: i32 = 87;
+pub const ENOTSOCK: i32 = 88;
+pub const EDESTADDRREQ: i32 = 89;
+pub const EMSGSIZE: i32 = 90;
+pub const EPROTOTYPE: i32 = 91;
+pub const ENOPROTOOPT: i32 = 92;
+pub const EPROTONOSUPPORT: i32 = 93;
+pub const ESOCKTNOSUPPORT: i32 = 94;
+pub const EOPNOTSUPP: i32 = 95;
+pub const EPFNOSUPPORT: i32 = 96;
+pub const EAFNOSUPPORT: i32 = 97;
+pub const EADDRINUSE: i32 = 98;
+pub const EADDRNOTAVAIL: i32 = 99;
+pub const ENETDOWN: i32 = 100;
+pub const ENETUNREACH: i32 = 101;
+pub const ENETRESET: i32 = 102;
+pub const ECONNABORTED: i32 = 103;
+pub const ECONNRESET: i32 = 104;
+pub const ENOBUFS: i32 = 105;
+pub const EISCONN: i32 = 106;
+pub const ENOTCONN: i32 = 107;
+pub const ESHUTDOWN: i32 = 108;
+pub const ETOOMANYREFS: i32 = 109;
+pub const ETIMEDOUT: i32 = 110;
+pub const ECONNREFUSED: i32 = 111;
+pub const EHOSTDOWN: i32 = 112;
+pub const EHOSTUNREACH: i32 = 113;
+pub const EALREADY: i32 = 114;
+pub const EINPROGRESS: i32 = 115;
+pub const ESTALE: i32 = 116;
+pub const EUCLEAN: i32 = 117;
+pub const ENOTNAM: i32 = 118;
+pub const ENAVAIL: i32 = 119;
+pub const EISNAM: i32 = 120;
+pub const EREMOTEIO: i32 = 121;
+pub const EDQUOT: i32 = 122;
+pub const ENOMEDIUM: i32 = 123;
+pub const EMEDIUMTYPE: i32 = 124;
+pub const ECANCELED: i32 = 125;
+pub const ENOKEY: i32 = 126;
+pub const EKEYEXPIRED: i32 = 127;
+pub const EKEYREVOKED: i32 = 128;
+pub const EKEYREJECTED: i32 = 129;
+pub const EOWNERDEAD: i32 = 130;
+pub const ENOTRECOVERABLE: i32 = 131;
+pub const ERFKILL: i32 = 132;
+pub const EHWPOISON: i32 = 133;
+
 extern "C" {
     #[link_name = "sys_alloc"]
     pub fn alloc(size: usize, align: usize) -> *mut u8;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/lib.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/lib.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/macros.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/macros.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/macros.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/macros.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/psp.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/psp.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/psp.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/psp.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/sgx.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/sgx.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/sgx.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/sgx.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/solid/aarch64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/solid/aarch64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/solid/aarch64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/solid/aarch64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/solid/arm.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/solid/arm.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/solid/arm.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/solid/arm.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/solid/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/solid/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/solid/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/solid/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/switch.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/switch.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/switch.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/switch.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/teeos/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/teeos/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/teeos/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/teeos/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/aix/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/aix/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/aix/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/aix/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/aix/powerpc64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/aix/powerpc64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/aix/powerpc64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/aix/powerpc64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/align.rs
new file mode 100644
index 0000000..2e7c954c
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/align.rs
@@ -0,0 +1,14 @@
+s! {
+    #[repr(align(4))]
+    pub struct in6_addr {
+        pub s6_addr: [u8; 16],
+    }
+}
+
+pub const IN6ADDR_LOOPBACK_INIT: in6_addr = in6_addr {
+    s6_addr: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
+};
+
+pub const IN6ADDR_ANY_INIT: in6_addr = in6_addr {
+    s6_addr: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+};
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b32/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b32/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b32/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b32/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b32/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b32/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b32/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/aarch64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/aarch64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/aarch64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/aarch64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/aarch64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/aarch64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/aarch64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/aarch64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/x86_64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/x86_64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/x86_64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/x86_64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/x86_64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/x86_64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/x86_64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/long_array.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/long_array.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/long_array.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/long_array.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/mod.rs
index 06b6c62..92d7240 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/mod.rs
@@ -4522,6 +4522,8 @@
 pub const NOTE_LEEWAY: u32 = 0x00000010;
 pub const NOTE_CRITICAL: u32 = 0x00000020;
 pub const NOTE_BACKGROUND: u32 = 0x00000040;
+pub const NOTE_MACH_CONTINUOUS_TIME: u32 = 0x00000080;
+pub const NOTE_MACHTIME: u32 = 0x00000100;
 pub const NOTE_TRACK: u32 = 0x00000001;
 pub const NOTE_TRACKERR: u32 = 0x00000002;
 pub const NOTE_CHILD: u32 = 0x00000004;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/dragonfly/errno.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/dragonfly/errno.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/dragonfly/errno.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/dragonfly/errno.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/dragonfly/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/dragonfly/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/dragonfly/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/dragonfly/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/aarch64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/aarch64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/aarch64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/aarch64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/arm.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/arm.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/arm.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/arm.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd15/b64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd15/b64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd15/b64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd15/b64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd15/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd15/x86_64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd15/x86_64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd15/x86_64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/powerpc.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/powerpc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/powerpc.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/powerpc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/riscv64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/riscv64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/riscv64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/riscv64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/x86.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/x86.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/x86.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/x86.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/mod.rs
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/mod.rs
index e92cf659..dcd3582 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/mod.rs
@@ -92,6 +92,11 @@
         pub piod_addr: *mut ::c_void,
         pub piod_len: ::size_t,
     }
+
+    pub struct mmsghdr {
+        pub msg_hdr: ::msghdr,
+        pub msg_len: ::c_uint,
+    }
 }
 
 pub const D_T_FMT: ::nl_item = 0;
@@ -848,6 +853,20 @@
     pub fn dirname(path: *mut ::c_char) -> *mut ::c_char;
     pub fn basename(path: *mut ::c_char) -> *mut ::c_char;
     pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int;
+
+    pub fn sendmmsg(
+        sockfd: ::c_int,
+        mmsg: *mut ::mmsghdr,
+        vlen: ::c_uint,
+        flags: ::c_int,
+    ) -> ::c_int;
+    pub fn recvmmsg(
+        sockfd: ::c_int,
+        mmsg: *mut ::mmsghdr,
+        vlen: ::c_uint,
+        flags: ::c_int,
+        timeout: *mut ::timespec,
+    ) -> ::c_int;
 }
 
 cfg_if! {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/aarch64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/aarch64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/aarch64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/aarch64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/arm.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/arm.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/arm.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/arm.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/mips.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/mips.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/mips.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/mips.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/mod.rs
index 0ad2473..0517a47 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/mod.rs
@@ -401,11 +401,6 @@
         pub sdl_data: [::c_char; 12],
     }
 
-    pub struct mmsghdr {
-        pub msg_hdr: ::msghdr,
-        pub msg_len: ::c_uint,
-    }
-
     pub struct __exit_status {
         pub e_termination: u16,
         pub e_exit: u16,
@@ -2781,20 +2776,6 @@
 
     pub fn kqueue1(flags: ::c_int) -> ::c_int;
 
-    pub fn sendmmsg(
-        sockfd: ::c_int,
-        msgvec: *mut ::mmsghdr,
-        vlen: ::c_uint,
-        flags: ::c_int,
-    ) -> ::c_int;
-    pub fn recvmmsg(
-        sockfd: ::c_int,
-        msgvec: *mut ::mmsghdr,
-        vlen: ::c_uint,
-        flags: ::c_int,
-        timeout: *mut ::timespec,
-    ) -> ::c_int;
-
     pub fn _lwp_self() -> lwpid_t;
     pub fn memmem(
         haystack: *const ::c_void,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/powerpc.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/powerpc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/powerpc.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/powerpc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/riscv64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/riscv64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/riscv64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/riscv64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/sparc64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/sparc64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/sparc64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/sparc64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/x86.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/x86.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/x86.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/x86.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/x86_64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/x86_64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/x86_64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/aarch64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/aarch64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/aarch64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/aarch64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/arm.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/arm.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/arm.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/arm.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/mips64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/mips64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/mips64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/mips64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/powerpc.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/powerpc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/powerpc.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/powerpc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/riscv64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/riscv64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/riscv64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/riscv64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/sparc64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/sparc64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/sparc64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/sparc64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/x86.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/x86.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/x86.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/x86.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/x86_64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/x86_64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/x86_64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/b32.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/b32.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/b32.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/b32.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/b64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/b64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/b64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/b64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/native.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/native.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/native.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/native.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/x86_64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/x86_64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/x86_64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/b32.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/b32.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/b32.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/b32.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/b64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/b64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/b64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/b64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/mod.rs
index 71f1ac8d9..ad422fe 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/mod.rs
@@ -450,6 +450,11 @@
         pub tv_nsec: __syscall_slong_t,
     }
 
+    pub struct __timeval {
+        pub tv_sec: i32,
+        pub tv_usec: i32,
+    }
+
     pub struct __locale_data {
         pub _address: u8,
     }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/no_align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/no_align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/no_align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/no_align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/arm.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/arm.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/arm.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/arm.rs
index a062175..c4c78939 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/arm.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/arm.rs
@@ -533,6 +533,9 @@
 
 pub const NGREG: ::c_int = 18;
 
+// From NDK's asm/auxvec.h
+pub const AT_SYSINFO_EHDR: ::c_ulong = 33;
+
 f! {
     // Sadly, Android before 5.0 (API level 21), the accept4 syscall is not
     // exposed by the libc. As work-around, we implement it through `syscall`
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/x86/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/x86/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/x86/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/x86/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/x86/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/x86/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/x86/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/x86/mod.rs
index e549f3b5..64ce93dd 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/x86/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/x86/mod.rs
@@ -585,6 +585,11 @@
 pub const REG_UESP: ::c_int = 17;
 pub const REG_SS: ::c_int = 18;
 
+// From NDK's asm/auxvec.h
+pub const AT_SYSINFO: ::c_ulong = 32;
+pub const AT_SYSINFO_EHDR: ::c_ulong = 33;
+pub const AT_VECTOR_SIZE_ARCH: ::c_ulong = 3;
+
 // socketcall values from linux/net.h (only the needed ones, and not public)
 const SYS_ACCEPT4: ::c_int = 18;
 
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/aarch64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/aarch64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/aarch64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/aarch64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/aarch64/int128.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/aarch64/int128.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/aarch64/int128.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/aarch64/int128.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/aarch64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/aarch64/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/aarch64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/aarch64/mod.rs
index 7b87a1d4..bd3146de 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/aarch64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/aarch64/mod.rs
@@ -417,6 +417,10 @@
 pub const PROT_BTI: ::c_int = 0x10;
 pub const PROT_MTE: ::c_int = 0x20;
 
+// From NDK's asm/auxvec.h
+pub const AT_SYSINFO_EHDR: ::c_ulong = 33;
+pub const AT_VECTOR_SIZE_ARCH: ::c_ulong = 2;
+
 cfg_if! {
     if #[cfg(libc_align)] {
         mod align;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/mod.rs
similarity index 91%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/mod.rs
index 9639e1b..97cf137 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/mod.rs
@@ -264,32 +264,6 @@
 pub const RTLD_NOW: ::c_int = 2;
 pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void;
 
-// From NDK's linux/auxvec.h
-pub const AT_NULL: ::c_ulong = 0;
-pub const AT_IGNORE: ::c_ulong = 1;
-pub const AT_EXECFD: ::c_ulong = 2;
-pub const AT_PHDR: ::c_ulong = 3;
-pub const AT_PHENT: ::c_ulong = 4;
-pub const AT_PHNUM: ::c_ulong = 5;
-pub const AT_PAGESZ: ::c_ulong = 6;
-pub const AT_BASE: ::c_ulong = 7;
-pub const AT_FLAGS: ::c_ulong = 8;
-pub const AT_ENTRY: ::c_ulong = 9;
-pub const AT_NOTELF: ::c_ulong = 10;
-pub const AT_UID: ::c_ulong = 11;
-pub const AT_EUID: ::c_ulong = 12;
-pub const AT_GID: ::c_ulong = 13;
-pub const AT_EGID: ::c_ulong = 14;
-pub const AT_PLATFORM: ::c_ulong = 15;
-pub const AT_HWCAP: ::c_ulong = 16;
-pub const AT_CLKTCK: ::c_ulong = 17;
-pub const AT_SECURE: ::c_ulong = 23;
-pub const AT_BASE_PLATFORM: ::c_ulong = 24;
-pub const AT_RANDOM: ::c_ulong = 25;
-pub const AT_HWCAP2: ::c_ulong = 26;
-pub const AT_EXECFN: ::c_ulong = 31;
-pub const AT_MINSIGSTKSZ: ::c_ulong = 51;
-
 pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t {
     value: 0,
     __reserved: [0; 36],
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/riscv64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/riscv64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/riscv64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/riscv64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/riscv64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/riscv64/mod.rs
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/riscv64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/riscv64/mod.rs
index 9d414dc..209f050f 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/riscv64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/riscv64/mod.rs
@@ -345,6 +345,18 @@
 pub const SYS_fspick: ::c_long = 433;
 pub const SYS_syscalls: ::c_long = 436;
 
+// From NDK's asm/auxvec.h
+pub const AT_SYSINFO_EHDR: ::c_ulong = 33;
+pub const AT_L1I_CACHESIZE: ::c_ulong = 40;
+pub const AT_L1I_CACHEGEOMETRY: ::c_ulong = 41;
+pub const AT_L1D_CACHESIZE: ::c_ulong = 42;
+pub const AT_L1D_CACHEGEOMETRY: ::c_ulong = 43;
+pub const AT_L2_CACHESIZE: ::c_ulong = 44;
+pub const AT_L2_CACHEGEOMETRY: ::c_ulong = 45;
+pub const AT_L3_CACHESIZE: ::c_ulong = 46;
+pub const AT_L3_CACHEGEOMETRY: ::c_ulong = 47;
+pub const AT_VECTOR_SIZE_ARCH: ::c_ulong = 9;
+
 cfg_if! {
     if #[cfg(libc_align)] {
         mod align;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/x86_64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/x86_64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/x86_64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/x86_64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/x86_64/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/x86_64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/x86_64/mod.rs
index be6b501..a736330 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/x86_64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/x86_64/mod.rs
@@ -794,6 +794,10 @@
 pub const REG_OLDMASK: ::c_int = 21;
 pub const REG_CR2: ::c_int = 22;
 
+// From NDK's asm/auxvec.h
+pub const AT_SYSINFO_EHDR: ::c_ulong = 33;
+pub const AT_VECTOR_SIZE_ARCH: ::c_ulong = 3;
+
 cfg_if! {
     if #[cfg(libc_align)] {
         mod align;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/mod.rs
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/mod.rs
index a9cc594..a8e9359 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/mod.rs
@@ -2572,6 +2572,14 @@
 pub const NFT_CT_LABELS: ::c_int = 13;
 pub const NFT_CT_PKTS: ::c_int = 14;
 pub const NFT_CT_BYTES: ::c_int = 15;
+pub const NFT_CT_AVGPKT: ::c_int = 16;
+pub const NFT_CT_ZONE: ::c_int = 17;
+pub const NFT_CT_EVENTMASK: ::c_int = 18;
+pub const NFT_CT_SRC_IP: ::c_int = 19;
+pub const NFT_CT_DST_IP: ::c_int = 20;
+pub const NFT_CT_SRC_IP6: ::c_int = 21;
+pub const NFT_CT_DST_IP6: ::c_int = 22;
+pub const NFT_CT_ID: ::c_int = 23;
 
 pub const NFT_LIMIT_PKTS: ::c_int = 0;
 pub const NFT_LIMIT_PKT_BYTES: ::c_int = 1;
@@ -3535,6 +3543,34 @@
 pub const KLOG_SIZE_UNREAD: ::c_int = 9;
 pub const KLOG_SIZE_BUFFER: ::c_int = 10;
 
+// From NDK's linux/auxvec.h
+pub const AT_NULL: ::c_ulong = 0;
+pub const AT_IGNORE: ::c_ulong = 1;
+pub const AT_EXECFD: ::c_ulong = 2;
+pub const AT_PHDR: ::c_ulong = 3;
+pub const AT_PHENT: ::c_ulong = 4;
+pub const AT_PHNUM: ::c_ulong = 5;
+pub const AT_PAGESZ: ::c_ulong = 6;
+pub const AT_BASE: ::c_ulong = 7;
+pub const AT_FLAGS: ::c_ulong = 8;
+pub const AT_ENTRY: ::c_ulong = 9;
+pub const AT_NOTELF: ::c_ulong = 10;
+pub const AT_UID: ::c_ulong = 11;
+pub const AT_EUID: ::c_ulong = 12;
+pub const AT_GID: ::c_ulong = 13;
+pub const AT_EGID: ::c_ulong = 14;
+pub const AT_PLATFORM: ::c_ulong = 15;
+pub const AT_HWCAP: ::c_ulong = 16;
+pub const AT_CLKTCK: ::c_ulong = 17;
+pub const AT_SECURE: ::c_ulong = 23;
+pub const AT_BASE_PLATFORM: ::c_ulong = 24;
+pub const AT_RANDOM: ::c_ulong = 25;
+pub const AT_HWCAP2: ::c_ulong = 26;
+pub const AT_RSEQ_FEATURE_SIZE: ::c_ulong = 27;
+pub const AT_RSEQ_ALIGN: ::c_ulong = 28;
+pub const AT_EXECFN: ::c_ulong = 31;
+pub const AT_MINSIGSTKSZ: ::c_ulong = 51;
+
 // Most `*_SUPER_MAGIC` constants are defined at the `linux_like` level; the
 // following are only available on newer Linux versions than the versions
 // currently used in CI in some configurations, so we define them here.
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/emscripten/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/emscripten/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/emscripten/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/emscripten/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/emscripten/lfs64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/emscripten/lfs64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/emscripten/lfs64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/emscripten/lfs64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/emscripten/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/emscripten/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/emscripten/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/emscripten/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/emscripten/no_align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/emscripten/no_align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/emscripten/no_align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/emscripten/no_align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/generic/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/generic/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/generic/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/generic/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/mips/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/mips/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/mips/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/mips/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/powerpc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/powerpc/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/powerpc/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/powerpc/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/sparc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/sparc/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/sparc/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/sparc/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/arm/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/arm/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/arm/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/arm/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/arm/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/arm/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/arm/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/arm/mod.rs
index 89c93ab..4a14d692 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/arm/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/arm/mod.rs
@@ -855,6 +855,7 @@
 pub const SYS_process_mrelease: ::c_long = 448;
 pub const SYS_futex_waitv: ::c_long = 449;
 pub const SYS_set_mempolicy_home_node: ::c_long = 450;
+pub const SYS_mseal: ::c_long = 462;
 
 cfg_if! {
     if #[cfg(libc_align)] {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/csky/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/csky/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/csky/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/csky/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/csky/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/csky/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/csky/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/csky/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/m68k/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/m68k/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/m68k/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/m68k/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/mips/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/mips/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/mips/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/mips/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/mips/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/mips/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/mips/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/mips/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/powerpc.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/powerpc.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/powerpc.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/powerpc.rs
index dd5732e..cb7fdf7 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/powerpc.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/powerpc.rs
@@ -823,3 +823,4 @@
 pub const SYS_process_mrelease: ::c_long = 448;
 pub const SYS_futex_waitv: ::c_long = 449;
 pub const SYS_set_mempolicy_home_node: ::c_long = 450;
+pub const SYS_mseal: ::c_long = 462;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/riscv32/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/riscv32/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/riscv32/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/riscv32/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/sparc/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/sparc/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/sparc/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/sparc/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/x86/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/x86/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/x86/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/x86/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/x86/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/x86/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/x86/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/x86/mod.rs
index 27f477b..4391eb3 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/x86/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/x86/mod.rs
@@ -1044,6 +1044,8 @@
 pub const SYS_process_mrelease: ::c_long = 448;
 pub const SYS_futex_waitv: ::c_long = 449;
 pub const SYS_set_mempolicy_home_node: ::c_long = 450;
+pub const SYS_fchmodat2: ::c_long = 452;
+pub const SYS_mseal: ::c_long = 462;
 
 // offsets in user_regs_structs, from sys/reg.h
 pub const EBX: ::c_int = 0;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/fallback.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/fallback.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/fallback.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/fallback.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs
index 284a1788..c8a805cd 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs
@@ -892,6 +892,7 @@
 pub const SYS_process_mrelease: ::c_long = 448;
 pub const SYS_futex_waitv: ::c_long = 449;
 pub const SYS_set_mempolicy_home_node: ::c_long = 450;
+pub const SYS_mseal: ::c_long = 462;
 
 pub const PROT_BTI: ::c_int = 0x10;
 pub const PROT_MTE: ::c_int = 0x20;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/mips64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/mips64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/mips64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/mips64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/riscv64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/riscv64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/riscv64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/riscv64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/s390x.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/s390x.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/s390x.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/s390x.rs
index 61ee2dc..e85429e 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/s390x.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/s390x.rs
@@ -946,6 +946,7 @@
 pub const SYS_process_mrelease: ::c_long = 448;
 pub const SYS_futex_waitv: ::c_long = 449;
 pub const SYS_set_mempolicy_home_node: ::c_long = 450;
+pub const SYS_mseal: ::c_long = 462;
 
 extern "C" {
 
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/sparc64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/sparc64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/sparc64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/sparc64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs
index 3831dfad..9b37907 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs
@@ -438,6 +438,8 @@
 pub const SYS_process_mrelease: ::c_long = 448;
 pub const SYS_futex_waitv: ::c_long = 449;
 pub const SYS_set_mempolicy_home_node: ::c_long = 450;
+pub const SYS_fchmodat2: ::c_long = 452;
+pub const SYS_mseal: ::c_long = 462;
 
 extern "C" {
     pub fn sysctl(
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs
index 06aa0da..90745b176 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs
@@ -366,6 +366,7 @@
 pub const SYS_process_mrelease: ::c_long = __X32_SYSCALL_BIT + 448;
 pub const SYS_futex_waitv: ::c_long = __X32_SYSCALL_BIT + 449;
 pub const SYS_set_mempolicy_home_node: ::c_long = __X32_SYSCALL_BIT + 450;
+pub const SYS_fchmodat2: ::c_long = __X32_SYSCALL_BIT + 452;
 pub const SYS_rt_sigaction: ::c_long = __X32_SYSCALL_BIT + 512;
 pub const SYS_rt_sigreturn: ::c_long = __X32_SYSCALL_BIT + 513;
 pub const SYS_ioctl: ::c_long = __X32_SYSCALL_BIT + 514;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/mod.rs
index d6e5eb69..75d150c 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/mod.rs
@@ -1405,7 +1405,6 @@
     pub fn reallocarray(ptr: *mut ::c_void, nmemb: ::size_t, size: ::size_t) -> *mut ::c_void;
 
     pub fn ctermid(s: *mut ::c_char) -> *mut ::c_char;
-    pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int;
     pub fn backtrace(buf: *mut *mut ::c_void, sz: ::c_int) -> ::c_int;
     pub fn glob64(
         pattern: *const ::c_char,
@@ -1541,6 +1540,16 @@
 
     // Added in `glibc` 2.34
     pub fn close_range(first: ::c_uint, last: ::c_uint, flags: ::c_int) -> ::c_int;
+
+    pub fn mq_notify(mqdes: ::mqd_t, sevp: *const ::sigevent) -> ::c_int;
+
+    pub fn epoll_pwait2(
+        epfd: ::c_int,
+        events: *mut ::epoll_event,
+        maxevents: ::c_int,
+        timeout: *const ::timespec,
+        sigmask: *const ::sigset_t,
+    ) -> ::c_int;
 }
 
 cfg_if! {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/no_align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/no_align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/no_align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/no_align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/mod.rs
index 779faa8..1973b3f 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/mod.rs
@@ -3980,6 +3980,13 @@
 pub const NFT_CT_LABELS: ::c_int = 13;
 pub const NFT_CT_PKTS: ::c_int = 14;
 pub const NFT_CT_BYTES: ::c_int = 15;
+pub const NFT_CT_AVGPKT: ::c_int = 16;
+pub const NFT_CT_ZONE: ::c_int = 17;
+pub const NFT_CT_EVENTMASK: ::c_int = 18;
+pub const NFT_CT_SRC_IP: ::c_int = 19;
+pub const NFT_CT_DST_IP: ::c_int = 20;
+pub const NFT_CT_SRC_IP6: ::c_int = 21;
+pub const NFT_CT_DST_IP6: ::c_int = 22;
 
 pub const NFT_LIMIT_PKTS: ::c_int = 0;
 pub const NFT_LIMIT_PKT_BYTES: ::c_int = 1;
@@ -5628,6 +5635,8 @@
     ) -> ::ssize_t;
 
     pub fn klogctl(syslog_type: ::c_int, bufp: *mut ::c_char, len: ::c_int) -> ::c_int;
+
+    pub fn ioctl(fd: ::c_int, request: ::Ioctl, ...) -> ::c_int;
 }
 
 // LFS64 extensions
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/arm/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/arm/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/arm/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/arm/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/arm/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/arm/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/arm/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/arm/mod.rs
index 8225f26a..4ac3e60 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/arm/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/arm/mod.rs
@@ -840,6 +840,7 @@
 pub const SYS_process_mrelease: ::c_long = 448;
 pub const SYS_futex_waitv: ::c_long = 449;
 pub const SYS_set_mempolicy_home_node: ::c_long = 450;
+pub const SYS_mseal: ::c_long = 462;
 
 extern "C" {
     pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/hexagon.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/hexagon.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/hexagon.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/hexagon.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/mips/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/mips/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/mips/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/mips/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/mips/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/mips/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/mips/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/mips/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/powerpc.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/powerpc.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/powerpc.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/powerpc.rs
index bdf2545..834a442 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/powerpc.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/powerpc.rs
@@ -796,6 +796,7 @@
 pub const SYS_process_mrelease: ::c_long = 448;
 pub const SYS_futex_waitv: ::c_long = 449;
 pub const SYS_set_mempolicy_home_node: ::c_long = 450;
+pub const SYS_mseal: ::c_long = 462;
 
 extern "C" {
     pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/riscv32/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/riscv32/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/riscv32/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/riscv32/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/x86/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/x86/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/x86/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/x86/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/x86/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/x86/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/x86/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/x86/mod.rs
index 1228085..7fad0467 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/x86/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/x86/mod.rs
@@ -936,6 +936,7 @@
 pub const SYS_process_mrelease: ::c_long = 448;
 pub const SYS_futex_waitv: ::c_long = 449;
 pub const SYS_set_mempolicy_home_node: ::c_long = 450;
+pub const SYS_fchmodat2: ::c_long = 452;
 
 // offsets in user_regs_structs, from sys/reg.h
 pub const EBX: ::c_int = 0;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/aarch64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/aarch64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/aarch64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/aarch64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/aarch64/int128.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/aarch64/int128.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/aarch64/int128.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/aarch64/int128.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs
index 54e072b..24e6b84 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs
@@ -561,6 +561,7 @@
 pub const SYS_process_mrelease: ::c_long = 448;
 pub const SYS_futex_waitv: ::c_long = 449;
 pub const SYS_set_mempolicy_home_node: ::c_long = 450;
+pub const SYS_mseal: ::c_long = 462;
 
 pub const MCL_CURRENT: ::c_int = 0x0001;
 pub const MCL_FUTURE: ::c_int = 0x0002;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/loongarch64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/loongarch64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/loongarch64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/loongarch64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/mips64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/mips64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/mips64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/mips64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/powerpc64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/powerpc64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/powerpc64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/powerpc64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/riscv64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/riscv64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/riscv64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/riscv64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/s390x.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/s390x.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/s390x.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/s390x.rs
index aa4cbf8..567914f 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/s390x.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/s390x.rs
@@ -722,3 +722,4 @@
 pub const SYS_process_mrelease: ::c_long = 448;
 pub const SYS_futex_waitv: ::c_long = 449;
 pub const SYS_set_mempolicy_home_node: ::c_long = 450;
+pub const SYS_mseal: ::c_long = 462;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/x86_64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/x86_64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/x86_64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/x86_64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs
index 4d178680..dc617d4 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs
@@ -608,6 +608,8 @@
 pub const SYS_process_mrelease: ::c_long = 448;
 pub const SYS_futex_waitv: ::c_long = 449;
 pub const SYS_set_mempolicy_home_node: ::c_long = 450;
+pub const SYS_fchmodat2: ::c_long = 452;
+pub const SYS_mseal: ::c_long = 462;
 
 // offsets in user_regs_structs, from sys/reg.h
 pub const R15: ::c_int = 0;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/lfs64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/lfs64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/lfs64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/lfs64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/mod.rs
index 699c8181..a4c8f79 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/mod.rs
@@ -853,7 +853,6 @@
         new_limit: *const ::rlimit,
         old_limit: *mut ::rlimit,
     ) -> ::c_int;
-    pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int;
     pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int;
     pub fn ptrace(request: ::c_int, ...) -> ::c_long;
     pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/no_align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/no_align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/no_align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/no_align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/non_exhaustive.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/non_exhaustive.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/non_exhaustive.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/non_exhaustive.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/arm/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/arm/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/arm/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/arm/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/arm/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/arm/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/arm/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/arm/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/arm/no_align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/arm/no_align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/arm/no_align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/arm/no_align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mod.rs
index b8d10cb9..32c65545 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mod.rs
@@ -353,7 +353,6 @@
 pub const YESEXPR: ::c_int = ((5) << 8) | (0);
 
 extern "C" {
-    pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int;
     pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::timezone) -> ::c_int;
 
     pub fn pthread_rwlockattr_getkind_np(
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/no_align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/no_align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/no_align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/no_align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/x86_64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/x86_64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/x86_64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/x86_64/other.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/x86_64/other.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/x86_64/other.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/x86_64/other.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/mod.rs
index 8b3d988..6bab825 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/mod.rs
@@ -313,6 +313,11 @@
 pub const ATF_PUBL: ::c_int = 0x08;
 pub const ATF_USETRAILERS: ::c_int = 0x10;
 
+extern "C" {
+    pub static in6addr_loopback: in6_addr;
+    pub static in6addr_any: in6_addr;
+}
+
 cfg_if! {
     if #[cfg(any(target_os = "l4re", target_os = "espidf"))] {
         // required libraries for L4Re and the ESP-IDF framework are linked externally, ATM
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/aarch64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/aarch64/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/aarch64/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/aarch64/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/arm/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/arm/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/arm/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/arm/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/espidf/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/espidf/mod.rs
similarity index 92%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/espidf/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/espidf/mod.rs
index e2e98ee..1a2a907d 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/espidf/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/espidf/mod.rs
@@ -89,14 +89,14 @@
 
 pub const PTHREAD_STACK_MIN: ::size_t = 768;
 
-pub const SIGABRT: ::size_t = 1;
-pub const SIGFPE: ::size_t = 1;
-pub const SIGILL: ::size_t = 1;
-pub const SIGINT: ::size_t = 1;
-pub const SIGSEGV: ::size_t = 1;
-pub const SIGTERM: ::size_t = 1;
-pub const SIGHUP: ::size_t = 1;
-pub const SIGQUIT: ::size_t = 1;
+pub const SIGABRT: ::c_int = 1;
+pub const SIGFPE: ::c_int = 1;
+pub const SIGILL: ::c_int = 1;
+pub const SIGINT: ::c_int = 1;
+pub const SIGSEGV: ::c_int = 1;
+pub const SIGTERM: ::c_int = 1;
+pub const SIGHUP: ::c_int = 1;
+pub const SIGQUIT: ::c_int = 1;
 pub const NSIG: ::size_t = 2;
 
 extern "C" {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/generic.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/generic.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/generic.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/generic.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/horizon/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/horizon/mod.rs
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/horizon/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/horizon/mod.rs
index 9c70f7b..97e0b18 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/horizon/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/horizon/mod.rs
@@ -21,6 +21,14 @@
 pub type sigset_t = ::c_ulong;
 
 s! {
+    pub struct hostent {
+        pub h_name: *mut ::c_char,
+        pub h_aliases: *mut *mut ::c_char,
+        pub h_addrtype: u16,
+        pub h_length: u16,
+        pub h_addr_list: *mut *mut ::c_char,
+    }
+
     pub struct sockaddr {
         pub sa_family: ::sa_family_t,
         pub sa_data: [::c_char; 26usize],
@@ -35,6 +43,7 @@
         pub sin_family: ::sa_family_t,
         pub sin_port: ::in_port_t,
         pub sin_addr: ::in_addr,
+        pub sin_zero: [::c_char; 8],
     }
 
     pub struct sockaddr_in6 {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/mod.rs
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/mod.rs
index a572cc3..29693f6 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/mod.rs
@@ -53,6 +53,21 @@
     }
 }
 
+cfg_if! {
+    if #[cfg(not(target_os = "horizon"))] {
+        s!{
+            pub struct hostent {
+                pub h_name: *mut ::c_char,
+                pub h_aliases: *mut *mut ::c_char,
+                pub h_addrtype: ::c_int,
+                pub h_length: ::c_int,
+                pub h_addr_list: *mut *mut ::c_char,
+                pub h_addr: *mut ::c_char,
+            }
+        }
+    }
+}
+
 s! {
     // The order of the `ai_addr` field in this struct is crucial
     // for converting between the Rust and C types.
@@ -87,16 +102,7 @@
     }
 
     pub struct in_addr {
-            pub s_addr: ::in_addr_t,
-    }
-
-    pub struct hostent {
-            pub h_name: *mut ::c_char,
-            pub h_aliases: *mut *mut ::c_char,
-            pub h_addrtype: ::c_int,
-            pub h_length: ::c_int,
-            pub h_addr_list: *mut *mut ::c_char,
-            pub h_addr: *mut ::c_char,
+        pub s_addr: ::in_addr_t,
     }
 
     pub struct pollfd {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/no_align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/no_align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/no_align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/no_align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/powerpc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/powerpc/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/powerpc/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/powerpc/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/vita/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/vita/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/vita/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/vita/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/no_align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/no_align.rs
new file mode 100644
index 0000000..b435d72a
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/no_align.rs
@@ -0,0 +1,16 @@
+s! {
+    pub struct in6_addr {
+        pub s6_addr: [u8; 16],
+        __align: [u32; 0],
+    }
+}
+
+pub const IN6ADDR_LOOPBACK_INIT: in6_addr = in6_addr {
+    s6_addr: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
+    __align: [0u32; 0],
+};
+
+pub const IN6ADDR_ANY_INIT: in6_addr = in6_addr {
+    s6_addr: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    __align: [0u32; 0],
+};
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/nto/aarch64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/nto/aarch64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/nto/aarch64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/nto/aarch64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/nto/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/nto/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/nto/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/nto/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/nto/neutrino.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/nto/neutrino.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/nto/neutrino.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/nto/neutrino.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/nto/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/nto/x86_64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/nto/x86_64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/nto/x86_64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/redox/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/redox/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/redox/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/redox/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/compat.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/compat.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/compat.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/compat.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/illumos.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/illumos.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/illumos.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/illumos.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/solaris.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/solaris.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/solaris.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/solaris.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/x86.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/x86.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/x86.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/x86.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/x86_64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/x86_64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/x86_64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/x86_common.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/x86_common.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/x86_common.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/x86_common.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/aarch64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/aarch64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/aarch64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/aarch64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/arm.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/arm.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/arm.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/arm.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/mod.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/mod.rs
index 4f02742..31428341 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/mod.rs
@@ -782,6 +782,7 @@
 pub const S_ISUID: ::c_int = 0x0800;
 pub const S_ISGID: ::c_int = 0x0400;
 pub const S_ISTXT: ::c_int = 0x0200;
+pub const S_ISVTX: ::c_int = 0o1000;
 pub const S_IRUSR: ::c_int = 0x0100;
 pub const S_IWUSR: ::c_int = 0x0080;
 pub const S_IXUSR: ::c_int = 0x0040;
@@ -1812,6 +1813,10 @@
     pub fn taskIdSelf() -> ::TASK_ID;
     pub fn taskDelay(ticks: ::_Vx_ticks_t) -> ::c_int;
 
+    // taskLib.h
+    pub fn taskNameSet(task_id: ::TASK_ID, task_name: *mut ::c_char) -> ::c_int;
+    pub fn taskNameGet(task_id: ::TASK_ID, buf_name: *mut ::c_char, bufsize: ::size_t) -> ::c_int;
+
     // rtpLibCommon.h
     pub fn rtpInfoGet(rtpId: ::RTP_ID, rtpStruct: *mut ::RTP_DESC) -> ::c_int;
     pub fn rtpSpawn(
@@ -1871,6 +1876,10 @@
     ) -> ::c_int;
     pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int;
     pub fn mq_setattr(mqd: ::mqd_t, newattr: *const ::mq_attr, oldattr: *mut ::mq_attr) -> ::c_int;
+
+    // vxCpuLib.h
+    fn vxCpuEnabledGet() -> ::cpuset_t; // Get set of running CPU's in the system
+    fn vxCpuConfiguredGet() -> ::cpuset_t; // Get set of Configured CPU's in the system
 }
 
 //Dummy functions, these don't really exist in VxWorks.
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/powerpc.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/powerpc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/powerpc.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/powerpc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/powerpc64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/powerpc64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/powerpc64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/powerpc64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/x86.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/x86.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/x86.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/x86.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/x86_64.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/x86_64.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/x86_64.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/wasi.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/wasi/mod.rs
similarity index 96%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/wasi.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/wasi/mod.rs
index 36047cb..d47d407 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/wasi.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/wasi/mod.rs
@@ -245,14 +245,14 @@
 pub const AT_REMOVEDIR: c_int = 0x4;
 pub const UTIME_OMIT: c_long = 0xfffffffe;
 pub const UTIME_NOW: c_long = 0xffffffff;
-pub const S_IFIFO: mode_t = 49152;
+pub const S_IFIFO: mode_t = 0o1_0000;
 pub const S_IFCHR: mode_t = 8192;
 pub const S_IFBLK: mode_t = 24576;
 pub const S_IFDIR: mode_t = 16384;
 pub const S_IFREG: mode_t = 32768;
 pub const S_IFLNK: mode_t = 40960;
 pub const S_IFSOCK: mode_t = 49152;
-pub const S_IFMT: mode_t = 57344;
+pub const S_IFMT: mode_t = 0o17_0000;
 pub const S_IRWXO: mode_t = 0x7;
 pub const S_IXOTH: mode_t = 0x1;
 pub const S_IWOTH: mode_t = 0x2;
@@ -372,16 +372,26 @@
 pub const _SC_IOV_MAX: c_int = 60;
 pub const _SC_SYMLOOP_MAX: c_int = 173;
 
-#[allow(unused_unsafe)] // `addr_of!(EXTERN_STATIC)` is now safe; remove `unsafe` when MSRV >= 1.82
-pub static CLOCK_MONOTONIC: clockid_t = unsafe { clockid_t(ptr_addr_of!(_CLOCK_MONOTONIC)) };
-#[allow(unused_unsafe)]
-pub static CLOCK_PROCESS_CPUTIME_ID: clockid_t =
-    unsafe { clockid_t(ptr_addr_of!(_CLOCK_PROCESS_CPUTIME_ID)) };
-#[allow(unused_unsafe)]
-pub static CLOCK_REALTIME: clockid_t = unsafe { clockid_t(ptr_addr_of!(_CLOCK_REALTIME)) };
-#[allow(unused_unsafe)]
-pub static CLOCK_THREAD_CPUTIME_ID: clockid_t =
-    unsafe { clockid_t(ptr_addr_of!(_CLOCK_THREAD_CPUTIME_ID)) };
+cfg_if! {
+    if #[cfg(libc_ctest)] {
+        // skip these constants when this is active because `ctest` currently
+        // panics on parsing the constants below
+    } else {
+        // `addr_of!(EXTERN_STATIC)` is now safe; remove `unsafe` when MSRV >= 1.82
+        #[allow(unused_unsafe)]
+        pub static CLOCK_MONOTONIC: clockid_t =
+            unsafe { clockid_t(ptr_addr_of!(_CLOCK_MONOTONIC)) };
+        #[allow(unused_unsafe)]
+        pub static CLOCK_PROCESS_CPUTIME_ID: clockid_t =
+            unsafe { clockid_t(ptr_addr_of!(_CLOCK_PROCESS_CPUTIME_ID)) };
+        #[allow(unused_unsafe)]
+        pub static CLOCK_REALTIME: clockid_t =
+            unsafe { clockid_t(ptr_addr_of!(_CLOCK_REALTIME)) };
+        #[allow(unused_unsafe)]
+        pub static CLOCK_THREAD_CPUTIME_ID: clockid_t =
+            unsafe { clockid_t(ptr_addr_of!(_CLOCK_THREAD_CPUTIME_ID)) };
+    }
+}
 
 pub const ABDAY_1: ::nl_item = 0x20000;
 pub const ABDAY_2: ::nl_item = 0x20001;
@@ -869,3 +879,10 @@
 
     pub fn __errno_location() -> *mut ::c_int;
 }
+
+cfg_if! {
+    if #[cfg(target_env = "p2")] {
+        mod p2;
+        pub use self::p2::*;
+    }
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/wasi/p2.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/wasi/p2.rs
new file mode 100644
index 0000000..3e8eb95
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/wasi/p2.rs
@@ -0,0 +1,161 @@
+pub type sa_family_t = ::c_ushort;
+pub type in_port_t = ::c_ushort;
+pub type in_addr_t = ::c_uint;
+
+pub type socklen_t = ::c_uint;
+
+s! {
+    #[repr(align(16))]
+    pub struct sockaddr {
+        pub sa_family: sa_family_t,
+        pub sa_data: [::c_char; 0],
+    }
+
+    pub struct in_addr {
+        pub s_addr: in_addr_t,
+    }
+
+    #[repr(align(16))]
+    pub struct sockaddr_in {
+        pub sin_family: sa_family_t,
+        pub sin_port: in_port_t,
+        pub sin_addr: in_addr,
+    }
+
+    #[repr(align(4))]
+    pub struct in6_addr {
+        pub s6_addr: [::c_uchar; 16],
+    }
+
+    #[repr(align(16))]
+    pub struct sockaddr_in6 {
+        pub sin6_family: sa_family_t,
+        pub sin6_port: in_port_t,
+        pub sin6_flowinfo: ::c_uint,
+        pub sin6_addr: in6_addr,
+        pub sin6_scope_id: ::c_uint,
+    }
+
+    #[repr(align(16))]
+    pub struct sockaddr_storage {
+        pub ss_family: sa_family_t,
+        pub __ss_data: [::c_char; 32],
+    }
+
+    pub struct addrinfo {
+        pub ai_flags: ::c_int,
+        pub ai_family: ::c_int,
+        pub ai_socktype: ::c_int,
+        pub ai_protocol: ::c_int,
+        pub ai_addrlen: socklen_t,
+        pub ai_addr: *mut sockaddr,
+        pub ai_canonname: *mut ::c_char,
+        pub ai_next: *mut addrinfo,
+    }
+
+    pub struct ip_mreq {
+        pub imr_multiaddr: in_addr,
+        pub imr_interface: in_addr,
+    }
+
+    pub struct ipv6_mreq {
+        pub ipv6mr_multiaddr: in6_addr,
+        pub ipv6mr_interface: ::c_uint,
+    }
+}
+
+pub const SHUT_RD: ::c_int = 1 << 0;
+pub const SHUT_WR: ::c_int = 1 << 1;
+pub const SHUT_RDWR: ::c_int = SHUT_RD | SHUT_WR;
+
+pub const MSG_NOSIGNAL: ::c_int = 0x4000;
+pub const MSG_PEEK: ::c_int = 0x0002;
+
+pub const SO_REUSEADDR: ::c_int = 2;
+pub const SO_ERROR: ::c_int = 4;
+pub const SO_BROADCAST: ::c_int = 6;
+pub const SO_LINGER: ::c_int = 13;
+pub const SO_RCVTIMEO: ::c_int = 66;
+pub const SO_SNDTIMEO: ::c_int = 67;
+
+pub const SOCK_DGRAM: ::c_int = 5;
+pub const SOCK_STREAM: ::c_int = 6;
+
+pub const SOL_SOCKET: ::c_int = 0x7fffffff;
+
+pub const AF_INET: ::c_int = 1;
+pub const AF_INET6: ::c_int = 2;
+
+pub const IPPROTO_IP: ::c_int = 0;
+pub const IPPROTO_TCP: ::c_int = 6;
+pub const IPPROTO_IPV6: ::c_int = 41;
+
+pub const IP_TTL: ::c_int = 2;
+pub const IP_MULTICAST_TTL: ::c_int = 33;
+pub const IP_MULTICAST_LOOP: ::c_int = 34;
+pub const IP_ADD_MEMBERSHIP: ::c_int = 35;
+pub const IP_DROP_MEMBERSHIP: ::c_int = 36;
+
+pub const IPV6_MULTICAST_LOOP: ::c_int = 19;
+pub const IPV6_JOIN_GROUP: ::c_int = 20;
+pub const IPV6_LEAVE_GROUP: ::c_int = 21;
+pub const IPV6_V6ONLY: ::c_int = 26;
+
+pub const IPV6_ADD_MEMBERSHIP: ::c_int = IPV6_JOIN_GROUP;
+pub const IPV6_DROP_MEMBERSHIP: ::c_int = IPV6_LEAVE_GROUP;
+
+pub const TCP_NODELAY: ::c_int = 1;
+
+pub const EAI_SYSTEM: ::c_int = -11;
+
+extern "C" {
+    pub fn socket(domain: ::c_int, type_: ::c_int, protocol: ::c_int) -> ::c_int;
+    pub fn connect(fd: ::c_int, name: *const sockaddr, addrlen: socklen_t) -> ::c_int;
+    pub fn bind(socket: ::c_int, addr: *const sockaddr, addrlen: socklen_t) -> ::c_int;
+    pub fn listen(socket: ::c_int, backlog: ::c_int) -> ::c_int;
+    pub fn accept(socket: ::c_int, addr: *mut sockaddr, addrlen: *mut socklen_t) -> ::c_int;
+
+    pub fn getsockname(socket: ::c_int, addr: *mut sockaddr, addrlen: *mut socklen_t) -> ::c_int;
+    pub fn getpeername(socket: ::c_int, addr: *mut sockaddr, addrlen: *mut socklen_t) -> ::c_int;
+
+    pub fn sendto(
+        socket: ::c_int,
+        buffer: *const ::c_void,
+        length: ::size_t,
+        flags: ::c_int,
+        addr: *const sockaddr,
+        addrlen: socklen_t,
+    ) -> ::ssize_t;
+    pub fn recvfrom(
+        socket: ::c_int,
+        buffer: *mut ::c_void,
+        length: ::size_t,
+        flags: ::c_int,
+        addr: *mut sockaddr,
+        addrlen: *mut socklen_t,
+    ) -> ::ssize_t;
+
+    pub fn getsockopt(
+        sockfd: ::c_int,
+        level: ::c_int,
+        optname: ::c_int,
+        optval: *mut ::c_void,
+        optlen: *mut socklen_t,
+    ) -> ::c_int;
+    pub fn setsockopt(
+        sockfd: ::c_int,
+        level: ::c_int,
+        optname: ::c_int,
+        optval: *const ::c_void,
+        optlen: socklen_t,
+    ) -> ::c_int;
+
+    pub fn getaddrinfo(
+        host: *const ::c_char,
+        serv: *const ::c_char,
+        hint: *const addrinfo,
+        res: *mut *mut addrinfo,
+    ) -> ::c_int;
+    pub fn freeaddrinfo(p: *mut addrinfo);
+    pub fn gai_strerror(ecode: ::c_int) -> *const ::c_char;
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/windows/gnu/align.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/windows/gnu/align.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/windows/gnu/align.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/windows/gnu/align.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/windows/gnu/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/windows/gnu/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/windows/gnu/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/windows/gnu/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/windows/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/windows/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/windows/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/windows/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/windows/msvc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/windows/msvc/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/windows/msvc/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/windows/msvc/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/xous.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/xous.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/xous.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/xous.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-0.2.158/tests/const_fn.rs b/third_party/rust/chromium_crates_io/vendor/libc-0.2.159/tests/const_fn.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/libc-0.2.158/tests/const_fn.rs
rename to third_party/rust/chromium_crates_io/vendor/libc-0.2.159/tests/const_fn.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/.cargo_vcs_info.json
deleted file mode 100644
index fe105ad..0000000
--- a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/.cargo_vcs_info.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "git": {
-    "sha1": "6b58785c80e2641a945863301f1f0f270902766c"
-  },
-  "path_in_vcs": "read-fonts"
-}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/.cargo-checksum.json
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/.cargo-checksum.json
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/.cargo_vcs_info.json
new file mode 100644
index 0000000..21e8950
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "f80507c47a9974863c735af5162d76dba4daf8bf"
+  },
+  "path_in_vcs": "read-fonts"
+}
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/Cargo.toml
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/Cargo.toml
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/Cargo.toml
index fe0063f3..91c139c 100644
--- a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/Cargo.toml
@@ -12,7 +12,7 @@
 [package]
 edition = "2021"
 name = "read-fonts"
-version = "0.22.0"
+version = "0.22.1"
 build = false
 autobins = false
 autoexamples = false
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/Cargo.toml.orig
similarity index 98%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/Cargo.toml.orig
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/Cargo.toml.orig
index 42f90809..2d75ce2 100644
--- a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "read-fonts"
-version = "0.22.0"
+version = "0.22.1"
 description = "Reading OpenType font files."
 readme = "README.md"
 categories = ["text-processing", "parsing", "graphics"]
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/LICENSE-APACHE
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/LICENSE-APACHE
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/LICENSE-MIT
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/LICENSE-MIT
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/README.md b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/README.md
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/README.md
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/benches/bench_helper.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/benches/bench_helper.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/benches/bench_helper.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/benches/bench_helper.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/benches/int_set_benchmark.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/benches/int_set_benchmark.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/benches/int_set_benchmark.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/benches/int_set_benchmark.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/benches/sparse_bit_set_benchmark.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/benches/sparse_bit_set_benchmark.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/benches/sparse_bit_set_benchmark.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/benches/sparse_bit_set_benchmark.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/font.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/font.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/font.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/font.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_aat.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_aat.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_aat.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_aat.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_ankr.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_ankr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_ankr.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_ankr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_avar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_avar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_avar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_avar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_base.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_base.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_base.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_base.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_bitmap.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_bitmap.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_bitmap.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_bitmap.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cbdt.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cbdt.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cbdt.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cbdt.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cblc.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cblc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cblc.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cblc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cff.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cff.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cff.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cff.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cff2.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cff2.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cff2.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cff2.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cmap.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cmap.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cmap.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cmap.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_colr.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_colr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_colr.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_colr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cpal.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cpal.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cpal.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cpal.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cvar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cvar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_cvar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_cvar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_ebdt.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_ebdt.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_ebdt.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_ebdt.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_eblc.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_eblc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_eblc.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_eblc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_feat.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_feat.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_feat.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_feat.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_fvar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_fvar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_fvar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_fvar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_gasp.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_gasp.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_gasp.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_gasp.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_gdef.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_gdef.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_gdef.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_gdef.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_glyf.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_glyf.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_glyf.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_glyf.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_gpos.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_gpos.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_gpos.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_gpos.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_gsub.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_gsub.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_gsub.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_gsub.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_gvar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_gvar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_gvar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_gvar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_head.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_head.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_head.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_head.rs
index efd9d32..f376764 100644
--- a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_head.rs
+++ b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_head.rs
@@ -531,7 +531,7 @@
         self.data.read_at(range.start).unwrap()
     }
 
-    /// see somewhere else
+    /// Bits identifying the font's style; see [MacStyle]
     pub fn mac_style(&self) -> MacStyle {
         let range = self.shape.mac_style_byte_range();
         self.data.read_at(range.start).unwrap()
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_hhea.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_hhea.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_hhea.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_hhea.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_hmtx.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_hmtx.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_hmtx.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_hmtx.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_hvar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_hvar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_hvar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_hvar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_ift.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_ift.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_ift.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_ift.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_layout.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_layout.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_layout.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_layout.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_ltag.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_ltag.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_ltag.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_ltag.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_maxp.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_maxp.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_maxp.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_maxp.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_mvar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_mvar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_mvar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_mvar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_name.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_name.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_name.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_name.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_os2.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_os2.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_os2.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_os2.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_post.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_post.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_post.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_post.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_postscript.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_postscript.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_postscript.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_postscript.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_sbix.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_sbix.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_sbix.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_sbix.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_stat.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_stat.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_stat.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_stat.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_svg.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_svg.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_svg.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_svg.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_conditions.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_conditions.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_conditions.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_conditions.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_count_all.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_count_all.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_count_all.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_count_all.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_enum.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_enum.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_enum.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_enum.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_flags.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_flags.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_flags.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_flags.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_formats.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_formats.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_formats.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_formats.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_offsets_arrays.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_offsets_arrays.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_offsets_arrays.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_offsets_arrays.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_records.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_records.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_test_records.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_test_records.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_varc.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_varc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_varc.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_varc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_variations.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_variations.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_variations.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_variations.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_vhea.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_vhea.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_vhea.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_vhea.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_vmtx.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_vmtx.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_vmtx.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_vmtx.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_vorg.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_vorg.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_vorg.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_vorg.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_vvar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_vvar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/generated/generated_vvar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/generated/generated_vvar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/array.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/array.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/array.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/array.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/codegen_test.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/codegen_test.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/codegen_test.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/codegen_test.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/bitpage.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/bitpage.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/bitpage.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/bitpage.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/bitset.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/bitset.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/bitset.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/bitset.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/input_bit_stream.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/input_bit_stream.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/input_bit_stream.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/input_bit_stream.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/mod.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/mod.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/mod.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/output_bit_stream.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/output_bit_stream.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/output_bit_stream.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/output_bit_stream.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/sparse_bit_set.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/sparse_bit_set.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/sparse_bit_set.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/sparse_bit_set.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/font_data.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/font_data.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/font_data.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/font_data.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/lib.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/lib.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/lib.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/offset.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/offset.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/offset.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/offset.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/offset_array.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/offset_array.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/offset_array.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/offset_array.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/read.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/read.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/read.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/read.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/table_provider.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/table_provider.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/table_provider.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/table_provider.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/table_ref.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/table_ref.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/table_ref.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/table_ref.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/aat.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/aat.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/aat.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/aat.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/ankr.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/ankr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/ankr.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/ankr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/avar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/avar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/avar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/avar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/base.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/base.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/base.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/base.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/bitmap.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/bitmap.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/bitmap.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/bitmap.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cbdt.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cbdt.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cbdt.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cbdt.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cblc.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cblc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cblc.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cblc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cff.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cff.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cff.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cff.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cff2.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cff2.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cff2.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cff2.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cmap.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cmap.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cmap.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cmap.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/colr.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/colr.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/colr.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/colr.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/colr/closure.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/colr/closure.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/colr/closure.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/colr/closure.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cpal.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cpal.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cpal.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cpal.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cvar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cvar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cvar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cvar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/ebdt.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/ebdt.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/ebdt.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/ebdt.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/eblc.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/eblc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/eblc.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/eblc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/feat.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/feat.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/feat.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/feat.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/fvar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/fvar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/fvar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/fvar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gasp.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gasp.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gasp.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gasp.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gdef.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gdef.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gdef.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gdef.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf/bytecode.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf/bytecode.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf/bytecode.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf/bytecode.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf/bytecode/decode.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf/bytecode/decode.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf/bytecode/decode.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf/bytecode/decode.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf/bytecode/instruction.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf/bytecode/instruction.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf/bytecode/instruction.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf/bytecode/instruction.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf/bytecode/opcode.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf/bytecode/opcode.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf/bytecode/opcode.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf/bytecode/opcode.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gpos.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gpos.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gpos.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gpos.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gsub.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gsub.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gsub.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gsub.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gsub/closure.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gsub/closure.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gsub/closure.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gsub/closure.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gvar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gvar.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gvar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gvar.rs
index 43d5ba2..d70202c 100644
--- a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gvar.rs
+++ b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gvar.rs
@@ -57,7 +57,7 @@
 }
 
 impl<'a> Gvar<'a> {
-    fn data_for_gid(&self, gid: GlyphId) -> Result<FontData<'a>, ReadError> {
+    pub fn data_for_gid(&self, gid: GlyphId) -> Result<FontData<'a>, ReadError> {
         let start_idx = gid.to_u32() as usize;
         let end_idx = start_idx + 1;
         let data_start = self.glyph_variation_data_array_offset();
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/head.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/head.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/head.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/head.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/hhea.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/hhea.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/hhea.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/hhea.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/hmtx.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/hmtx.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/hmtx.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/hmtx.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/hvar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/hvar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/hvar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/hvar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/ift.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/ift.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/ift.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/ift.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/instance_record.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/instance_record.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/instance_record.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/instance_record.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/layout.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/layout.rs
similarity index 99%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/layout.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/layout.rs
index 14de931..02f5ccb 100644
--- a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/layout.rs
+++ b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/layout.rs
@@ -2,10 +2,12 @@
 
 #[path = "./lookupflag.rs"]
 mod lookupflag;
+mod script;
 
 use core::cmp::Ordering;
 
 pub use lookupflag::LookupFlag;
+pub use script::{ScriptTags, SelectedScript, UNICODE_TO_NEW_OPENTYPE_SCRIPT_TAGS};
 
 use super::variations::DeltaSetIndex;
 
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/layout/script.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/layout/script.rs
new file mode 100644
index 0000000..6d25f08
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/layout/script.rs
@@ -0,0 +1,275 @@
+//! Additional support for working with OpenType scripts.
+
+use super::{ScriptList, Tag};
+use std::ops::Deref;
+
+/// A script chosen from a set of candidate tags.
+///
+/// Returned by the [`ScriptList::select`] method.
+#[derive(Copy, Clone, PartialEq, Debug)]
+pub struct SelectedScript {
+    /// The actual OpenType tag of the chosen script.
+    pub tag: Tag,
+    /// Index of the script in the [`ScriptList`].
+    pub index: u16,
+    /// True if a script was chosen that wasn't in the requested list.
+    pub is_fallback: bool,
+}
+
+impl<'a> ScriptList<'a> {
+    /// Returns the index of the script with the given tag.
+    pub fn index_for_tag(&self, tag: Tag) -> Option<u16> {
+        self.script_records()
+            .binary_search_by_key(&tag, |rec| rec.script_tag())
+            .map(|index| index as u16)
+            .ok()
+    }
+
+    /// Finds the first available script that matches one of the given tags.
+    ///
+    /// When none of the requested scripts are available, then `DFLT`, `dflt`
+    /// and `latn` tags are tried in that order.
+    ///
+    /// If you're starting from a Unicode script code, use the
+    /// [`ScriptTags::from_unicode`] function to generate the appropriate set
+    /// of tags to pass to this method.
+    ///
+    /// See [`hb_ot_layout_table_select_script`](https://github.com/harfbuzz/harfbuzz/blob/2edc371e97d6d2c5ad0e085b26e9af0123501647/src/hb-ot-layout.cc#L547)
+    /// for the corresponding HarfBuzz function.
+    pub fn select(&self, tags: &[Tag]) -> Option<SelectedScript> {
+        for &tag in tags {
+            if let Some(index) = self.index_for_tag(tag) {
+                return Some(SelectedScript {
+                    tag,
+                    index,
+                    is_fallback: false,
+                });
+            }
+        }
+        for tag in [
+            // Try finding 'DFLT'
+            Tag::new(b"DFLT"),
+            // Try with 'dflt'; MS site has had typos and many fonts use it now :(
+            Tag::new(b"dflt"),
+            // try with 'latn'; some old fonts put their features there even though
+            // they're really trying to support Thai, for example :(
+            Tag::new(b"latn"),
+        ] {
+            if let Some(index) = self.index_for_tag(tag) {
+                return Some(SelectedScript {
+                    tag,
+                    index,
+                    is_fallback: true,
+                });
+            }
+        }
+        None
+    }
+}
+
+/// A prioritized list of OpenType script tags mapped from a Unicode script
+/// tag.
+///
+/// This is useful as input to [`ScriptList::select`] when you have a Unicode
+/// script and would like to find the appropriate OpenType script for shaping.
+#[derive(Copy, Clone, PartialEq, Eq, Default)]
+pub struct ScriptTags {
+    tags: [Tag; 3],
+    len: usize,
+}
+
+impl ScriptTags {
+    /// Given a [Unicode script code](https://unicode.org/iso15924/iso15924-codes.html),
+    /// returns a prioritized list of matching
+    /// [OpenType script tags](https://learn.microsoft.com/en-us/typography/opentype/spec/scripttags).
+    ///
+    /// See [hb_ot_all_tags_from_script](https://github.com/harfbuzz/harfbuzz/blob/63d09dbefcf7ad9f794ca96445d37b6d8c3c9124/src/hb-ot-tag.cc#L155C1-L155C27)
+    /// for the equivalent HarfBuzz function.    
+    pub fn from_unicode(unicode_script: Tag) -> Self {
+        let mut tags = [Tag::default(); 3];
+        let mut len = 0;
+        if let Some(new_tag) = new_tag_from_unicode(unicode_script) {
+            // Myanmar maps to mym2 but there is no mym3
+            if new_tag != Tag::new(b"mym2") {
+                let mut bytes = new_tag.to_be_bytes();
+                bytes[3] = b'3';
+                tags[len] = Tag::new(&bytes);
+                len += 1;
+            }
+            tags[len] = new_tag;
+            len += 1;
+        }
+        tags[len] = old_tag_from_unicode(unicode_script);
+        len += 1;
+        Self { tags, len }
+    }
+
+    /// Returns a slice containing the mapped script tags.
+    pub fn as_slice(&self) -> &[Tag] {
+        &self.tags[..self.len]
+    }
+}
+
+impl Deref for ScriptTags {
+    type Target = [Tag];
+
+    fn deref(&self) -> &Self::Target {
+        &self.tags[..self.len]
+    }
+}
+
+impl std::fmt::Debug for ScriptTags {
+    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+        write!(f, "{:?}", self.as_slice())
+    }
+}
+
+// See <https://github.com/harfbuzz/harfbuzz/blob/63d09dbefcf7ad9f794ca96445d37b6d8c3c9124/src/hb-ot-tag.cc#L37>
+fn old_tag_from_unicode(unicode_script: Tag) -> Tag {
+    let mut bytes = unicode_script.to_be_bytes();
+    let tag_bytes = match &bytes {
+        b"Zmth" => b"math",
+        // Katakana and Hiragana both map to 'kana'
+        b"Hira" => b"kana",
+        // Spaces at the end are preserved, unlike ISO 15924
+        b"Laoo" => b"lao ",
+        b"Yiii" => b"yi  ",
+        // Unicode 5.0 additions
+        b"Nkoo" => b"nko ",
+        // Unicode 5.1 additions
+        b"Vaii" => b"vai ",
+        _ => {
+            // Else, just change the first char to lowercase
+            bytes[0] = bytes[0].to_ascii_lowercase();
+            &bytes
+        }
+    };
+    Tag::new(tag_bytes)
+}
+
+/// Mapping from Unicode script code to "new" OpenType script
+/// tags.
+#[doc(hidden)]
+pub const UNICODE_TO_NEW_OPENTYPE_SCRIPT_TAGS: &[(&[u8; 4], Tag)] = &[
+    (b"Beng", Tag::new(b"bng2")),
+    (b"Deva", Tag::new(b"dev2")),
+    (b"Gujr", Tag::new(b"gjr2")),
+    (b"Guru", Tag::new(b"gur2")),
+    (b"Knda", Tag::new(b"knd2")),
+    (b"Mlym", Tag::new(b"mlm2")),
+    (b"Mymr", Tag::new(b"mym2")),
+    (b"Orya", Tag::new(b"ory2")),
+    (b"Taml", Tag::new(b"tml2")),
+    (b"Telu", Tag::new(b"tel2")),
+];
+
+// See <https://github.com/harfbuzz/harfbuzz/blob/63d09dbefcf7ad9f794ca96445d37b6d8c3c9124/src/hb-ot-tag.cc#L84>
+fn new_tag_from_unicode(unicode_script: Tag) -> Option<Tag> {
+    let ix = UNICODE_TO_NEW_OPENTYPE_SCRIPT_TAGS
+        .binary_search_by_key(&unicode_script.to_be_bytes(), |entry| *entry.0)
+        .ok()?;
+    UNICODE_TO_NEW_OPENTYPE_SCRIPT_TAGS
+        .get(ix)
+        .map(|entry| entry.1)
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use crate::{FontRef, TableProvider};
+
+    #[test]
+    fn script_index_for_tag() {
+        let font = FontRef::new(font_test_data::NOTOSERIFHEBREW_AUTOHINT_METRICS).unwrap();
+        let gsub_scripts = font.gsub().unwrap().script_list().unwrap();
+        let ordered_scripts = [b"DFLT", b"cyrl", b"grek", b"hebr", b"latn"];
+        for (index, tag) in ordered_scripts.into_iter().enumerate() {
+            let tag = Tag::new(tag);
+            assert_eq!(gsub_scripts.index_for_tag(tag), Some(index as u16));
+        }
+    }
+
+    #[test]
+    fn simple_script_tag_from_unicode() {
+        let unicode_tags = [b"Cyrl", b"Grek", b"Hebr", b"Latn"];
+        for unicode_tag in unicode_tags {
+            // These should all return a single tag that is simply
+            // the lowercase version of the Unicode tag
+            let mut bytes = *unicode_tag;
+            bytes[0] = bytes[0].to_ascii_lowercase();
+            let expected_tag = Tag::new(&bytes);
+            let result = ScriptTags::from_unicode(Tag::new(unicode_tag));
+            assert_eq!(&*result, &[expected_tag]);
+        }
+    }
+
+    #[test]
+    fn exception_script_tag_from_unicode() {
+        let cases = [
+            // (Unicode, OpenType)
+            (b"Kana", b"kana"),
+            // Hiragana maps to kana
+            (b"Hira", b"kana"),
+            // Unicode extends last char but OpenType pads with spaces
+            // for tags < 4 bytes
+            (b"Nkoo", b"nko "),
+            (b"Yiii", b"yi  "),
+            (b"Vaii", b"vai "),
+        ];
+        for (unicode_tag, ot_tag) in cases {
+            let result = ScriptTags::from_unicode(Tag::new(unicode_tag));
+            assert_eq!(&*result, &[Tag::new(ot_tag)]);
+        }
+    }
+
+    #[test]
+    fn multi_script_tags_from_unicode() {
+        let cases = [
+            // (Unicode, OpenType)
+            (b"Beng", &[b"bng3", b"bng2", b"beng"][..]),
+            (b"Orya", &[b"ory3", b"ory2", b"orya"]),
+            (b"Mlym", &[b"mlm3", b"mlm2", b"mlym"]),
+            // There's no version 3 tag for Myanmar
+            (b"Mymr", &[b"mym2", b"mymr"]),
+        ];
+        for (unicode_tag, ot_tags) in cases {
+            let result = ScriptTags::from_unicode(Tag::new(unicode_tag));
+            let ot_tags = ot_tags
+                .iter()
+                .map(|bytes| Tag::new(bytes))
+                .collect::<Vec<_>>();
+            assert_eq!(&*result, &ot_tags);
+        }
+    }
+
+    #[test]
+    fn select_scripts_from_unicode() {
+        let font = FontRef::new(font_test_data::NOTOSERIFHEBREW_AUTOHINT_METRICS).unwrap();
+        let gsub_scripts = font.gsub().unwrap().script_list().unwrap();
+        // We know Hebrew is available
+        let hebr = gsub_scripts
+            .select(&ScriptTags::from_unicode(Tag::new(b"Hebr")))
+            .unwrap();
+        assert_eq!(
+            hebr,
+            SelectedScript {
+                tag: Tag::new(b"hebr"),
+                index: 3,
+                is_fallback: false,
+            }
+        );
+        // But this font doesn't contain any Indic scripts so we'll
+        // select a fallback for Bengali
+        let beng = gsub_scripts
+            .select(&ScriptTags::from_unicode(Tag::new(b"Beng")))
+            .unwrap();
+        assert_eq!(
+            beng,
+            SelectedScript {
+                tag: Tag::new(b"DFLT"),
+                index: 0,
+                is_fallback: true,
+            }
+        );
+    }
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/loca.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/loca.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/loca.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/loca.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/lookupflag.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/lookupflag.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/lookupflag.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/lookupflag.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/ltag.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/ltag.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/ltag.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/ltag.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/maxp.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/maxp.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/maxp.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/maxp.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/mvar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/mvar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/mvar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/mvar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/name.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/name.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/name.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/name.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/os2.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/os2.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/os2.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/os2.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/post.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/post.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/post.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/post.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/blend.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/blend.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/blend.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/blend.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/charstring.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/charstring.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/charstring.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/charstring.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/dict.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/dict.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/dict.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/dict.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/fd_select.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/fd_select.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/fd_select.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/fd_select.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/index.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/index.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/index.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/index.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/stack.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/stack.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/stack.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/stack.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/string.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/string.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/string.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/string.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/sbix.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/sbix.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/sbix.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/sbix.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/stat.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/stat.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/stat.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/stat.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/svg.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/svg.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/svg.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/svg.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/value_record.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/value_record.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/value_record.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/value_record.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/varc.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/varc.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/varc.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/varc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/variations.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/variations.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/variations.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/variations.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/vhea.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/vhea.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/vhea.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/vhea.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/vmtx.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/vmtx.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/vmtx.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/vmtx.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/vorg.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/vorg.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/vorg.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/vorg.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/vvar.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/vvar.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/vvar.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/vvar.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/layout.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/layout.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/layout.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/layout.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/test_gdef.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/test_gdef.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/test_gdef.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/test_gdef.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/test_gpos.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/test_gpos.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/test_gpos.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/test_gpos.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/test_gsub.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/test_gsub.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/test_gsub.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/test_gsub.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/test_helpers.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/test_helpers.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/test_helpers.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/test_helpers.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/traversal.rs b/third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/traversal.rs
similarity index 100%
rename from third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/traversal.rs
rename to third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/traversal.rs
diff --git a/third_party/rust/fdeflate/v0_3/BUILD.gn b/third_party/rust/fdeflate/v0_3/BUILD.gn
index 9bf4e12..b56c3f02 100644
--- a/third_party/rust/fdeflate/v0_3/BUILD.gn
+++ b/third_party/rust/fdeflate/v0_3/BUILD.gn
@@ -13,18 +13,19 @@
   epoch = "0.3"
   crate_type = "rlib"
   crate_root =
-      "//third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/lib.rs"
+      "//third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/compress.rs",
-    "//third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/decompress.rs",
-    "//third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/lib.rs",
-    "//third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/src/tables.rs",
+    "//third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/compress.rs",
+    "//third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/decompress.rs",
+    "//third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/decompress/tests/test_utils.rs",
+    "//third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/src/tables.rs",
   ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2021"
-  cargo_pkg_version = "0.3.4"
+  cargo_pkg_version = "0.3.5"
   cargo_pkg_authors = "The image-rs Developers"
   cargo_pkg_name = "fdeflate"
   cargo_pkg_description = "Fast specialized deflate implementation"
diff --git a/third_party/rust/fdeflate/v0_3/README.chromium b/third_party/rust/fdeflate/v0_3/README.chromium
index 4bca1cd..fdeab28 100644
--- a/third_party/rust/fdeflate/v0_3/README.chromium
+++ b/third_party/rust/fdeflate/v0_3/README.chromium
@@ -1,9 +1,9 @@
 Name: fdeflate
 URL: https://crates.io/crates/fdeflate
 Description: Fast specialized deflate implementation
-Version: 0.3.4
+Version: 0.3.5
 Security Critical: yes
 Shipped: yes
 License: Apache 2.0
-License File: //third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.4/LICENSE-APACHE
-Revision: 11d05bdaec5f2ff9e5d1a8aed555958789f4cef8
+License File: //third_party/rust/chromium_crates_io/vendor/fdeflate-0.3.5/LICENSE-APACHE
+Revision: e16928adc9496537794ce9ae93a55558b45db77a
diff --git a/third_party/rust/flate2/v1/BUILD.gn b/third_party/rust/flate2/v1/BUILD.gn
index ef21eeb..3ee60d5 100644
--- a/third_party/rust/flate2/v1/BUILD.gn
+++ b/third_party/rust/flate2/v1/BUILD.gn
@@ -13,34 +13,34 @@
   epoch = "1"
   crate_type = "rlib"
   crate_root =
-      "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/lib.rs"
+      "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/bufreader.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/crc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/deflate/bufread.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/deflate/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/deflate/read.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/deflate/write.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/ffi/c.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/ffi/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/ffi/rust.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/gz/bufread.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/gz/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/gz/read.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/gz/write.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/lib.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/mem.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zio.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zlib/bufread.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zlib/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zlib/read.rs",
-    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/src/zlib/write.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/bufreader.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/crc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/deflate/bufread.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/deflate/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/deflate/read.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/deflate/write.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/ffi/c.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/ffi/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/ffi/rust.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/gz/bufread.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/gz/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/gz/read.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/gz/write.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/mem.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zio.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zlib/bufread.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zlib/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zlib/read.rs",
+    "//third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/src/zlib/write.rs",
   ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2018"
-  cargo_pkg_version = "1.0.33"
+  cargo_pkg_version = "1.0.34"
   cargo_pkg_authors = "Alex Crichton <alex@alexcrichton.com>, Josh Triplett <josh@joshtriplett.org>"
   cargo_pkg_name = "flate2"
   cargo_pkg_description = "DEFLATE compression and decompression exposed as Read/BufRead/Write streams. Supports miniz_oxide and multiple zlib implementations. Supports zlib, gzip, and raw deflate streams."
diff --git a/third_party/rust/flate2/v1/README.chromium b/third_party/rust/flate2/v1/README.chromium
index bbc195d..16382a6 100644
--- a/third_party/rust/flate2/v1/README.chromium
+++ b/third_party/rust/flate2/v1/README.chromium
@@ -4,9 +4,9 @@
 Supports miniz_oxide and multiple zlib implementations. Supports zlib, gzip,
 and raw deflate streams.
 
-Version: 1.0.33
+Version: 1.0.34
 Security Critical: yes
 Shipped: yes
 License: Apache 2.0
-License File: //third_party/rust/chromium_crates_io/vendor/flate2-1.0.33/LICENSE-APACHE
-Revision: 50852c6138789b255d5b2dfea2abb1a1dda99e99
+License File: //third_party/rust/chromium_crates_io/vendor/flate2-1.0.34/LICENSE-APACHE
+Revision: 1a28821dc116dac14178858be056e4a58ef8f501
diff --git a/third_party/rust/libc/v0_2/BUILD.gn b/third_party/rust/libc/v0_2/BUILD.gn
index 1b8914d..4e984639 100644
--- a/third_party/rust/libc/v0_2/BUILD.gn
+++ b/third_party/rust/libc/v0_2/BUILD.gn
@@ -13,248 +13,249 @@
   epoch = "0.2"
   crate_type = "rlib"
   crate_root =
-      "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/lib.rs"
+      "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fixed_width_ints.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/aarch64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/no_align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/riscv64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/fuchsia/x86_64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/hermit.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/lib.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/macros.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/psp.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/sgx.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/solid/aarch64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/solid/arm.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/solid/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/switch.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/teeos/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/aix/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/aix/powerpc64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b32/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b32/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/aarch64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/aarch64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/x86_64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/b64/x86_64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/long_array.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/apple/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/dragonfly/errno.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/dragonfly/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/aarch64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/arm.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd15/b64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/freebsd15/x86_64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/powerpc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/riscv64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/x86.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/freebsdlike/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/aarch64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/arm.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/mips.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/powerpc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/riscv64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/sparc64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/x86.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/netbsd/x86_64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/aarch64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/arm.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/mips64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/powerpc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/riscv64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/sparc64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/x86.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/bsd/netbsdlike/openbsd/x86_64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/b32.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/b64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/native.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/haiku/x86_64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/b32.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/b64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/hurd/no_align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/arm.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/x86/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b32/x86/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/aarch64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/aarch64/int128.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/aarch64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/riscv64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/riscv64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/x86_64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/b64/x86_64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/android/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/emscripten/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/emscripten/lfs64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/emscripten/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/emscripten/no_align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/generic/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/mips/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/powerpc/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/arch/sparc/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/arm/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/arm/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/csky/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/csky/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/m68k/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/mips/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/mips/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/powerpc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/riscv32/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/sparc/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/x86/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b32/x86/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/fallback.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/mips64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/riscv64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/s390x.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/sparc64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/gnu/no_align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/arm/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/arm/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/hexagon.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/mips/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/mips/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/powerpc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/riscv32/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/x86/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b32/x86/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/aarch64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/aarch64/int128.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/loongarch64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/mips64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/powerpc64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/riscv64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/s390x.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/x86_64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/lfs64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/musl/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/no_align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/non_exhaustive.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/arm/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/arm/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/arm/no_align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mips/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/no_align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/x86_64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/linux/uclibc/x86_64/other.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/linux_like/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/aarch64/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/arm/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/espidf/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/generic.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/horizon/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/no_align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/powerpc/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/newlib/vita/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/no_align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/nto/aarch64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/nto/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/nto/neutrino.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/nto/x86_64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/redox/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/compat.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/illumos.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/solaris.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/x86.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/x86_64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/unix/solarish/x86_common.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/aarch64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/arm.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/powerpc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/powerpc64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/x86.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/vxworks/x86_64.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/wasi.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/windows/gnu/align.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/windows/gnu/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/windows/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/windows/msvc/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/src/xous.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fixed_width_ints.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/aarch64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/no_align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/riscv64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/fuchsia/x86_64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/hermit.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/macros.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/psp.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/sgx.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/solid/aarch64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/solid/arm.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/solid/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/switch.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/teeos/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/aix/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/aix/powerpc64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b32/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b32/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/aarch64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/aarch64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/x86_64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/b64/x86_64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/long_array.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/apple/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/dragonfly/errno.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/dragonfly/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/aarch64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/arm.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd15/b64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/freebsd15/x86_64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/powerpc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/riscv64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/x86.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/freebsdlike/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/aarch64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/arm.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/mips.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/powerpc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/riscv64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/sparc64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/x86.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/netbsd/x86_64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/aarch64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/arm.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/mips64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/powerpc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/riscv64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/sparc64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/x86.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/bsd/netbsdlike/openbsd/x86_64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/b32.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/b64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/native.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/haiku/x86_64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/b32.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/b64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/hurd/no_align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/arm.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/x86/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b32/x86/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/aarch64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/aarch64/int128.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/aarch64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/riscv64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/riscv64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/x86_64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/b64/x86_64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/android/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/emscripten/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/emscripten/lfs64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/emscripten/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/emscripten/no_align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/generic/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/mips/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/powerpc/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/arch/sparc/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/arm/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/arm/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/csky/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/csky/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/m68k/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/mips/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/mips/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/powerpc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/riscv32/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/sparc/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/x86/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b32/x86/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/fallback.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/mips64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/riscv64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/s390x.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/sparc64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/gnu/no_align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/arm/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/arm/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/hexagon.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/mips/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/mips/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/powerpc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/riscv32/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/x86/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b32/x86/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/aarch64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/aarch64/int128.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/loongarch64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/mips64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/powerpc64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/riscv64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/s390x.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/x86_64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/lfs64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/musl/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/no_align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/non_exhaustive.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/arm/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/arm/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/arm/no_align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mips/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/no_align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/x86_64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/linux/uclibc/x86_64/other.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/linux_like/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/aarch64/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/arm/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/espidf/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/generic.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/horizon/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/no_align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/powerpc/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/newlib/vita/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/no_align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/nto/aarch64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/nto/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/nto/neutrino.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/nto/x86_64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/redox/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/compat.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/illumos.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/solaris.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/x86.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/x86_64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/unix/solarish/x86_common.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/aarch64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/arm.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/powerpc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/powerpc64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/x86.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/vxworks/x86_64.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/wasi/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/wasi/p2.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/windows/gnu/align.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/windows/gnu/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/windows/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/windows/msvc/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/src/xous.rs",
   ]
   inputs = []
 
   build_native_rust_unit_tests = false
   edition = "2015"
-  cargo_pkg_version = "0.2.158"
+  cargo_pkg_version = "0.2.159"
   cargo_pkg_authors = "The Rust Project Developers"
   cargo_pkg_name = "libc"
   cargo_pkg_description = "Raw FFI bindings to platform libraries like libc."
@@ -266,7 +267,7 @@
   proc_macro_configs += [ "//build/config/compiler:no_chromium_code" ]
   features = [ "std" ]
   build_root =
-      "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/build.rs"
+      "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/build.rs"
   build_sources =
-      [ "//third_party/rust/chromium_crates_io/vendor/libc-0.2.158/build.rs" ]
+      [ "//third_party/rust/chromium_crates_io/vendor/libc-0.2.159/build.rs" ]
 }
diff --git a/third_party/rust/libc/v0_2/README.chromium b/third_party/rust/libc/v0_2/README.chromium
index cfd11e8..72161d8 100644
--- a/third_party/rust/libc/v0_2/README.chromium
+++ b/third_party/rust/libc/v0_2/README.chromium
@@ -2,9 +2,9 @@
 URL: https://crates.io/crates/libc
 Description: Raw FFI bindings to platform libraries like libc.
 
-Version: 0.2.158
+Version: 0.2.159
 Security Critical: yes
 Shipped: yes
 License: Apache 2.0
-License File: //third_party/rust/chromium_crates_io/vendor/libc-0.2.158/LICENSE-APACHE
-Revision: c809c58c6873c05c9aa8cb3b9142f6c4d2818e57
+License File: //third_party/rust/chromium_crates_io/vendor/libc-0.2.159/LICENSE-APACHE
+Revision: 7373a1abe57da20efae9fd2ca891d7b905c19e03
diff --git a/third_party/rust/read_fonts/v0_22/BUILD.gn b/third_party/rust/read_fonts/v0_22/BUILD.gn
index 3c0163a..a9dc01f3 100644
--- a/third_party/rust/read_fonts/v0_22/BUILD.gn
+++ b/third_party/rust/read_fonts/v0_22/BUILD.gn
@@ -12,153 +12,154 @@
   crate_name = "read_fonts"
   epoch = "0.22"
   crate_type = "rlib"
-  crate_root = "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/lib.rs"
+  crate_root = "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/lib.rs"
   sources = [
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/array.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/codegen_test.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/bitpage.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/bitset.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/input_bit_stream.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/mod.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/output_bit_stream.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/collections/int_set/sparse_bit_set.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/font_data.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/lib.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/offset.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/offset_array.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/read.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/table_provider.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/table_ref.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/aat.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/ankr.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/avar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/base.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/bitmap.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cbdt.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cblc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cff.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cff2.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cmap.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/colr.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/colr/closure.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cpal.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/cvar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/ebdt.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/eblc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/feat.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/fvar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gasp.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gdef.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf/bytecode.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf/bytecode/decode.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf/bytecode/instruction.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/glyf/bytecode/opcode.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gpos.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gsub.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gsub/closure.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/gvar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/head.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/hhea.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/hmtx.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/hvar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/ift.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/instance_record.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/layout.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/loca.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/lookupflag.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/ltag.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/maxp.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/mvar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/name.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/os2.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/post.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/blend.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/charstring.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/dict.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/fd_select.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/index.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/stack.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/postscript/string.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/sbix.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/stat.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/svg.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/value_record.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/varc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/variations.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/vhea.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/vmtx.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/vorg.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tables/vvar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/layout.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/test_gdef.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/test_gpos.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/test_gsub.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/tests/test_helpers.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/traversal.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/array.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/codegen_test.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/bitpage.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/bitset.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/input_bit_stream.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/output_bit_stream.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/collections/int_set/sparse_bit_set.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/font_data.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/offset.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/offset_array.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/read.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/table_provider.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/table_ref.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/aat.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/ankr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/avar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/base.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/bitmap.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cbdt.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cblc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cff.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cff2.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cmap.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/colr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/colr/closure.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cpal.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/cvar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/ebdt.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/eblc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/feat.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/fvar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gasp.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gdef.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf/bytecode.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf/bytecode/decode.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf/bytecode/instruction.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/glyf/bytecode/opcode.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gpos.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gsub.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gsub/closure.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/gvar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/head.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/hhea.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/hmtx.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/hvar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/ift.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/instance_record.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/layout.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/layout/script.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/loca.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/lookupflag.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/ltag.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/maxp.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/mvar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/name.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/os2.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/post.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/blend.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/charstring.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/dict.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/fd_select.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/index.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/stack.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/postscript/string.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/sbix.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/stat.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/svg.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/value_record.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/varc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/variations.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/vhea.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/vmtx.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/vorg.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tables/vvar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/layout.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/test_gdef.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/test_gpos.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/test_gsub.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/tests/test_helpers.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/traversal.rs",
   ]
   inputs = [
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/font.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_aat.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_ankr.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_avar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_base.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_bitmap.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_cbdt.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_cblc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_cff.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_cff2.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_cmap.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_colr.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_cpal.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_cvar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_ebdt.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_eblc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_feat.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_fvar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_gasp.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_gdef.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_glyf.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_gpos.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_gsub.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_gvar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_head.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_hhea.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_hmtx.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_hvar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_ift.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_layout.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_ltag.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_maxp.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_mvar.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_name.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_os2.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_post.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_postscript.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_sbix.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_stat.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_svg.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_test_conditions.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_test_count_all.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_test_enum.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_test_flags.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_test_formats.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_test_offsets_arrays.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_test_records.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_varc.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_variations.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_vhea.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_vmtx.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_vorg.rs",
-    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/src/../generated/generated_vvar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/font.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_aat.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_ankr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_avar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_base.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_bitmap.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_cbdt.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_cblc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_cff.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_cff2.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_cmap.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_colr.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_cpal.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_cvar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_ebdt.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_eblc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_feat.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_fvar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_gasp.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_gdef.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_glyf.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_gpos.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_gsub.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_gvar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_head.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_hhea.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_hmtx.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_hvar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_ift.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_layout.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_ltag.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_maxp.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_mvar.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_name.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_os2.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_post.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_postscript.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_sbix.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_stat.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_svg.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_test_conditions.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_test_count_all.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_test_enum.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_test_flags.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_test_formats.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_test_offsets_arrays.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_test_records.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_varc.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_variations.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_vhea.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_vmtx.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_vorg.rs",
+    "//third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/src/../generated/generated_vvar.rs",
   ]
 
   build_native_rust_unit_tests = false
   edition = "2021"
-  cargo_pkg_version = "0.22.0"
+  cargo_pkg_version = "0.22.1"
   cargo_pkg_name = "read-fonts"
   cargo_pkg_description = "Reading OpenType font files."
   library_configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/rust/read_fonts/v0_22/README.chromium b/third_party/rust/read_fonts/v0_22/README.chromium
index 6f126d2..20d9bea 100644
--- a/third_party/rust/read_fonts/v0_22/README.chromium
+++ b/third_party/rust/read_fonts/v0_22/README.chromium
@@ -1,9 +1,9 @@
 Name: read-fonts
 URL: https://crates.io/crates/read-fonts
 Description: Reading OpenType font files.
-Version: 0.22.0
+Version: 0.22.1
 Security Critical: yes
 Shipped: yes
 License: Apache 2.0
-License File: //third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.0/LICENSE-APACHE
-Revision: 6b58785c80e2641a945863301f1f0f270902766c
+License File: //third_party/rust/chromium_crates_io/vendor/read-fonts-0.22.1/LICENSE-APACHE
+Revision: f80507c47a9974863c735af5162d76dba4daf8bf
diff --git a/third_party/skia b/third_party/skia
index 5218f67..5fb36dd 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 5218f67ec716edb39f5d005ddaf6e9d70eca7cc9
+Subproject commit 5fb36dd08a257623ee0738747286de09662e4591
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index fb8f012..0828416 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit fb8f0127fca4d687f0584b62183572ed39ffc198
+Subproject commit 0828416b3eae17db848880d486e5c7f0038e46b0
diff --git a/third_party/webrtc b/third_party/webrtc
index 8569a0d..076eb6c 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit 8569a0d5346330eb6641512df65b864bbaed11e9
+Subproject commit 076eb6cdf236cd6125ab126df2340ca3ee265425
diff --git a/third_party/wtl/README.chromium b/third_party/wtl/README.chromium
index ce067cd..2c99870 100644
--- a/third_party/wtl/README.chromium
+++ b/third_party/wtl/README.chromium
@@ -1,7 +1,7 @@
 Name: Windows Template Library (WTL)
 URL: https://sourceforge.net/projects/wtl/files/WTL%2010/
 Version: 10.0.9163
-Commit: commit 57a7c4e2629cb85c6f27faa91650e047c4220e15
+Revision: 57a7c4e2629cb85c6f27faa91650e047c4220e15
 License: Microsoft Permissive License
 License File: Ms-PL.txt
 Security Critical: yes
diff --git a/tools/android/avd/proto/android_33_google_apis_x64_swangle.textpb b/tools/android/avd/proto/android_33_google_apis_x64_swangle.textpb
index 1baaf85..4dd7e93 100644
--- a/tools/android/avd/proto/android_33_google_apis_x64_swangle.textpb
+++ b/tools/android/avd/proto/android_33_google_apis_x64_swangle.textpb
@@ -6,7 +6,7 @@
 
 emulator_package {
   package_name: "chromium/third_party/android_sdk/public/emulator"
-  version: "5biVQLkXXVm61beRTyVfmPBrmjEJFBJTpdzAUcXY378C"  # 34.2.16 (Stable)
+  version: "XS__KK27esI_4qZkc_Ybb_ooYjPfcIQ7DDOPUZGYW5wC"  # 35.1.21 (Stable)
   dest_path: "android_33_google_apis_x64_swangle"
 }
 
@@ -19,9 +19,9 @@
 
 avd_package {
   package_name: "chromium/third_party/android_sdk/public/avds/android-33/google_apis/x86_64"
-  # Created in https://ci.chromium.org/ui/b/8740055568560541329
+  # Created in https://ci.chromium.org/ui/b/8735783234873256961
   # Patched gmscore version 24.26.32 in https://crrev.com/c/5735581
-  version: "5RbPXtXRFZ_norw0s0y8ZBq_nAUD6hGItzAfsSfV6ZQC"
+  version: "Ee3kRDaGcJ0kQ4GP7TUNOGswwt_Xj6uGe9gUzP7axPwC"
   dest_path: "android_33_google_apis_x64_swangle"
 }
 avd_name: "android_33_google_apis_x64"
diff --git a/tools/android/checkstyle/chromium-style-5.0.xml b/tools/android/checkstyle/chromium-style-5.0.xml
index 7d0caa9..a22c863 100644
--- a/tools/android/checkstyle/chromium-style-5.0.xml
+++ b/tools/android/checkstyle/chromium-style-5.0.xml
@@ -108,7 +108,11 @@
       <!-- https://source.android.com/docs/setup/contribute/code-style#treat-acronyms-as-words -->
       <property name="severity" value="warning"/>
       <property name="allowedAbbreviationLength" value="0"/>
-      <property name="allowedAbbreviations" value="GURL"/>
+      <!-- Fixing/changing GURL is not happening. Single letter variable names
+      do not have trailing lower case letters, and often must be in the middle
+      of an associated method name, especially when the name needs ForTesting
+      suffix. -->
+      <property name="allowedAbbreviations" value="GURL,X,Y,Z"/>
     </module>
     <module name="FallThrough">
       <property name="severity" value="error"/>
diff --git a/tools/binary_size/generate_milestone_reports.py b/tools/binary_size/generate_milestone_reports.py
index 16a6562..c48dfd9 100755
--- a/tools/binary_size/generate_milestone_reports.py
+++ b/tools/binary_size/generate_milestone_reports.py
@@ -115,6 +115,7 @@
     '127.0.6533.27',
     '128.0.6613.20',
     '129.0.6668.32',
+    '130.0.6723.20',
 ]
 
 
diff --git a/tools/crates/create_update_cl.py b/tools/crates/create_update_cl.py
index 6df3ba3..7026e8b 100755
--- a/tools/crates/create_update_cl.py
+++ b/tools/crates/create_update_cl.py
@@ -528,8 +528,15 @@
                "and run `tools/crates/run_gnrt.py vendor` again.")
 
 
-def RaiseErrorIfGitIsDirty():
+def IsGitDirty():
     if Git("status", "--porcelain"):
+        return True
+    else:
+        return False
+
+
+def RaiseErrorIfGitIsDirty():
+    if IsGitDirty():
         raise RuntimeError("Dirty `git status` - save you local changes "\
                            "before rerunning the script")
 
@@ -563,11 +570,16 @@
         *args)
 
 
-def GitCommit(args, title):
-    Git("commit", "-m", title)
-    if args.upload:
-        print(f"  Running `git cl upload ...` ...")
-        GitClUpload("-m", title)
+def GitCommit(args, title, error_if_no_changes=True):
+    if IsGitDirty():
+        Git("commit", "-m", title)
+        if args.upload:
+            print(f"  Running `git cl upload ...` ...")
+            GitClUpload("-m", title)
+    else:
+        if error_if_no_changes:
+            raise RuntimeError(
+                f"The '%title' commit unexpectedly has no changes")
 
 
 def ResolveCrateNameToCrateId(crate_name):
@@ -694,7 +706,12 @@
             print(
                 f"WARNING: {old_target_dir} unexpectedly has less files "\
                 f"than {new_target_dir}")
-    GitCommit(args, "Removing //third_party/rust/.../<old_epoch>")
+    GitCommit(
+        args,
+        "Removing //third_party/rust/.../<old_epoch>",
+        # Just skip this commit when `manual` mode is used in
+        # a scenario that *only* performs minor version updates.
+        error_if_no_changes=False)
 
     # Fix up the target names
     print(f"  Updating the target name in BUILD.gn files...")
@@ -716,7 +733,12 @@
             with open(path, 'w') as file:
                 file.write(file_contents)
             Git("add", "--", path)
-    GitCommit(args, "Updating the target name in BUILD.gn files")
+    GitCommit(
+        args,
+        "Updating the target name in BUILD.gn files",
+        # Just skip this commit when `manual` mode is used in
+        # a scenario that *only* performs minor version updates.
+        error_if_no_changes=False)
 
 
 def main():
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 948e2348..e0534552 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -27,13 +27,9 @@
   # this dict to look up which config to use for a given bot.
   'builder_groups': {
     'chrome': {
-      'lacros-amd64-generic-chrome': 'chromeos_amd64-generic_lacros_official_skylab_reclient',
-      'lacros-arm-generic-chrome': 'chromeos_arm-generic_lacros_official_skylab_reclient',
-      'lacros-arm64-generic-chrome': 'chromeos_arm64-generic_lacros_official_skylab_reclient',
       # Don't include unwind tables for linux-/mac-/win-/win64-chrome builders.
       # They monitor binary size growth, which may be affected by the tables.
       'linux-chrome': 'official_reclient',
-      'linux-lacros-chrome': 'official_reclient_lacros_include_unwind_tables',
       'mac-chrome': 'official_reclient_mac',
       'win-branded-rel': 'chrome_branded_reclient_minimal_symbols',
       'win-chrome': 'official_reclient_x86',
@@ -42,8 +38,6 @@
 
     'chrome.gpu.fyi': {
       'ChromeOS FYI Release Skylab (jacuzzi)': 'gpu_tests_chromeos_jacuzzi_release_trybot_dcheck_off_no_symbols_reclient_skylab',
-      'Lacros FYI Release (jacuzzi)': 'gpu_fyi_tests_lacros_jacuzzi_release_trybot_dcheck_off_no_symbols_reclient',
-      'Lacros FYI Release (octopus)': 'gpu_fyi_tests_lacros_octopus_release_trybot_dcheck_off_no_symbols_reclient',
     },
 
     'chrome.pgo': {
@@ -77,7 +71,6 @@
       'codesearch-gen-chromium-cronet': 'codesearch_gen_chromium_cronet_bot_reclient',
       'codesearch-gen-chromium-fuchsia': 'codesearch_gen_chromium_fuchsia_bot_reclient',
       'codesearch-gen-chromium-ios': 'codesearch_gen_chromium_ios_bot_reclient',
-      'codesearch-gen-chromium-lacros': 'codesearch_gen_chromium_lacros_bot_reclient',
       'codesearch-gen-chromium-linux': 'codesearch_gen_chromium_bot_reclient',
       'codesearch-gen-chromium-mac': 'codesearch_gen_chromium_mac_bot_reclient',
       'codesearch-gen-chromium-webview': 'codesearch_gen_chromium_android_bot_reclient',
@@ -94,9 +87,6 @@
       'android_arm64_high_end-builder-perf': 'official_reclient_minimal_symbols_android_arm64_high_end',
       'android_arm64_high_end-builder-perf-pgo': 'official_reclient_minimal_symbols_android_arm64_high_end_pgo',
       'chromecast-linux-builder-perf': 'cast_binary_size_reclient',
-      'chromeos-amd64-generic-lacros-builder-perf': 'chromeos_amd64-generic_lacros_official_reclient',
-      'chromeos-arm-generic-lacros-builder-perf': 'chromeos_arm-generic_lacros_official_reclient',
-      'chromeos-arm64-generic-lacros-builder-perf': 'chromeos_arm64-generic_lacros_official_reclient',
       'linux-builder-perf': 'official_linux_perf',
       'linux-builder-perf-pgo': 'official_reclient_linux_perf_pgo',
       'linux-builder-perf-rel': 'official_linux_perf',
@@ -130,9 +120,6 @@
       'android_arm64_high_end-builder-perf': 'official_reclient_minimal_symbols_android_arm64_high_end',
       'android_arm64_high_end-builder-perf-pgo': 'official_reclient_minimal_symbols_android_arm64_high_end_pgo',
       'chromecast-linux-builder-perf': 'cast_binary_size_reclient',
-      'chromeos-amd64-generic-lacros-builder-perf': 'chromeos_amd64-generic_lacros_official_reclient',
-      'chromeos-arm-generic-lacros-builder-perf': 'chromeos_arm-generic_lacros_official_reclient',
-      'chromeos-arm64-generic-lacros-builder-perf': 'chromeos_arm64-generic_lacros_official_reclient',
       'linux-builder-perf': 'official_linux_perf',
       'linux-builder-perf-pgo': 'official_reclient_linux_perf_pgo',
       'linux-builder-perf-rel': 'official_linux_perf',
@@ -182,7 +169,6 @@
       'android-buildspeed-dbg': 'android_debug_bot_reclient_fastbuild',
       'android-emulator-finch-smoke-chrome': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_trichrome_reclient',
       'chromeos-arm-generic-cfi-thin-lto-chrome-reclient': 'chromeos_arm-generic_cfi_thin_lto_official_reclient',
-      'lacros-arm-generic-chrome-fyi-reclient': 'chromeos_arm-generic_lacros_official_skylab_reclient',
       'linux-finch-smoke-chrome': 'official_reclient',
       'lorenz-graph-dbg': 'android_debug_bot_reclient_external_fastbuild',
       'mac-arm64-finch-smoke-chrome': 'official_reclient_mac_arm',
@@ -215,12 +201,8 @@
     },
 
     'tryserver.chrome': {
-      'lacros-amd64-generic-chrome': 'chromeos_amd64-generic_lacros_official_skylab',
-      'lacros-arm-generic-chrome': 'chromeos_arm-generic_lacros_official_skylab',
-      'lacros-arm64-generic-chrome': 'chromeos_arm64-generic_lacros_official_skylab',
       'linux-chrome': 'official_reclient',
       'linux-finch-smoke-chrome': 'official_reclient',
-      'linux-lacros-chrome': 'official_reclient_lacros_include_unwind_tables',
       'mac-arm64-finch-smoke-chrome': 'official_reclient_mac_arm',
       'mac-chrome': 'official_reclient_mac',
       'win-branded-compile-rel': 'chrome_branded_reclient_minimal_symbols',
@@ -338,45 +320,10 @@
       'chrome_branded', 'minimal_symbols', 'release_bot_reclient',
     ],
 
-    'chromeos_amd64-generic_lacros_official_reclient': [
-      'chromeos_amd64-generic-crostoolchain_reclient', 'lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto',
-    ],
-
-    # This is the same as 'chromeos_amd64-generic_lacros_official', except for
-    # the 'is_skylab' arg. Please keep them in sync.
-    'chromeos_amd64-generic_lacros_official_skylab': [
-      'chromeos_amd64-generic-crostoolchain', 'lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto', 'is_skylab',
-    ],
-    'chromeos_amd64-generic_lacros_official_skylab_reclient': [
-      'chromeos_amd64-generic-crostoolchain_reclient', 'lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto', 'is_skylab',
-    ],
-
     'chromeos_arm-generic_cfi_thin_lto_official_reclient': [
       'chromeos_device_reclient', 'arm-generic', 'cfi_full', 'thin_lto', 'official', 'full_symbols', 'ozone_headless'
     ],
 
-    'chromeos_arm-generic_lacros_official_reclient': [
-      'chromeos_arm-generic-crostoolchain_reclient', 'lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto',
-    ],
-
-    'chromeos_arm-generic_lacros_official_skylab': [
-      'chromeos_arm-generic-crostoolchain', 'lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto', 'is_skylab',
-    ],
-    'chromeos_arm-generic_lacros_official_skylab_reclient': [
-      'chromeos_arm-generic-crostoolchain_reclient', 'lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto', 'is_skylab',
-    ],
-
-    'chromeos_arm64-generic_lacros_official_reclient': [
-      'chromeos_arm64-generic-crostoolchain_reclient', 'lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto',
-    ],
-
-    'chromeos_arm64-generic_lacros_official_skylab': [
-      'chromeos_arm64-generic-crostoolchain', 'lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto', 'is_skylab',
-    ],
-    'chromeos_arm64-generic_lacros_official_skylab_reclient': [
-      'chromeos_arm64-generic-crostoolchain_reclient', 'lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto', 'is_skylab',
-    ],
-
     'chromeos_kevin_include_unwind_tables_official_reclient': [
       'chromeos_kevin_reclient', 'include_unwind_tables', 'official',
     ],
@@ -431,12 +378,6 @@
       'codesearch_ios_reclient', 'ios', 'ios_disable_code_signing'
     ],
 
-    # Lacros uses different gn args to build for chromeOS device vs. Linux. For
-    # simplicity, we only generate codesearch x-refs for lacros on Linux.
-    'codesearch_gen_chromium_lacros_bot_reclient': [
-      'codesearch_reclient', 'lacros_on_linux', 'use_cups',
-    ],
-
     'codesearch_gen_chromium_mac_bot_reclient': [
       'codesearch_reclient', 'mac',
     ],
@@ -449,16 +390,6 @@
       'debug_bot_reclient',
     ],
 
-    'gpu_fyi_tests_lacros_jacuzzi_release_trybot_dcheck_off_no_symbols_reclient': [
-      'chromeos', 'jacuzzi', 'official', 'release_bot_reclient', 'no_symbols',
-      'chromeos_device_reclient', 'also_build_lacros_chrome_for_architecture_arm64',
-    ],
-
-    'gpu_fyi_tests_lacros_octopus_release_trybot_dcheck_off_no_symbols_reclient': [
-      'chromeos', 'octopus', 'official', 'release_bot_reclient', 'no_symbols',
-      'chromeos_device_reclient', 'also_build_lacros_chrome_for_architecture_amd64',
-    ],
-
     'gpu_tests_android_release_trybot_arm64_reclient': [
       'gpu_tests', 'android', 'release_trybot_minimal_symbols_reclient', 'arm64', 'static_angle',
     ],
@@ -547,11 +478,6 @@
       'cast_receiver_size_optimized_internal', 'official', 'reclient', 'minimal_symbols', 'fuchsia', 'fuchsia_include_sd_images', 'arm64', 'ffmpeg_branding_chrome', 'proprietary_codecs', 'test_isolate_no_emulator',
     ],
 
-    'official_reclient_lacros_include_unwind_tables': [
-      'official', 'reclient', 'lacros', 'minimal_symbols', 'include_unwind_tables',
-      'also_build_ash_chrome',
-    ],
-
     'official_reclient_linux_perf_pgo': [
       'official', 'reclient', 'no_gnome_keyring', 'minimal_symbols',
     ],
@@ -718,22 +644,6 @@
   # This is a dict mapping a given 'mixin' name to a dict of settings that
   # mb should use. See //tools/mb/docs/user_guide.md for more information.
   'mixins': {
-    'also_build_ash_chrome': {
-      'gn_args': 'also_build_ash_chrome=true'
-    },
-
-    'also_build_lacros_chrome_for_architecture_amd64': {
-      'gn_args': 'also_build_lacros_chrome_for_architecture="amd64"',
-    },
-
-    'also_build_lacros_chrome_for_architecture_arm64': {
-      'gn_args': 'also_build_lacros_chrome_for_architecture="arm64"',
-    },
-
-    'amd64-generic-crostoolchain': {
-      'args_file': '//build/args/chromeos/amd64-generic-crostoolchain.gni',
-    },
-
     # We build Android with codecs on most bots to ensure maximum test
     # coverage, but use 'android_without_codecs' on bots responsible for
     # building publicly advertised non-Official Android builds --
@@ -772,18 +682,10 @@
       'args_file': '//build/args/chromeos/arm-generic.gni',
     },
 
-    'arm-generic-crostoolchain': {
-      'args_file': '//build/args/chromeos/arm-generic-crostoolchain.gni',
-    },
-
     'arm64': {
       'gn_args': 'target_cpu="arm64"',
     },
 
-    'arm64-generic-crostoolchain': {
-      'args_file': '//build/args/chromeos/arm64-generic-crostoolchain.gni',
-    },
-
     'arm64_host': {
       'gn_args': 'test_host_cpu="arm64"',
     },
@@ -834,39 +736,10 @@
       'gn_args': 'target_os="chromeos"',
     },
 
-    'chromeos_amd64-generic-crostoolchain': {
-      'mixins': ['chromeos_device', 'amd64-generic-crostoolchain',]
-    },
-
-    'chromeos_amd64-generic-crostoolchain_reclient': {
-      'mixins': ['chromeos_device_reclient', 'amd64-generic-crostoolchain', 'ozone_headless']
-    },
-
-    'chromeos_arm-generic-crostoolchain': {
-      'mixins': ['chromeos_device', 'arm-generic-crostoolchain',]
-    },
-
-    'chromeos_arm-generic-crostoolchain_reclient': {
-      'mixins': ['chromeos_device_reclient', 'arm-generic-crostoolchain', 'ozone_headless']
-    },
-
-    'chromeos_arm64-generic-crostoolchain': {
-      'mixins': ['chromeos_device', 'arm64-generic-crostoolchain',]
-    },
-
-    'chromeos_arm64-generic-crostoolchain_reclient': {
-      'mixins': ['chromeos_device_reclient', 'arm64-generic-crostoolchain', 'ozone_headless']
-    },
-
     'chromeos_codecs': {
       'mixins': ['ffmpeg_branding_chromeos', 'proprietary_codecs'],
     },
 
-    'chromeos_device': {
-      'gn_args': 'is_chromeos_device=true ozone_platform_headless=true',
-      'mixins': ['dcheck_off', 'reclient'],
-    },
-
     'chromeos_device_reclient': {
       'gn_args': 'is_chromeos_device=true',
       'mixins': ['dcheck_off', 'reclient'],
@@ -1031,14 +904,6 @@
       'args_file': '//build/args/chromeos/kevin.gni',
     },
 
-    'lacros': {
-      'gn_args': 'target_os="chromeos" chromeos_is_browser_only=true'
-    },
-
-    'lacros_on_linux': {
-      'gn_args': 'target_os="chromeos" chromeos_is_browser_only=true'
-    },
-
     'lsan': {
       'gn_args': 'is_lsan=true',
     },
@@ -1079,10 +944,6 @@
       'gn_args': 'ignore_missing_widevine_signing_cert=true',
     },
 
-    'octopus': {
-      'args_file': '//build/args/chromeos/octopus.gni',
-    },
-
     'official': {
       'mixins': ['official_optimize'],
       'gn_args': 'is_chrome_branded=true',
diff --git a/tools/mb/mb_config_expectations/chrome.gpu.fyi.json b/tools/mb/mb_config_expectations/chrome.gpu.fyi.json
index 70b725b..e534ebfad 100644
--- a/tools/mb/mb_config_expectations/chrome.gpu.fyi.json
+++ b/tools/mb/mb_config_expectations/chrome.gpu.fyi.json
@@ -13,35 +13,5 @@
       "symbol_level": 0,
       "use_remoteexec": true
     }
-  },
-  "Lacros FYI Release (jacuzzi)": {
-    "args_file": "//build/args/chromeos/jacuzzi.gni",
-    "gn_args": {
-      "also_build_lacros_chrome_for_architecture": "arm64",
-      "dcheck_always_on": false,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_component_build": false,
-      "is_debug": false,
-      "is_official_build": true,
-      "symbol_level": 0,
-      "target_os": "chromeos",
-      "use_remoteexec": true
-    }
-  },
-  "Lacros FYI Release (octopus)": {
-    "args_file": "//build/args/chromeos/octopus.gni",
-    "gn_args": {
-      "also_build_lacros_chrome_for_architecture": "amd64",
-      "dcheck_always_on": false,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_component_build": false,
-      "is_debug": false,
-      "is_official_build": true,
-      "symbol_level": 0,
-      "target_os": "chromeos",
-      "use_remoteexec": true
-    }
   }
 }
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/chrome.json b/tools/mb/mb_config_expectations/chrome.json
index 7a35a6e..94522e23 100644
--- a/tools/mb/mb_config_expectations/chrome.json
+++ b/tools/mb/mb_config_expectations/chrome.json
@@ -1,55 +1,4 @@
 {
-  "lacros-amd64-generic-chrome": {
-    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
-    "gn_args": {
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": false,
-      "is_cfi": true,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "is_skylab": true,
-      "ozone_platform_headless": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true,
-      "use_thin_lto": true
-    }
-  },
-  "lacros-arm-generic-chrome": {
-    "args_file": "//build/args/chromeos/arm-generic-crostoolchain.gni",
-    "gn_args": {
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": false,
-      "is_cfi": true,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "is_skylab": true,
-      "ozone_platform_headless": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true,
-      "use_thin_lto": true
-    }
-  },
-  "lacros-arm64-generic-chrome": {
-    "args_file": "//build/args/chromeos/arm64-generic-crostoolchain.gni",
-    "gn_args": {
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": false,
-      "is_cfi": true,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "is_skylab": true,
-      "ozone_platform_headless": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true,
-      "use_thin_lto": true
-    }
-  },
   "linux-chrome": {
     "gn_args": {
       "is_chrome_branded": true,
@@ -57,18 +6,6 @@
       "use_remoteexec": true
     }
   },
-  "linux-lacros-chrome": {
-    "gn_args": {
-      "also_build_ash_chrome": true,
-      "chromeos_is_browser_only": true,
-      "exclude_unwind_tables": false,
-      "is_chrome_branded": true,
-      "is_official_build": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true
-    }
-  },
   "mac-chrome": {
     "gn_args": {
       "ignore_missing_widevine_signing_cert": true,
diff --git a/tools/mb/mb_config_expectations/chromium.infra.codesearch.json b/tools/mb/mb_config_expectations/chromium.infra.codesearch.json
index f7f6226..5c5503c 100644
--- a/tools/mb/mb_config_expectations/chromium.infra.codesearch.json
+++ b/tools/mb/mb_config_expectations/chromium.infra.codesearch.json
@@ -82,21 +82,6 @@
       "use_remoteexec": true
     }
   },
-  "codesearch-gen-chromium-lacros": {
-    "gn_args": {
-      "blink_enable_generated_code_formatting": true,
-      "chromeos_is_browser_only": true,
-      "clang_use_chrome_plugins": false,
-      "enable_kythe_annotations": true,
-      "is_clang": true,
-      "is_component_build": true,
-      "is_debug": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_cups": true,
-      "use_remoteexec": true
-    }
-  },
   "codesearch-gen-chromium-linux": {
     "gn_args": {
       "blink_enable_generated_code_formatting": true,
diff --git a/tools/mb/mb_config_expectations/chromium.perf.json b/tools/mb/mb_config_expectations/chromium.perf.json
index 9c0b45f..5a39f5d 100644
--- a/tools/mb/mb_config_expectations/chromium.perf.json
+++ b/tools/mb/mb_config_expectations/chromium.perf.json
@@ -130,54 +130,6 @@
       "use_remoteexec": true
     }
   },
-  "chromeos-amd64-generic-lacros-builder-perf": {
-    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
-    "gn_args": {
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": false,
-      "is_cfi": true,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "ozone_platform_headless": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true,
-      "use_thin_lto": true
-    }
-  },
-  "chromeos-arm-generic-lacros-builder-perf": {
-    "args_file": "//build/args/chromeos/arm-generic-crostoolchain.gni",
-    "gn_args": {
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": false,
-      "is_cfi": true,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "ozone_platform_headless": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true,
-      "use_thin_lto": true
-    }
-  },
-  "chromeos-arm64-generic-lacros-builder-perf": {
-    "args_file": "//build/args/chromeos/arm64-generic-crostoolchain.gni",
-    "gn_args": {
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": false,
-      "is_cfi": true,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "ozone_platform_headless": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true,
-      "use_thin_lto": true
-    }
-  },
   "linux-builder-perf": {
     "gn_args": {
       "chrome_pgo_phase": 0,
diff --git a/tools/mb/mb_config_expectations/chromium.perf.pinpoint.json b/tools/mb/mb_config_expectations/chromium.perf.pinpoint.json
index e2ba2be..88190d0a 100644
--- a/tools/mb/mb_config_expectations/chromium.perf.pinpoint.json
+++ b/tools/mb/mb_config_expectations/chromium.perf.pinpoint.json
@@ -130,54 +130,6 @@
       "use_remoteexec": true
     }
   },
-  "chromeos-amd64-generic-lacros-builder-perf": {
-    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
-    "gn_args": {
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": false,
-      "is_cfi": true,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "ozone_platform_headless": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true,
-      "use_thin_lto": true
-    }
-  },
-  "chromeos-arm-generic-lacros-builder-perf": {
-    "args_file": "//build/args/chromeos/arm-generic-crostoolchain.gni",
-    "gn_args": {
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": false,
-      "is_cfi": true,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "ozone_platform_headless": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true,
-      "use_thin_lto": true
-    }
-  },
-  "chromeos-arm64-generic-lacros-builder-perf": {
-    "args_file": "//build/args/chromeos/arm64-generic-crostoolchain.gni",
-    "gn_args": {
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": false,
-      "is_cfi": true,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "ozone_platform_headless": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true,
-      "use_thin_lto": true
-    }
-  },
   "linux-builder-perf": {
     "gn_args": {
       "chrome_pgo_phase": 0,
diff --git a/tools/mb/mb_config_expectations/internal.chrome.fyi.json b/tools/mb/mb_config_expectations/internal.chrome.fyi.json
index c07a6952..d198bcec 100644
--- a/tools/mb/mb_config_expectations/internal.chrome.fyi.json
+++ b/tools/mb/mb_config_expectations/internal.chrome.fyi.json
@@ -45,23 +45,6 @@
       "use_thin_lto": true
     }
   },
-  "lacros-arm-generic-chrome-fyi-reclient": {
-    "args_file": "//build/args/chromeos/arm-generic-crostoolchain.gni",
-    "gn_args": {
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": false,
-      "is_cfi": true,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "is_skylab": true,
-      "ozone_platform_headless": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true,
-      "use_thin_lto": true
-    }
-  },
   "linux-finch-smoke-chrome": {
     "gn_args": {
       "is_chrome_branded": true,
diff --git a/tools/mb/mb_config_expectations/tryserver.chrome.json b/tools/mb/mb_config_expectations/tryserver.chrome.json
index fde1d7f1..32c9c7e 100644
--- a/tools/mb/mb_config_expectations/tryserver.chrome.json
+++ b/tools/mb/mb_config_expectations/tryserver.chrome.json
@@ -1,55 +1,4 @@
 {
-  "lacros-amd64-generic-chrome": {
-    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
-    "gn_args": {
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": false,
-      "is_cfi": true,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "is_skylab": true,
-      "ozone_platform_headless": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true,
-      "use_thin_lto": true
-    }
-  },
-  "lacros-arm-generic-chrome": {
-    "args_file": "//build/args/chromeos/arm-generic-crostoolchain.gni",
-    "gn_args": {
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": false,
-      "is_cfi": true,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "is_skylab": true,
-      "ozone_platform_headless": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true,
-      "use_thin_lto": true
-    }
-  },
-  "lacros-arm64-generic-chrome": {
-    "args_file": "//build/args/chromeos/arm64-generic-crostoolchain.gni",
-    "gn_args": {
-      "chromeos_is_browser_only": true,
-      "dcheck_always_on": false,
-      "is_cfi": true,
-      "is_chrome_branded": true,
-      "is_chromeos_device": true,
-      "is_official_build": true,
-      "is_skylab": true,
-      "ozone_platform_headless": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true,
-      "use_thin_lto": true
-    }
-  },
   "linux-chrome": {
     "gn_args": {
       "is_chrome_branded": true,
@@ -64,18 +13,6 @@
       "use_remoteexec": true
     }
   },
-  "linux-lacros-chrome": {
-    "gn_args": {
-      "also_build_ash_chrome": true,
-      "chromeos_is_browser_only": true,
-      "exclude_unwind_tables": false,
-      "is_chrome_branded": true,
-      "is_official_build": true,
-      "symbol_level": 1,
-      "target_os": "chromeos",
-      "use_remoteexec": true
-    }
-  },
   "mac-arm64-finch-smoke-chrome": {
     "gn_args": {
       "ignore_missing_widevine_signing_cert": true,
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 06d7d85..dc251a9a6 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -46758,9 +46758,12 @@
   <suffix name="GoogleAppsButton" label="Google Apps details page button"/>
   <suffix name="GoogleToolsBuiltInButton"
       label="Google tools built in details page button"/>
-  <suffix name="HelpMeWriteButton" label="Help me write page button"/>
+  <suffix name="HelpMeReadButton" label="Help me read details page button"/>
+  <suffix name="HelpMeWriteButton" label="Help me write details page button"/>
   <suffix name="LauncherSearchButton"
       label="Launcher search details page button"/>
+  <suffix name="LiveTranslateButton"
+      label="Live translate details page button"/>
   <suffix name="LumaFusionButton" label="LumaFusion details page button"/>
   <suffix name="MessagingButton" label="Messaging details page button"/>
   <suffix name="MobileGamingButton" label="Mobile Gaming details page button"/>
diff --git a/tools/metrics/histograms/metadata/account_manager/histograms.xml b/tools/metrics/histograms/metadata/account_manager/histograms.xml
index 921460111..3256192 100644
--- a/tools/metrics/histograms/metadata/account_manager/histograms.xml
+++ b/tools/metrics/histograms/metadata/account_manager/histograms.xml
@@ -50,7 +50,7 @@
 </histogram>
 
 <histogram name="AccountManager.EduCoexistence.FetchAccessTokenResult"
-    enum="GoogleServiceAuthError" expires_after="2024-11-01">
+    enum="GoogleServiceAuthError" expires_after="2025-10-01">
   <owner>agawronska@chromium.org</owner>
   <owner>cros-families-eng@google.com</owner>
   <summary>
@@ -61,7 +61,7 @@
 </histogram>
 
 <histogram name="AccountManager.EduCoexistenceV2.InSessionFlowResult"
-    enum="EduCoexistenceFlowV2Result" expires_after="2024-11-01">
+    enum="EduCoexistenceFlowV2Result" expires_after="2025-10-01">
   <owner>agawronska@chromium.org</owner>
   <owner>cros-families-eng@google.com</owner>
   <summary>
@@ -71,7 +71,7 @@
 </histogram>
 
 <histogram name="AccountManager.EduCoexistenceV2.OnboardingFlowResult"
-    enum="EduCoexistenceFlowV2Result" expires_after="2025-03-09">
+    enum="EduCoexistenceFlowV2Result" expires_after="2025-10-01">
   <owner>agawronska@chromium.org</owner>
   <owner>cros-families-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index fc8e0ac..1670d0e 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -5280,7 +5280,7 @@
 </histogram>
 
 <histogram name="Ash.Login.ShowGaiaSignin.PermanentlyUntrusted" enum="Boolean"
-    expires_after="2024-11-01">
+    expires_after="2025-10-01">
   <owner>agawronska@chromium.org</owner>
   <owner>cros-families-eng@google.com</owner>
   <summary>
@@ -5291,7 +5291,7 @@
 </histogram>
 
 <histogram name="Ash.Login.ShowGaiaSignin.WaitTime" units="ms"
-    expires_after="2025-03-09">
+    expires_after="2025-10-01">
   <owner>agawronska@chromium.org</owner>
   <owner>cros-families-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/borealis/histograms.xml b/tools/metrics/histograms/metadata/borealis/histograms.xml
index 5659c29..8095c3c 100644
--- a/tools/metrics/histograms/metadata/borealis/histograms.xml
+++ b/tools/metrics/histograms/metadata/borealis/histograms.xml
@@ -68,7 +68,7 @@
 </histogram>
 
 <histogram name="Borealis.Disk.InodeRatioAtStartup" units="KiB"
-    expires_after="2024-11-14">
+    expires_after="2024-12-15">
   <owner>philpearson@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>
@@ -85,28 +85,28 @@
 </histogram>
 
 <histogram name="Borealis.Disk.StatefulWritesDaily" units="KiB"
-    expires_after="2024-10-28">
+    expires_after="2024-12-15">
   <owner>philpearson@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>Borealis stateful KiB written per day. Reported daily.</summary>
 </histogram>
 
 <histogram name="Borealis.Disk.SwapReadsDaily" units="KiB"
-    expires_after="2024-10-28">
+    expires_after="2024-12-15">
   <owner>philpearson@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>Borealis swap file KiB read per day. Reported daily.</summary>
 </histogram>
 
 <histogram name="Borealis.Disk.SwapWritesDaily" units="KiB"
-    expires_after="2024-10-28">
+    expires_after="2024-12-15">
   <owner>philpearson@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>Borealis swap file KiB written per day. Reported daily.</summary>
 </histogram>
 
 <histogram name="Borealis.Disk.VMUsageToTotalSpacePercentageAtStartup"
-    units="%" expires_after="2024-11-14">
+    units="%" expires_after="2024-12-15">
   <owner>philpearson@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>
@@ -117,7 +117,7 @@
 </histogram>
 
 <histogram name="Borealis.Disk.VMUsageToTotalUsagePercentageAtStartup"
-    units="%" expires_after="2024-11-14">
+    units="%" expires_after="2024-12-15">
   <owner>philpearson@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>
@@ -212,7 +212,7 @@
 </histogram>
 
 <histogram name="Borealis.Install.Source" enum="BorealisLaunchSource"
-    expires_after="2024-10-11">
+    expires_after="2024-12-15">
   <owner>philpearson@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>
@@ -224,7 +224,7 @@
 </histogram>
 
 <histogram name="Borealis.Launch.Source" enum="BorealisLaunchSource"
-    expires_after="2024-10-11">
+    expires_after="2024-12-15">
   <owner>philpearson@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>
@@ -238,7 +238,7 @@
 </histogram>
 
 <histogram name="Borealis.Shutdown.Attempt" enum="BooleanAttempted"
-    expires_after="2024-11-14">
+    expires_after="2024-12-15">
   <owner>philpearson@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>
@@ -259,7 +259,7 @@
 </histogram>
 
 <histogram name="Borealis.Startup.fsckResult" enum="FsckResult"
-    expires_after="2024-11-14">
+    expires_after="2024-12-15">
   <owner>philpearson@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>
@@ -269,7 +269,7 @@
 </histogram>
 
 <histogram name="Borealis.Startup.fsckTime" units="ms"
-    expires_after="2024-11-14">
+    expires_after="2024-12-15">
   <owner>philpearson@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>
@@ -322,7 +322,7 @@
 </histogram>
 
 <histogram name="Borealis.Startup.TimeToFirstWindow" units="ms"
-    expires_after="2024-10-13">
+    expires_after="2024-12-15">
   <owner>philpearson@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <improvement direction="LOWER_IS_BETTER"/>
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml
index 04e49345a..851508c 100644
--- a/tools/metrics/histograms/metadata/browser/histograms.xml
+++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -348,7 +348,7 @@
 </histogram>
 
 <histogram name="Browser.ERP.RecordsPerUploadFromNonChromeosDevice"
-    units="records" expires_after="2024-11-09">
+    units="records" expires_after="2025-11-09">
   <owner>jrhilke@chromium.org</owner>
   <owner>cros-reporting-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index d315138b..3aaf4e48 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -1155,7 +1155,7 @@
 </histogram>
 
 <histogram name="ChromeOS.CWP.JankinessTriggerStatus"
-    enum="ChromeOSJankinessTriggerStatus" expires_after="2024-10-06">
+    enum="ChromeOSJankinessTriggerStatus" expires_after="2025-10-06">
   <owner>gmx@chromium.org</owner>
   <owner>cwp-team@google.com</owner>
   <summary>
@@ -1222,8 +1222,7 @@
 </histogram>
 
 <histogram name="ChromeOS.CWP.UploadPerf" units="reports"
-    expires_after="2024-10-20">
-  <owner>aalexand@google.com</owner>
+    expires_after="2025-10-20">
   <owner>gmx@chromium.org</owner>
   <owner>cwp-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/custom_tabs/enums.xml b/tools/metrics/histograms/metadata/custom_tabs/enums.xml
index 356242b..64a3765 100644
--- a/tools/metrics/histograms/metadata/custom_tabs/enums.xml
+++ b/tools/metrics/histograms/metadata/custom_tabs/enums.xml
@@ -120,6 +120,13 @@
   <int value="57"
       label="Google bottom bar buttons EXTRA_GOOGLE_BOTTOM_BAR_BUTTONS"/>
   <int value="58" label="Support multi-network EXTRA_NETWORK"/>
+  <int value="59" label="Auth Tab EXTRA_LAUNCH_AUTH_TAB"/>
+  <int value="60"
+      label="Auth Tab custom redirect scheme EXTRA_REDIRECT_SCHEME"/>
+  <int value="61"
+      label="Auth Tab https redirect host EXTRA_HTTPS_REDIRECT_HOST"/>
+  <int value="62"
+      label="Auth Tab https redirect path EXTRA_HTTPS_REDIRECT_PATH"/>
 </enum>
 
 <enum name="CustomTabsMinimizedEvents">
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 71b6a2f3..2ff9c7a 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -72,9 +72,14 @@
       summary="Highlights app Google Apps detail page"/>
   <variant name="GoogleToolsBuiltInPage"
       summary="Google tools built in detail page"/>
+  <variant name="HelpMeReadPage"
+      summary="Highlights app Help me read detail page"/>
   <variant name="HelpMeWritePage"
       summary="Highlights app Help me write detail page"/>
-  <variant name="LauncherSearchPage" summary="Launcher search detail page"/>
+  <variant name="LauncherSearchPage"
+      summary="Highlights app Launcher search detail page"/>
+  <variant name="LiveTranslatePage"
+      summary="Highlights app Live translate detail page"/>
   <variant name="LumaFusionPage"
       summary="Highlights app LumaFusion detail page"/>
   <variant name="MessagingPage" summary="Highlights app Messaging detail page"/>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index 9cfc253..c70215aa 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -547,7 +547,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.Ads.AllPages.NonAdNetworkBytes" units="KB"
-    expires_after="2024-10-20">
+    expires_after="2025-10-20">
   <owner>alexmt@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
@@ -561,7 +561,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.Ads.AllPages.PercentNetworkBytesAds"
-    units="%" expires_after="2024-10-20">
+    units="%" expires_after="2025-10-20">
   <owner>alexmt@chromium.org</owner>
   <owner>johnidel@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/enums.xml b/tools/metrics/histograms/metadata/safe_browsing/enums.xml
index 6fd98ca..a56bad4 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/enums.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/enums.xml
@@ -663,6 +663,7 @@
   <int value="7" label="SITE_ENGAGEMENT_SCORE_EXISTS"/>
   <int value="8" label="NO_VISITS_TO_ANY_SITE_MORE_THAN_A_DAY_AGO"/>
   <int value="9" label="GLOBAL_ALLOWLIST_NOT_READY"/>
+  <int value="10" label="FAMILIAR_LIKELY_PREVIOUSLY_UNFAMILIAR"/>
 </enum>
 
 <enum name="SiteFamiliarityHistoryHeuristicName">
@@ -670,6 +671,7 @@
   <int value="1" label="VISITED_MORE_THAN_A_DAY_AGO"/>
   <int value="2" label="VISITED_MORE_THAN_FOUR_HOURS_AGO"/>
   <int value="3" label="NO_VISITS_TO_ANY_SITE_MORE_THAN_A_DAY_AGO"/>
+  <int value="4" label="VISITED_MORE_THAN_A_DAY_AGO_PREVIOUSLY_UNFAMILIAR"/>
 </enum>
 
 <enum name="SuspiciousSiteTriggerEvent">
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
index f7ad7921..1b5ea5f 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -219,17 +219,6 @@
   </summary>
 </histogram>
 
-<histogram name="SafeBrowsing.AndroidTelemetry.DownloadUrlChainThreatType"
-    enum="SBThreatType" expires_after="2025-03-23">
-  <owner>drubery@chromium.org</owner>
-  <owner>chrome-counter-abuse-alerts@google.com</owner>
-  <summary>
-    Records the most severe threat type in the url chain for each download on
-    Android. We only check against the malware and unwanted software lists. This
-    is logged once per download for users with Safe Browsing enabled.
-  </summary>
-</histogram>
-
 <histogram name="SafeBrowsing.AsyncCheck.CommittedNavigationIdsSize"
     units="count" expires_after="2025-02-10">
   <owner>xinghuilu@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml
index 1fe161a3..be477abd 100644
--- a/tools/metrics/histograms/metadata/sb_client/histograms.xml
+++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -680,7 +680,7 @@
 </histogram>
 
 <histogram name="SBClientPhishing.ImageEmbedder.Event"
-    enum="SBPhishingClassifierEvent" expires_after="2024-11-12">
+    enum="SBPhishingClassifierEvent" expires_after="2025-11-12">
   <owner>andysjlim@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/signin/enums.xml b/tools/metrics/histograms/metadata/signin/enums.xml
index 62ce3e85..7f355dcc 100644
--- a/tools/metrics/histograms/metadata/signin/enums.xml
+++ b/tools/metrics/histograms/metadata/signin/enums.xml
@@ -981,6 +981,9 @@
   <int value="22"
       label="DiceResponseHandler::Signin from sign in promo after password
              save (obsolete)"/>
+  <int value="23"
+      label="DiceWebSigninInterceptor::OnEnterpriseProfileCreationResult from
+             enterprise forced profile creation dialog"/>
 </enum>
 
 <enum name="SyncButtonClicked">
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py
index 55b1d94..7d83477 100644
--- a/tools/perf/core/bot_platforms.py
+++ b/tools/perf/core/bot_platforms.py
@@ -851,7 +851,7 @@
     pinpoint_only=True)
 ANDROID_PIXEL4_WEBVIEW = PerfPlatform(
     'android-pixel4_webview-perf', 'Android R',
-    _ANDROID_PIXEL4_WEBVIEW_BENCHMARK_CONFIGS, 40, 'android')
+    _ANDROID_PIXEL4_WEBVIEW_BENCHMARK_CONFIGS, 23, 'android')
 # TODO(crbug.com/307958700): Switch shard number back to a higher number around
 #                            28 once more devices are procured. Temporarily use
 #                            15 to avoid high contention in the pixel6 pool.
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index eed86a5..c1652b1a 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -6,7 +6,7 @@
         },
         "win": {
             "hash": "066fdeeadeb913dc99cd6cb19916237ccf804d49",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/ca467edc9dd2d58b6cfdf616cd69f0d457c15096/trace_processor_shell.exe"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/077bb360edecb33551e88c8097035e4b8cef245b/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "bb963e5488d9a76861165256126830c7ae523733",
@@ -22,7 +22,7 @@
         },
         "linux": {
             "hash": "a970025e2d93c368de68982b257f43c28cd3d4c5",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/ca467edc9dd2d58b6cfdf616cd69f0d457c15096/trace_processor_shell"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/c6494911fdbe08d2df0057eb94034dca930e3d68/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/perf/core/shard_maps/android-pixel4_webview-perf_map.json b/tools/perf/core/shard_maps/android-pixel4_webview-perf_map.json
index 06a17fd..6dc33b57 100644
--- a/tools/perf/core/shard_maps/android-pixel4_webview-perf_map.json
+++ b/tools/perf/core/shard_maps/android-pixel4_webview-perf_map.json
@@ -5,7 +5,10 @@
                 "abridged": false
             },
             "blink_perf.accessibility": {
-                "end": 9,
+                "abridged": false
+            },
+            "blink_perf.bindings": {
+                "end": 21,
                 "abridged": false
             },
             "speedometer2": {
@@ -18,12 +21,12 @@
     },
     "1": {
         "benchmarks": {
-            "blink_perf.accessibility": {
-                "begin": 9,
+            "blink_perf.bindings": {
+                "begin": 21,
                 "abridged": false
             },
-            "blink_perf.bindings": {
-                "end": 8,
+            "blink_perf.css": {
+                "end": 69,
                 "abridged": false
             },
             "speedometer2": {
@@ -36,12 +39,21 @@
     },
     "2": {
         "benchmarks": {
-            "blink_perf.bindings": {
-                "begin": 8,
+            "blink_perf.css": {
+                "begin": 69,
                 "abridged": false
             },
-            "blink_perf.css": {
-                "end": 4,
+            "blink_perf.dom": {
+                "abridged": false
+            },
+            "blink_perf.events": {
+                "abridged": false
+            },
+            "blink_perf.image_decoder": {
+                "abridged": false
+            },
+            "blink_perf.layout": {
+                "end": 14,
                 "abridged": false
             },
             "speedometer2": {
@@ -54,9 +66,9 @@
     },
     "3": {
         "benchmarks": {
-            "blink_perf.css": {
-                "begin": 4,
-                "end": 45,
+            "blink_perf.layout": {
+                "begin": 14,
+                "end": 99,
                 "abridged": false
             },
             "speedometer2": {
@@ -69,12 +81,21 @@
     },
     "4": {
         "benchmarks": {
-            "blink_perf.css": {
-                "begin": 45,
+            "blink_perf.layout": {
+                "begin": 99,
                 "abridged": false
             },
-            "blink_perf.dom": {
-                "end": 3,
+            "blink_perf.owp_storage": {
+                "abridged": false
+            },
+            "blink_perf.parser": {
+                "abridged": false
+            },
+            "blink_perf.shadow_dom": {
+                "abridged": false
+            },
+            "blink_perf.webaudio": {
+                "end": 2,
                 "abridged": false
             },
             "speedometer2": {
@@ -87,134 +108,8 @@
     },
     "5": {
         "benchmarks": {
-            "blink_perf.dom": {
-                "begin": 3,
-                "abridged": false
-            },
-            "blink_perf.events": {
-                "end": 5,
-                "abridged": false
-            },
-            "speedometer2": {
-                "abridged": false
-            },
-            "speedometer3": {
-                "abridged": false
-            }
-        }
-    },
-    "6": {
-        "benchmarks": {
-            "blink_perf.events": {
-                "begin": 5,
-                "abridged": false
-            },
-            "blink_perf.image_decoder": {
-                "abridged": false
-            },
-            "blink_perf.layout": {
-                "end": 23,
-                "abridged": false
-            },
-            "speedometer2": {
-                "abridged": false
-            },
-            "speedometer3": {
-                "abridged": false
-            }
-        }
-    },
-    "7": {
-        "benchmarks": {
-            "blink_perf.layout": {
-                "begin": 23,
-                "end": 57,
-                "abridged": false
-            },
-            "speedometer2": {
-                "abridged": false
-            },
-            "speedometer3": {
-                "abridged": false
-            }
-        }
-    },
-    "8": {
-        "benchmarks": {
-            "blink_perf.layout": {
-                "begin": 57,
-                "end": 95,
-                "abridged": false
-            },
-            "speedometer2": {
-                "abridged": false
-            },
-            "speedometer3": {
-                "abridged": false
-            }
-        }
-    },
-    "9": {
-        "benchmarks": {
-            "blink_perf.layout": {
-                "begin": 95,
-                "abridged": false
-            },
-            "blink_perf.owp_storage": {
-                "abridged": false
-            },
-            "blink_perf.parser": {
-                "end": 7,
-                "abridged": false
-            },
-            "speedometer2": {
-                "abridged": false
-            },
-            "speedometer3": {
-                "abridged": false
-            }
-        }
-    },
-    "10": {
-        "benchmarks": {
-            "blink_perf.parser": {
-                "begin": 7,
-                "abridged": false
-            },
-            "blink_perf.shadow_dom": {
-                "end": 14,
-                "abridged": false
-            },
-            "speedometer2": {
-                "abridged": false
-            },
-            "speedometer3": {
-                "abridged": false
-            }
-        }
-    },
-    "11": {
-        "benchmarks": {
-            "blink_perf.shadow_dom": {
-                "begin": 14,
-                "abridged": false
-            },
             "blink_perf.webaudio": {
-                "end": 4,
-                "abridged": false
-            },
-            "speedometer2": {
-                "abridged": false
-            },
-            "speedometer3": {
-                "abridged": false
-            }
-        }
-    },
-    "12": {
-        "benchmarks": {
-            "blink_perf.webaudio": {
-                "begin": 4,
+                "begin": 2,
                 "abridged": false
             },
             "blink_perf.webcodecs": {
@@ -239,7 +134,110 @@
                 "abridged": false
             },
             "rasterize_and_record_micro.top_25": {
-                "end": 4,
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            },
+            "speedometer3": {
+                "abridged": false
+            }
+        }
+    },
+    "6": {
+        "benchmarks": {
+            "rendering.mobile": {
+                "end": 48,
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            },
+            "speedometer3": {
+                "abridged": false
+            }
+        }
+    },
+    "7": {
+        "benchmarks": {
+            "rendering.mobile": {
+                "begin": 48,
+                "end": 103,
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            },
+            "speedometer3": {
+                "abridged": false
+            }
+        }
+    },
+    "8": {
+        "benchmarks": {
+            "rendering.mobile": {
+                "begin": 103,
+                "end": 157,
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            },
+            "speedometer3": {
+                "abridged": false
+            }
+        }
+    },
+    "9": {
+        "benchmarks": {
+            "rendering.mobile": {
+                "begin": 157,
+                "end": 200,
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            },
+            "speedometer3": {
+                "abridged": false
+            }
+        }
+    },
+    "10": {
+        "benchmarks": {
+            "rendering.mobile": {
+                "begin": 200,
+                "end": 246,
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            },
+            "speedometer3": {
+                "abridged": false
+            }
+        }
+    },
+    "11": {
+        "benchmarks": {
+            "rendering.mobile": {
+                "begin": 246,
+                "end": 310,
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            },
+            "speedometer3": {
+                "abridged": false
+            }
+        }
+    },
+    "12": {
+        "benchmarks": {
+            "rendering.mobile": {
+                "begin": 310,
+                "end": 350,
                 "abridged": false
             },
             "speedometer2": {
@@ -252,12 +250,9 @@
     },
     "13": {
         "benchmarks": {
-            "rasterize_and_record_micro.top_25": {
-                "begin": 4,
-                "abridged": false
-            },
             "rendering.mobile": {
-                "end": 8,
+                "begin": 350,
+                "end": 396,
                 "abridged": false
             },
             "speedometer2": {
@@ -271,160 +266,7 @@
     "14": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 8,
-                "end": 32,
-                "abridged": false
-            },
-            "speedometer2": {
-                "abridged": false
-            },
-            "speedometer3": {
-                "abridged": false
-            }
-        }
-    },
-    "15": {
-        "benchmarks": {
-            "rendering.mobile": {
-                "begin": 32,
-                "end": 55,
-                "abridged": false
-            },
-            "speedometer2": {
-                "abridged": false
-            },
-            "speedometer3": {
-                "abridged": false
-            }
-        }
-    },
-    "16": {
-        "benchmarks": {
-            "rendering.mobile": {
-                "begin": 55,
-                "end": 82,
-                "abridged": false
-            },
-            "speedometer2": {
-                "abridged": false
-            },
-            "speedometer3": {
-                "abridged": false
-            }
-        }
-    },
-    "17": {
-        "benchmarks": {
-            "rendering.mobile": {
-                "begin": 82,
-                "end": 117,
-                "abridged": false
-            },
-            "speedometer2": {
-                "abridged": false
-            },
-            "speedometer3": {
-                "abridged": false
-            }
-        }
-    },
-    "18": {
-        "benchmarks": {
-            "rendering.mobile": {
-                "begin": 117,
-                "end": 144,
-                "abridged": false
-            },
-            "speedometer2": {
-                "abridged": false
-            },
-            "speedometer3": {
-                "abridged": false
-            }
-        }
-    },
-    "19": {
-        "benchmarks": {
-            "rendering.mobile": {
-                "begin": 144,
-                "end": 166,
-                "abridged": false
-            },
-            "speedometer2": {
-                "abridged": false
-            },
-            "speedometer3": {
-                "abridged": false
-            }
-        }
-    },
-    "20": {
-        "benchmarks": {
-            "rendering.mobile": {
-                "begin": 166,
-                "end": 203,
-                "abridged": false
-            }
-        }
-    },
-    "21": {
-        "benchmarks": {
-            "rendering.mobile": {
-                "begin": 203,
-                "end": 239,
-                "abridged": false
-            }
-        }
-    },
-    "22": {
-        "benchmarks": {
-            "rendering.mobile": {
-                "begin": 239,
-                "end": 266,
-                "abridged": false
-            }
-        }
-    },
-    "23": {
-        "benchmarks": {
-            "rendering.mobile": {
-                "begin": 266,
-                "end": 312,
-                "abridged": false
-            }
-        }
-    },
-    "24": {
-        "benchmarks": {
-            "rendering.mobile": {
-                "begin": 312,
-                "end": 343,
-                "abridged": false
-            }
-        }
-    },
-    "25": {
-        "benchmarks": {
-            "rendering.mobile": {
-                "begin": 343,
-                "end": 379,
-                "abridged": false
-            }
-        }
-    },
-    "26": {
-        "benchmarks": {
-            "rendering.mobile": {
-                "begin": 379,
-                "end": 414,
-                "abridged": false
-            }
-        }
-    },
-    "27": {
-        "benchmarks": {
-            "rendering.mobile": {
-                "begin": 414,
+                "begin": 396,
                 "abridged": false
             },
             "rendering.mobile.notracing": {
@@ -444,11 +286,7 @@
             },
             "speedometer3": {
                 "abridged": false
-            }
-        }
-    },
-    "28": {
-        "benchmarks": {
+            },
             "speedometer3-future": {
                 "abridged": false
             },
@@ -456,109 +294,112 @@
                 "abridged": false
             },
             "system_health.common_mobile": {
-                "end": 21,
-                "abridged": false
-            }
-        }
-    },
-    "29": {
-        "benchmarks": {
-            "system_health.common_mobile": {
-                "begin": 21,
-                "end": 58,
-                "abridged": false
-            }
-        }
-    },
-    "30": {
-        "benchmarks": {
-            "system_health.common_mobile": {
-                "begin": 58,
-                "abridged": false
-            },
-            "system_health.memory_mobile": {
                 "end": 4,
                 "abridged": false
             }
         }
     },
-    "31": {
+    "15": {
         "benchmarks": {
-            "system_health.memory_mobile": {
+            "system_health.common_mobile": {
                 "begin": 4,
-                "end": 18,
-                "abridged": false
-            }
-        }
-    },
-    "32": {
-        "benchmarks": {
-            "system_health.memory_mobile": {
-                "begin": 18,
-                "end": 25,
-                "abridged": false
-            }
-        }
-    },
-    "33": {
-        "benchmarks": {
-            "system_health.memory_mobile": {
-                "begin": 25,
-                "end": 36,
-                "abridged": false
-            }
-        }
-    },
-    "34": {
-        "benchmarks": {
-            "system_health.memory_mobile": {
-                "begin": 36,
-                "end": 46,
-                "abridged": false
-            }
-        }
-    },
-    "35": {
-        "benchmarks": {
-            "system_health.memory_mobile": {
-                "begin": 46,
-                "end": 56,
-                "abridged": false
-            }
-        }
-    },
-    "36": {
-        "benchmarks": {
-            "system_health.memory_mobile": {
-                "begin": 56,
-                "end": 69,
-                "abridged": false
-            }
-        }
-    },
-    "37": {
-        "benchmarks": {
-            "system_health.memory_mobile": {
-                "begin": 69,
-                "abridged": false
-            }
-        }
-    },
-    "38": {
-        "benchmarks": {
-            "system_health.webview_startup": {
+                "end": 49,
                 "abridged": false
             },
-            "v8.browsing_mobile": {
-                "end": 5,
+            "speedometer2": {
+                "abridged": false
+            },
+            "speedometer3": {
                 "abridged": false
             }
         }
     },
-    "39": {
+    "16": {
+        "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 49,
+                "abridged": false
+            },
+            "system_health.memory_mobile": {
+                "end": 5,
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            },
+            "speedometer3": {
+                "abridged": false
+            }
+        }
+    },
+    "17": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 5,
+                "end": 21,
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            },
+            "speedometer3": {
+                "abridged": false
+            }
+        }
+    },
+    "18": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 21,
+                "end": 31,
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            },
+            "speedometer3": {
+                "abridged": false
+            }
+        }
+    },
+    "19": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 31,
+                "end": 48,
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            },
+            "speedometer3": {
+                "abridged": false
+            }
+        }
+    },
+    "20": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 48,
+                "end": 66,
+                "abridged": false
+            }
+        }
+    },
+    "21": {
+        "benchmarks": {
+            "system_health.memory_mobile": {
+                "begin": 66,
+                "abridged": false
+            },
+            "system_health.webview_startup": {
+                "abridged": false
+            }
+        }
+    },
+    "22": {
         "benchmarks": {
             "v8.browsing_mobile": {
-                "begin": 5,
                 "abridged": false
             },
             "wasmpspdfkit": {
@@ -571,49 +412,32 @@
     },
     "extra_infos": {
         "num_stories": 1131,
-        "predicted_min_shard_time": 786.0,
-        "predicted_min_shard_index": 37,
-        "predicted_max_shard_time": 1393.0,
-        "predicted_max_shard_index": 39,
-        "shard #0": 995.0,
-        "shard #1": 1015.0,
-        "shard #2": 1022.0,
-        "shard #3": 1003.0,
-        "shard #4": 1004.0,
-        "shard #5": 1025.0,
-        "shard #6": 1019.0,
-        "shard #7": 1014.0,
-        "shard #8": 1008.0,
-        "shard #9": 1021.0,
-        "shard #10": 1018.0,
-        "shard #11": 1029.0,
-        "shard #12": 1019.0,
-        "shard #13": 999.0,
-        "shard #14": 1024.0,
-        "shard #15": 1003.0,
-        "shard #16": 1009.0,
-        "shard #17": 1011.0,
-        "shard #18": 1012.0,
-        "shard #19": 1032.0,
-        "shard #20": 1034.0,
-        "shard #21": 1043.0,
-        "shard #22": 1024.0,
-        "shard #23": 1010.0,
-        "shard #24": 1031.0,
-        "shard #25": 1018.0,
-        "shard #26": 1002.0,
-        "shard #27": 974.0,
-        "shard #28": 1010.0,
-        "shard #29": 1024.0,
-        "shard #30": 1022.0,
-        "shard #31": 924.0,
-        "shard #32": 1032.0,
-        "shard #33": 1050.0,
-        "shard #34": 993.0,
-        "shard #35": 1035.0,
-        "shard #36": 978.0,
-        "shard #37": 786.0,
-        "shard #38": 1194.0,
-        "shard #39": 1393.0
+        "predicted_min_shard_time": 1635.0,
+        "predicted_min_shard_index": 20,
+        "predicted_max_shard_time": 1802.0,
+        "predicted_max_shard_index": 21,
+        "shard #0": 1691.0,
+        "shard #1": 1698.0,
+        "shard #2": 1701.0,
+        "shard #3": 1691.0,
+        "shard #4": 1678.0,
+        "shard #5": 1690.0,
+        "shard #6": 1713.0,
+        "shard #7": 1688.0,
+        "shard #8": 1692.0,
+        "shard #9": 1713.0,
+        "shard #10": 1691.0,
+        "shard #11": 1694.0,
+        "shard #12": 1715.0,
+        "shard #13": 1696.0,
+        "shard #14": 1683.0,
+        "shard #15": 1697.0,
+        "shard #16": 1663.0,
+        "shard #17": 1686.0,
+        "shard #18": 1677.0,
+        "shard #19": 1743.0,
+        "shard #20": 1635.0,
+        "shard #21": 1802.0,
+        "shard #22": 1716.0
     }
 }
diff --git a/tools/perf/core/shard_maps/timing_data/android-pixel4_webview-perf_timing.json b/tools/perf/core/shard_maps/timing_data/android-pixel4_webview-perf_timing.json
index f135ee8..477abe7 100644
--- a/tools/perf/core/shard_maps/timing_data/android-pixel4_webview-perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/android-pixel4_webview-perf_timing.json
@@ -1,58 +1,58 @@
 [
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "ad_frames.fencedframe/fencedframe: https://ad.doubleclick.net/ddm/adi/N378.275220.MYBESTOPTION.IT4/B8455269.126839257;sz=970x250"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "ad_frames.fencedframe/fencedframe: https://ad.doubleclick.net/ddm/adi/N378.275220.MYBESTOPTION.IT4/B9340305.127461685;sz=970x250"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "ad_frames.fencedframe/fencedframe: https://ad.doubleclick.net/ddm/adi/N378.275220.MYBESTOPTION.IT4/B9340305.127562781;sz=970x250"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "ad_frames.fencedframe/fencedframe: https://ad.doubleclick.net/ddm/adi/N378.275220.MYBESTOPTION.IT4/B9340305.128470354;sz=300x600"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "ad_frames.fencedframe/fencedframe: https://ad.doubleclick.net/ddm/adi/N378.275220.MYBESTOPTION.IT4/B9340305.128710365;sz=970x250"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "ad_frames.fencedframe/fencedframe: https://ad.doubleclick.net/ddm/adi/N378.3159.GOOGLE3/B9340305.138620671;sz=970x250"
     },
     {
-        "duration": "32.0",
+        "duration": "35.0",
         "name": "blink_perf.accessibility/build-table.html"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "blink_perf.accessibility/focus-links.html"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "blink_perf.accessibility/insert-block-child-after-many-inline-children.html"
     },
     {
-        "duration": "29.0",
+        "duration": "28.0",
         "name": "blink_perf.accessibility/line-breaks.html"
     },
     {
-        "duration": "30.0",
+        "duration": "29.0",
         "name": "blink_perf.accessibility/location-changes-css-animation.html"
     },
     {
-        "duration": "30.0",
+        "duration": "29.0",
         "name": "blink_perf.accessibility/location-changes-js-animation.html"
     },
     {
-        "duration": "155.0",
+        "duration": "140.0",
         "name": "blink_perf.accessibility/location-changes-scrolling-content-visibility-auto.html"
     },
     {
-        "duration": "156.0",
+        "duration": "139.0",
         "name": "blink_perf.accessibility/location-changes-scrolling.html"
     },
     {
@@ -60,7 +60,7 @@
         "name": "blink_perf.accessibility/many-nodes-toggle-aria-hidden.html"
     },
     {
-        "duration": "41.0",
+        "duration": "43.0",
         "name": "blink_perf.accessibility/many-nodes-toggle-content-visibility-auto.html"
     },
     {
@@ -68,7 +68,7 @@
         "name": "blink_perf.accessibility/many-nodes-toggle-content-visibility-hidden.html"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "blink_perf.accessibility/many-nodes-toggle-display-none-in-focusable.html"
     },
     {
@@ -76,7 +76,7 @@
         "name": "blink_perf.accessibility/many-nodes-toggle-display-none.html"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "blink_perf.accessibility/many-text-changes-deep-block-subtree.html"
     },
     {
@@ -84,7 +84,7 @@
         "name": "blink_perf.accessibility/many-text-changes-deep-hidden-subtree.html"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "blink_perf.accessibility/many-text-changes-deep-inline-subtree.html"
     },
     {
@@ -96,23 +96,23 @@
         "name": "blink_perf.accessibility/slot-updates.html"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "blink_perf.accessibility/text-changes-ignored-in-focusable.html"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "blink_perf.accessibility/text-changes-unignored-in-focusable.html"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "blink_perf.accessibility/textarea-append.html"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "blink_perf.accessibility/unassignable-slots-deep-tree.html"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "blink_perf.accessibility/unassignable-slots-focusable-containers.html"
     },
     {
@@ -120,619 +120,619 @@
         "name": "blink_perf.accessibility/unassignable-slots-wide-tree.html"
     },
     {
-        "duration": "24.0",
+        "duration": "26.0",
         "name": "blink_perf.bindings/append-child.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.bindings/create-element.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.bindings/document-implementation.html"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "blink_perf.bindings/dom-attribute-on-prototoype.html"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "blink_perf.bindings/first-child.html"
     },
     {
-        "duration": "21.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/gc-forest.html"
     },
     {
-        "duration": "26.0",
+        "duration": "22.0",
         "name": "blink_perf.bindings/gc-mini-tree.html"
     },
     {
-        "duration": "46.0",
+        "duration": "40.0",
         "name": "blink_perf.bindings/gc-tree.html"
     },
     {
-        "duration": "30.0",
+        "duration": "21.0",
         "name": "blink_perf.bindings/get-attribute-rare.html"
     },
     {
-        "duration": "23.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/get-attribute.html"
     },
     {
-        "duration": "22.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/get-element-by-id.html"
     },
     {
-        "duration": "20.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/get-elements-by-tag-name.html"
     },
     {
-        "duration": "21.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/id-getter.html"
     },
     {
-        "duration": "20.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/id-setter.html"
     },
     {
-        "duration": "20.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/indexed-getter.html"
     },
     {
-        "duration": "21.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/insert-before.html"
     },
     {
-        "duration": "21.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/named-property-enumerator.html"
     },
     {
-        "duration": "28.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/node-list-access.html"
     },
     {
-        "duration": "20.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/node-type.html"
     },
     {
-        "duration": "15.0",
+        "duration": "9.0",
         "name": "blink_perf.bindings/post-message.html"
     },
     {
-        "duration": "21.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/sequence-conversion-array.html"
     },
     {
-        "duration": "21.0",
+        "duration": "16.0",
         "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html"
     },
     {
-        "duration": "15.0",
+        "duration": "9.0",
         "name": "blink_perf.bindings/serialize-array.html"
     },
     {
-        "duration": "15.0",
+        "duration": "9.0",
         "name": "blink_perf.bindings/serialize-long-string.html"
     },
     {
-        "duration": "17.0",
+        "duration": "11.0",
         "name": "blink_perf.bindings/serialize-map.html"
     },
     {
-        "duration": "15.0",
+        "duration": "9.0",
         "name": "blink_perf.bindings/serialize-nested-array.html"
     },
     {
-        "duration": "21.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/set-attribute-rare.html"
     },
     {
-        "duration": "21.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/set-attribute.html"
     },
     {
-        "duration": "22.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/structured-clone-json-deserialize.html"
     },
     {
-        "duration": "22.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/structured-clone-json-serialize.html"
     },
     {
-        "duration": "1.0",
+        "duration": "0.0",
         "name": "blink_perf.bindings/structured-clone-long-string-deserialize.html"
     },
     {
-        "duration": "1.0",
+        "duration": "0.0",
         "name": "blink_perf.bindings/structured-clone-long-string-serialize.html"
     },
     {
-        "duration": "21.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/typed-array-construct-from-array.html"
     },
     {
-        "duration": "21.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/typed-array-construct-from-same-type.html"
     },
     {
-        "duration": "21.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/typed-array-construct-from-typed.html"
     },
     {
-        "duration": "20.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/typed-array-set-from-typed.html"
     },
     {
-        "duration": "21.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/undefined-first-child.html"
     },
     {
-        "duration": "20.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/undefined-get-element-by-id.html"
     },
     {
-        "duration": "20.0",
+        "duration": "14.0",
         "name": "blink_perf.bindings/undefined-id-getter.html"
     },
     {
-        "duration": "1.0",
+        "duration": "0.0",
         "name": "blink_perf.bindings/wasm_webgl_no_js.html"
     },
     {
-        "duration": "1.0",
+        "duration": "0.0",
         "name": "blink_perf.bindings/wasm_webgl_through_js.html"
     },
     {
-        "duration": "15.0",
+        "duration": "9.0",
         "name": "blink_perf.bindings/worker-structured-clone-different-payloads.html"
     },
     {
-        "duration": "30.0",
+        "duration": "19.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-from-worker.html"
     },
     {
-        "duration": "31.0",
+        "duration": "19.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-roundtrip.html"
     },
     {
-        "duration": "32.0",
+        "duration": "20.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-to-worker.html"
     },
     {
-        "duration": "21.0",
+        "duration": "13.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-DBMon-from-worker.html"
     },
     {
-        "duration": "19.0",
+        "duration": "11.0",
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-Map-from-worker.html"
     },
     {
-        "duration": "27.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-from-worker.html"
     },
     {
-        "duration": "29.0",
+        "duration": "17.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-roundtrip.html"
     },
     {
-        "duration": "31.0",
+        "duration": "18.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-to-worker.html"
     },
     {
-        "duration": "30.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/worker-transferable-from-worker.html"
     },
     {
-        "duration": "30.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/worker-transferable-roundtrip.html"
     },
     {
-        "duration": "31.0",
+        "duration": "15.0",
         "name": "blink_perf.bindings/worker-transferable-to-worker.html"
     },
     {
-        "duration": "33.0",
+        "duration": "16.0",
         "name": "blink_perf.css/AtScope.html"
     },
     {
-        "duration": "25.0",
+        "duration": "10.0",
         "name": "blink_perf.css/AtScopeAncestor.html"
     },
     {
-        "duration": "23.0",
+        "duration": "9.0",
         "name": "blink_perf.css/AtScopeInsertion.html"
     },
     {
-        "duration": "35.0",
+        "duration": "21.0",
         "name": "blink_perf.css/AttributeDescendantSelector.html"
     },
     {
-        "duration": "22.0",
+        "duration": "19.0",
         "name": "blink_perf.css/BigContainerQuery.html"
     },
     {
-        "duration": "28.0",
+        "duration": "23.0",
         "name": "blink_perf.css/CSSCountersCreate.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/CSSLogicalDirection.html"
     },
     {
-        "duration": "19.0",
+        "duration": "17.0",
         "name": "blink_perf.css/CSSPropertySetterGetter.html"
     },
     {
-        "duration": "20.0",
+        "duration": "17.0",
         "name": "blink_perf.css/CSSPropertySetterGetterMethods.html"
     },
     {
-        "duration": "19.0",
+        "duration": "17.0",
         "name": "blink_perf.css/CSSPropertyUpdateValue.html"
     },
     {
-        "duration": "45.0",
+        "duration": "38.0",
         "name": "blink_perf.css/CSSQuotesCreate.html"
     },
     {
-        "duration": "18.0",
+        "duration": "14.0",
         "name": "blink_perf.css/ChangeStyleCSSVariableRecalc.html"
     },
     {
-        "duration": "14.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleChildClassSelector.html"
     },
     {
-        "duration": "14.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleChildElementSelectors.html"
     },
     {
-        "duration": "19.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ChangeStyleCustomPropertyDeclaration.html"
     },
     {
-        "duration": "14.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleElementSelector.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html"
     },
     {
-        "duration": "14.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html"
     },
     {
-        "duration": "14.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html"
     },
     {
-        "duration": "18.0",
+        "duration": "15.0",
         "name": "blink_perf.css/ChangeStyleNewRuleInExistingStylesheet.html"
     },
     {
-        "duration": "14.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "17.0",
+        "duration": "13.0",
         "name": "blink_perf.css/ChangeStyleShallowTree.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleSingleClassSelector.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleUniversalSelector.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleUnrelatedAttributeSelector.html"
     },
     {
-        "duration": "27.0",
+        "duration": "24.0",
         "name": "blink_perf.css/ClassDescendantSelector.html"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "blink_perf.css/ClassInvalidation.html"
     },
     {
-        "duration": "15.0",
+        "duration": "12.0",
         "name": "blink_perf.css/CustomPropertiesCascade.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.css/CustomPropertiesDependency.html"
     },
     {
-        "duration": "17.0",
+        "duration": "13.0",
         "name": "blink_perf.css/CustomPropertiesIdenticalSets.html"
     },
     {
-        "duration": "17.0",
+        "duration": "13.0",
         "name": "blink_perf.css/CustomPropertiesNonRootInheritance.html"
     },
     {
-        "duration": "17.0",
+        "duration": "12.0",
         "name": "blink_perf.css/CustomPropertiesPendingSubstitution.html"
     },
     {
-        "duration": "18.0",
+        "duration": "12.0",
         "name": "blink_perf.css/CustomPropertiesRootInheritance.html"
     },
     {
-        "duration": "18.0",
+        "duration": "12.0",
         "name": "blink_perf.css/CustomPropertiesVarAlias.html"
     },
     {
-        "duration": "18.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ExplicitInheritance.html"
     },
     {
-        "duration": "26.0",
+        "duration": "20.0",
         "name": "blink_perf.css/FocusUpdate.html"
     },
     {
-        "duration": "24.0",
+        "duration": "18.0",
         "name": "blink_perf.css/HasDescendantInAncestorPositionInvalidation.html"
     },
     {
-        "duration": "24.0",
+        "duration": "31.0",
         "name": "blink_perf.css/HasDescendantInvalidation.html"
     },
     {
-        "duration": "17.0",
+        "duration": "20.0",
         "name": "blink_perf.css/HasDescendantInvalidationAllSubjects.html"
     },
     {
-        "duration": "18.0",
+        "duration": "21.0",
         "name": "blink_perf.css/HasDescendantInvalidationMultipleSubjects.html"
     },
     {
-        "duration": "18.0",
+        "duration": "21.0",
         "name": "blink_perf.css/HasDescendantInvalidationWith1NonMatchingHasRule.html"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "blink_perf.css/HasDescendantInvalidationWithMultipleNonMatchingHasRules.html"
     },
     {
-        "duration": "18.0",
+        "duration": "21.0",
         "name": "blink_perf.css/HasDescendantInvalidationWithoutNonMatchingHasRule.html"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "blink_perf.css/HasInvalidationFiltering.html"
     },
     {
-        "duration": "19.0",
+        "duration": "22.0",
         "name": "blink_perf.css/HasSiblingDescendantInvalidation.html"
     },
     {
-        "duration": "16.0",
+        "duration": "19.0",
         "name": "blink_perf.css/HasSiblingDescendantInvalidationAllSubjects.html"
     },
     {
-        "duration": "18.0",
+        "duration": "21.0",
         "name": "blink_perf.css/HasSiblingInvalidation.html"
     },
     {
-        "duration": "16.0",
+        "duration": "19.0",
         "name": "blink_perf.css/HasSiblingInvalidationAllSubjects.html"
     },
     {
-        "duration": "12.0",
+        "duration": "15.0",
         "name": "blink_perf.css/HighlightInheritanceRecalc.html"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "blink_perf.css/HighlightInheritanceSelected.html"
     },
     {
-        "duration": "13.0",
+        "duration": "16.0",
         "name": "blink_perf.css/ImplicitAtScope.html"
     },
     {
-        "duration": "12.0",
+        "duration": "15.0",
         "name": "blink_perf.css/ImplicitAtScopeInsertion.html"
     },
     {
-        "duration": "12.0",
+        "duration": "15.0",
         "name": "blink_perf.css/ImplicitAtScopeMatching.html"
     },
     {
-        "duration": "12.0",
+        "duration": "15.0",
         "name": "blink_perf.css/ImplicitScopeShared.html"
     },
     {
-        "duration": "12.0",
+        "duration": "15.0",
         "name": "blink_perf.css/LoadBootstrapBlog.html"
     },
     {
-        "duration": "12.0",
+        "duration": "15.0",
         "name": "blink_perf.css/LoadMaterializeStarterPage.html"
     },
     {
-        "duration": "12.0",
+        "duration": "15.0",
         "name": "blink_perf.css/LoadSemanticPageExample.html"
     },
     {
-        "duration": "23.0",
+        "duration": "31.0",
         "name": "blink_perf.css/ModifySelectorText.html"
     },
     {
-        "duration": "12.0",
+        "duration": "15.0",
         "name": "blink_perf.css/NamedContainerLookup.html"
     },
     {
-        "duration": "12.0",
+        "duration": "15.0",
         "name": "blink_perf.css/NestingIdentInvalidValue.html"
     },
     {
-        "duration": "11.0",
+        "duration": "14.0",
         "name": "blink_perf.css/NestingIdentKnownProperty.html"
     },
     {
-        "duration": "11.0",
+        "duration": "15.0",
         "name": "blink_perf.css/NestingIdentLeadingBraces.html"
     },
     {
-        "duration": "11.0",
+        "duration": "14.0",
         "name": "blink_perf.css/NestingIdentNonProperty.html"
     },
     {
-        "duration": "16.0",
+        "duration": "20.0",
         "name": "blink_perf.css/PseudoClassSelectors.html"
     },
     {
-        "duration": "11.0",
+        "duration": "14.0",
         "name": "blink_perf.css/ScrollbarPseudoSelector.html"
     },
     {
-        "duration": "47.0",
+        "duration": "51.0",
         "name": "blink_perf.css/SelectorCountScaling.html"
     },
     {
-        "duration": "21.0",
+        "duration": "28.0",
         "name": "blink_perf.dom/custom-element-default-style-with-shadow.html"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "blink_perf.dom/custom-element-default-style.html"
     },
     {
-        "duration": "19.0",
+        "duration": "23.0",
         "name": "blink_perf.dom/deep-tree-clonenode.html"
     },
     {
-        "duration": "67.0",
+        "duration": "65.0",
         "name": "blink_perf.dom/dom-parts-api-flat-append.html"
     },
     {
-        "duration": "60.0",
+        "duration": "56.0",
         "name": "blink_perf.dom/dom-parts-api-flat-clone.html"
     },
     {
-        "duration": "59.0",
+        "duration": "56.0",
         "name": "blink_perf.dom/dom-parts-api-flat-parts.html"
     },
     {
-        "duration": "60.0",
+        "duration": "56.0",
         "name": "blink_perf.dom/dom-parts-api-manual-append.html"
     },
     {
-        "duration": "61.0",
+        "duration": "57.0",
         "name": "blink_perf.dom/dom-parts-api-manual-clone.html"
     },
     {
-        "duration": "63.0",
+        "duration": "55.0",
         "name": "blink_perf.dom/dom-parts-api-manual-parts.html"
     },
     {
-        "duration": "61.0",
+        "duration": "57.0",
         "name": "blink_perf.dom/dom-parts-api-nested-append.html"
     },
     {
-        "duration": "60.0",
+        "duration": "57.0",
         "name": "blink_perf.dom/dom-parts-api-nested-clone.html"
     },
     {
-        "duration": "60.0",
+        "duration": "57.0",
         "name": "blink_perf.dom/dom-parts-api-nested-parts.html"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "blink_perf.dom/insert-text-with-dir-auto.html"
     },
     {
-        "duration": "31.0",
+        "duration": "24.0",
         "name": "blink_perf.dom/long-sibling-list.html"
     },
     {
-        "duration": "17.0",
+        "duration": "13.0",
         "name": "blink_perf.dom/modify-element-classname.html"
     },
     {
-        "duration": "17.0",
+        "duration": "12.0",
         "name": "blink_perf.dom/modify-element-id.html"
     },
     {
-        "duration": "17.0",
+        "duration": "13.0",
         "name": "blink_perf.dom/modify-element-title.html"
     },
     {
-        "duration": "21.0",
+        "duration": "17.0",
         "name": "blink_perf.dom/replace-text-with-dir-auto.html"
     },
     {
-        "duration": "21.0",
+        "duration": "17.0",
         "name": "blink_perf.dom/select-multiple-add.html"
     },
     {
-        "duration": "21.0",
+        "duration": "18.0",
         "name": "blink_perf.dom/select-single-add.html"
     },
     {
-        "duration": "24.0",
+        "duration": "19.0",
         "name": "blink_perf.dom/select-single-remove.html"
     },
     {
-        "duration": "27.0",
+        "duration": "26.0",
         "name": "blink_perf.events/EventsDispatching.html"
     },
     {
-        "duration": "25.0",
+        "duration": "20.0",
         "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV1ShadowTrees.html"
     },
     {
-        "duration": "43.0",
+        "duration": "40.0",
         "name": "blink_perf.events/EventsDispatchingInV1ShadowTrees.html"
     },
     {
-        "duration": "44.0",
+        "duration": "30.0",
         "name": "blink_perf.events/hit-test-lots-of-layers.html"
     },
     {
-        "duration": "27.0",
+        "duration": "17.0",
         "name": "blink_perf.events/is-input-pending-default-events.html"
     },
     {
-        "duration": "30.0",
+        "duration": "29.0",
         "name": "blink_perf.events/is-input-pending-include-continuous-events.html"
     },
     {
@@ -740,11 +740,11 @@
         "name": "blink_perf.image_decoder/decode-gif.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v1.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v2.html"
     },
     {
@@ -752,103 +752,103 @@
         "name": "blink_perf.image_decoder/decode-jpeg-h2v1.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v2.html"
     },
     {
-        "duration": "26.0",
+        "duration": "24.0",
         "name": "blink_perf.image_decoder/decode-lossless-webp.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.image_decoder/decode-lossy-webp.html"
     },
     {
-        "duration": "22.0",
+        "duration": "20.0",
         "name": "blink_perf.image_decoder/decode-png-palette-opaque.html"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "blink_perf.image_decoder/decode-png-palette.html"
     },
     {
-        "duration": "25.0",
+        "duration": "22.0",
         "name": "blink_perf.image_decoder/decode-png.html"
     },
     {
-        "duration": "25.0",
+        "duration": "27.0",
         "name": "blink_perf.layout/ArabicLineLayout.html"
     },
     {
-        "duration": "18.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/CJK-article.html"
     },
     {
-        "duration": "15.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/Shapes/MultipleShapes.html"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/SimpleTextPathLineLayout.html"
     },
     {
-        "duration": "33.0",
+        "duration": "28.0",
         "name": "blink_perf.layout/abspos.html"
     },
     {
-        "duration": "22.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/add-remove-inline-floats.html"
     },
     {
-        "duration": "18.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/animate-abspos-deep.html"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/attach-inlines-2.html"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/attach-inlines.html"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/auto-grid-lots-of-data.html"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/auto-grid-lots-of-spanning-data.html"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/chapter-reflow-once-random.html"
     },
     {
-        "duration": "22.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/chapter-reflow-once.html"
     },
     {
-        "duration": "22.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/chapter-reflow-thrice.html"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/chapter-reflow-twice.html"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/chapter-reflow.html"
     },
     {
-        "duration": "17.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/character_fallback.html"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/contain-content-style-change.html"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "blink_perf.layout/css-contain-change-text-different-subtree-root.html"
     },
     {
@@ -856,15 +856,15 @@
         "name": "blink_perf.layout/css-contain-change-text-without-subtree-root.html"
     },
     {
-        "duration": "24.0",
+        "duration": "23.0",
         "name": "blink_perf.layout/css-contain-change-text.html"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/culled-inline-bounding-rects.html"
     },
     {
-        "duration": "17.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/culled-inline-hittest.html"
     },
     {
@@ -872,7 +872,7 @@
         "name": "blink_perf.layout/deeply-nested-grid.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/editing_append.html"
     },
     {
@@ -884,7 +884,7 @@
         "name": "blink_perf.layout/editing_delete.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/editing_insert.html"
     },
     {
@@ -896,7 +896,7 @@
         "name": "blink_perf.layout/fit-content-change-available-size-blocks.html"
     },
     {
-        "duration": "22.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/fit-content-change-available-size-text.html"
     },
     {
@@ -912,119 +912,119 @@
         "name": "blink_perf.layout/flexbox-column-nowrap.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/flexbox-column-wrap.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/flexbox-deeply-nested-with-ortho-flow.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/flexbox-hittest.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/flexbox-input.html"
     },
     {
-        "duration": "22.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/flexbox-lots-of-data.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/flexbox-nested-rows-and-columns-auto-overflow.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/flexbox-row-nowrap.html"
     },
     {
-        "duration": "23.0",
+        "duration": "21.0",
         "name": "blink_perf.layout/flexbox-row-stretch-height-definite.html"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/flexbox-row-stretch-height-indefinite.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/flexbox-row-wrap.html"
     },
     {
-        "duration": "20.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/flexbox-with-stretch-layout.html"
     },
     {
-        "duration": "26.0",
+        "duration": "24.0",
         "name": "blink_perf.layout/flexbox_with_list_item.html"
     },
     {
-        "duration": "16.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/floats_100_100.html"
     },
     {
-        "duration": "16.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/floats_100_100_nested.html"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/floats_10_1000.html"
     },
     {
-        "duration": "18.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/floats_20_100.html"
     },
     {
-        "duration": "19.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/floats_20_100_nested.html"
     },
     {
-        "duration": "20.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/floats_2_100.html"
     },
     {
-        "duration": "18.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/floats_2_100_nested.html"
     },
     {
-        "duration": "19.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/floats_50_100.html"
     },
     {
-        "duration": "20.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/floats_50_100_nested.html"
     },
     {
-        "duration": "24.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/floats_show_hide.html"
     },
     {
-        "duration": "29.0",
+        "duration": "23.0",
         "name": "blink_perf.layout/grid-nested-baseline.html"
     },
     {
-        "duration": "20.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/grid-with-block-constraints-dependence.html"
     },
     {
-        "duration": "21.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/hindi-line-layout.html"
     },
     {
-        "duration": "19.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/hittest-block-children.html"
     },
     {
-        "duration": "20.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/hittest-nested-inline-blocks-listbased.html"
     },
     {
-        "duration": "17.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/japanese-kokoro-insert.html"
     },
     {
@@ -1032,139 +1032,139 @@
         "name": "blink_perf.layout/large-grid.html"
     },
     {
-        "duration": "20.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/large-spanning-grid-item.html"
     },
     {
-        "duration": "30.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html"
     },
     {
-        "duration": "29.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html"
     },
     {
-        "duration": "30.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html"
     },
     {
-        "duration": "19.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/latin-ebook-french.html"
     },
     {
-        "duration": "27.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/latin-ebook-resize.html"
     },
     {
-        "duration": "20.0",
+        "duration": "13.0",
         "name": "blink_perf.layout/latin-ebook.html"
     },
     {
-        "duration": "44.0",
+        "duration": "43.0",
         "name": "blink_perf.layout/layer-overhead.html"
     },
     {
-        "duration": "17.0",
+        "duration": "11.0",
         "name": "blink_perf.layout/layers_overlap_2d.html"
     },
     {
-        "duration": "17.0",
+        "duration": "11.0",
         "name": "blink_perf.layout/layers_overlap_3d.html"
     },
     {
-        "duration": "1.0",
+        "duration": "0.0",
         "name": "blink_perf.layout/line-layout-fit-content-break-word.html"
     },
     {
-        "duration": "1.0",
+        "duration": "0.0",
         "name": "blink_perf.layout/line-layout-fit-content.html"
     },
     {
-        "duration": "29.0",
+        "duration": "22.0",
         "name": "blink_perf.layout/line-layout-line-height.html"
     },
     {
-        "duration": "21.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/line-layout-repeat-append-select.html"
     },
     {
-        "duration": "21.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/line-layout-repeat-append.html"
     },
     {
-        "duration": "21.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/line-layout.html"
     },
     {
-        "duration": "16.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/long-line-nowrap-collapse.html"
     },
     {
-        "duration": "15.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html"
     },
     {
-        "duration": "19.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/long-line-nowrap.html"
     },
     {
-        "duration": "20.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/many-block-children-auto-inline-size.html"
     },
     {
-        "duration": "20.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/many-block-children-fixed-inline-size.html"
     },
     {
-        "duration": "20.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/many-block-children-rebuild-box-tree.html"
     },
     {
-        "duration": "21.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/multicol/balance-forced-breaks.html"
     },
     {
-        "duration": "22.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/multicol/balance-list-items-with-tall-marker.html"
     },
     {
-        "duration": "22.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/multicol/balance-tables-with-break-inside-avoidance.html"
     },
     {
-        "duration": "22.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/multicol/deeply-nested-tables-2.html"
     },
     {
-        "duration": "21.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/multicol/deeply-nested-tables.html"
     },
     {
-        "duration": "21.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html"
     },
     {
-        "duration": "22.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/multicol/large-inline-formatting-context.html"
     },
     {
-        "duration": "21.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/lots-of-small-nested-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "21.0",
+        "duration": "16.0",
         "name": "blink_perf.layout/multicol/lots-of-small-unbreakable-blocks-autofill.html"
     },
     {
-        "duration": "26.0",
+        "duration": "25.0",
         "name": "blink_perf.layout/multicol/lots-of-small-unbreakable-blocks-balanced.html"
     },
     {
-        "duration": "20.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/multicol/lots-of-text-autofill.html"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html"
     },
     {
@@ -1172,95 +1172,95 @@
         "name": "blink_perf.layout/multicol/lots-of-text-balanced.html"
     },
     {
-        "duration": "19.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/multicol/nested-forced-breaks.html"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "blink_perf.layout/multicol/tall-content-short-columns.html"
     },
     {
-        "duration": "19.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html"
     },
     {
-        "duration": "19.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/nested-grid-lots-of-tracks.html"
     },
     {
-        "duration": "19.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/nested-grid.html"
     },
     {
-        "duration": "19.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/nested-percent-height-tables.html"
     },
     {
-        "duration": "20.0",
+        "duration": "18.0",
         "name": "blink_perf.layout/nested-subgrid.html"
     },
     {
-        "duration": "19.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/nested-tables-with-overflow-auto.html"
     },
     {
-        "duration": "21.0",
+        "duration": "19.0",
         "name": "blink_perf.layout/ruby.html"
     },
     {
-        "duration": "40.0",
+        "duration": "32.0",
         "name": "blink_perf.layout/subtree-detaching.html"
     },
     {
-        "duration": "19.0",
+        "duration": "15.0",
         "name": "blink_perf.layout/subtree-layout-scrollable-area.html"
     },
     {
-        "duration": "20.0",
+        "duration": "17.0",
         "name": "blink_perf.layout/text-wrap-balance.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html"
     },
     {
-        "duration": "14.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/word-break-break-all.html"
     },
     {
-        "duration": "14.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/word-break-break-word.html"
     },
     {
-        "duration": "14.0",
+        "duration": "12.0",
         "name": "blink_perf.layout/word-wrap-break-word.html"
     },
     {
-        "duration": "21.0",
+        "duration": "20.0",
         "name": "blink_perf.owp_storage/blob-perf-files.html"
     },
     {
-        "duration": "19.0",
+        "duration": "15.0",
         "name": "blink_perf.owp_storage/blob-perf-ipc.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.owp_storage/blob-perf-shm.html"
     },
     {
-        "duration": "19.0",
+        "duration": "15.0",
         "name": "blink_perf.owp_storage/blob-perf-tiny.html"
     },
     {
-        "duration": "19.0",
+        "duration": "15.0",
         "name": "blink_perf.owp_storage/idb-load-docs.html"
     },
     {
-        "duration": "26.0",
+        "duration": "23.0",
         "name": "blink_perf.parser/css-parser-yui.html"
     },
     {
@@ -1272,155 +1272,155 @@
         "name": "blink_perf.parser/declarative-shadow-dom.html"
     },
     {
-        "duration": "25.0",
+        "duration": "17.0",
         "name": "blink_perf.parser/html-parser.html"
     },
     {
-        "duration": "70.0",
+        "duration": "53.0",
         "name": "blink_perf.parser/html5-full-render.html"
     },
     {
-        "duration": "26.0",
+        "duration": "20.0",
         "name": "blink_perf.parser/iframe-append-remove.html"
     },
     {
-        "duration": "20.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/innerHTML-setter-siblings.html"
     },
     {
-        "duration": "24.0",
+        "duration": "22.0",
         "name": "blink_perf.parser/innerHTML-setter.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-all-attribute-complex.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-all-attribute.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-all-class-deep.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-all-class-first.html"
     },
     {
-        "duration": "18.0",
+        "duration": "15.0",
         "name": "blink_perf.parser/query-selector-all-class-last.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-all-class.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-all-deep.html"
     },
     {
-        "duration": "17.0",
+        "duration": "15.0",
         "name": "blink_perf.parser/query-selector-all-first.html"
     },
     {
-        "duration": "17.0",
+        "duration": "15.0",
         "name": "blink_perf.parser/query-selector-all-id-deep.html"
     },
     {
-        "duration": "17.0",
+        "duration": "15.0",
         "name": "blink_perf.parser/query-selector-all-id-first.html"
     },
     {
-        "duration": "17.0",
+        "duration": "15.0",
         "name": "blink_perf.parser/query-selector-all-id-last.html"
     },
     {
-        "duration": "17.0",
+        "duration": "15.0",
         "name": "blink_perf.parser/query-selector-all-last.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-deep.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-first.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/query-selector-id-deep.html"
     },
     {
-        "duration": "17.0",
+        "duration": "15.0",
         "name": "blink_perf.parser/query-selector-id-last.html"
     },
     {
-        "duration": "17.0",
+        "duration": "15.0",
         "name": "blink_perf.parser/query-selector-last.html"
     },
     {
-        "duration": "17.0",
+        "duration": "15.0",
         "name": "blink_perf.parser/simple-url.html"
     },
     {
-        "duration": "19.0",
+        "duration": "17.0",
         "name": "blink_perf.parser/textarea-parsing.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.parser/tiny-innerHTML.html"
     },
     {
-        "duration": "25.0",
+        "duration": "24.0",
         "name": "blink_perf.parser/url-parser.html"
     },
     {
-        "duration": "18.0",
+        "duration": "16.0",
         "name": "blink_perf.parser/xml-parser.html"
     },
     {
-        "duration": "16.0",
+        "duration": "15.0",
         "name": "blink_perf.shadow_dom/declarative-api.html"
     },
     {
-        "duration": "12.0",
+        "duration": "9.0",
         "name": "blink_perf.shadow_dom/imperative-api-appendchild.html"
     },
     {
-        "duration": "12.0",
+        "duration": "9.0",
         "name": "blink_perf.shadow_dom/imperative-api-assign.html"
     },
     {
-        "duration": "12.0",
+        "duration": "9.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-elements.html"
     },
     {
-        "duration": "12.0",
+        "duration": "9.0",
         "name": "blink_perf.shadow_dom/imperative-api-assigned-slot.html"
     },
     {
-        "duration": "13.0",
+        "duration": "9.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary-large.html"
     },
     {
-        "duration": "13.0",
+        "duration": "9.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary.html"
     },
     {
-        "duration": "14.0",
+        "duration": "9.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary-large.html"
     },
     {
-        "duration": "15.0",
+        "duration": "9.0",
         "name": "blink_perf.shadow_dom/imperative-api-detail-summary.html"
     },
     {
-        "duration": "15.0",
+        "duration": "9.0",
         "name": "blink_perf.shadow_dom/imperative-api-insertbefore.html"
     },
     {
-        "duration": "15.0",
+        "duration": "10.0",
         "name": "blink_perf.shadow_dom/imperative-api.html"
     },
     {
@@ -1436,143 +1436,143 @@
         "name": "blink_perf.shadow_dom/shadow-dom-overhead.html"
     },
     {
-        "duration": "24.0",
+        "duration": "22.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html"
     },
     {
-        "duration": "16.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html"
     },
     {
-        "duration": "16.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html"
     },
     {
-        "duration": "15.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/shadow-style-share.html"
     },
     {
-        "duration": "16.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/style-sheet-insert.html"
     },
     {
-        "duration": "48.0",
+        "duration": "41.0",
         "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html"
     },
     {
-        "duration": "15.0",
+        "duration": "13.0",
         "name": "blink_perf.shadow_dom/v1-distribution.html"
     },
     {
-        "duration": "15.0",
+        "duration": "13.0",
         "name": "blink_perf.shadow_dom/v1-host-child-append.html"
     },
     {
-        "duration": "23.0",
+        "duration": "19.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html"
     },
     {
-        "duration": "25.0",
+        "duration": "23.0",
         "name": "blink_perf.shadow_dom/v1-large-deep-layout.html"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-append-layout.html"
     },
     {
-        "duration": "15.0",
+        "duration": "13.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html"
     },
     {
-        "duration": "15.0",
+        "duration": "13.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html"
     },
     {
-        "duration": "16.0",
+        "duration": "13.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-prepend-layout.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html"
     },
     {
-        "duration": "16.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "16.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html"
     },
     {
-        "duration": "16.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html"
     },
     {
-        "duration": "15.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html"
     },
     {
-        "duration": "15.0",
+        "duration": "13.0",
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html"
     },
     {
-        "duration": "15.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/v1-slot-append.html"
     },
     {
-        "duration": "16.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html"
     },
     {
-        "duration": "17.0",
+        "duration": "15.0",
         "name": "blink_perf.shadow_dom/v1-small-deep-layout.html"
     },
     {
-        "duration": "14.0",
+        "duration": "13.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html"
     },
     {
-        "duration": "15.0",
+        "duration": "14.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html"
     },
     {
-        "duration": "28.0",
+        "duration": "29.0",
         "name": "blink_perf.webaudio/audio-buffer-source-node.html"
     },
     {
-        "duration": "109.0",
+        "duration": "100.0",
         "name": "blink_perf.webaudio/audio-worklet-node.html"
     },
     {
-        "duration": "111.0",
+        "duration": "100.0",
         "name": "blink_perf.webaudio/biquad-filter-node.html"
     },
     {
-        "duration": "99.0",
+        "duration": "88.0",
         "name": "blink_perf.webaudio/dynamics-compressor-node-knee.html"
     },
     {
-        "duration": "66.0",
+        "duration": "102.0",
         "name": "blink_perf.webaudio/dynamics-compressor-node-post-knee.html"
     },
     {
-        "duration": "63.0",
+        "duration": "89.0",
         "name": "blink_perf.webaudio/dynamics-compressor-node-pre-knee.html"
     },
     {
-        "duration": "64.0",
+        "duration": "104.0",
         "name": "blink_perf.webaudio/gain-node.html"
     },
     {
-        "duration": "30.0",
+        "duration": "45.0",
         "name": "blink_perf.webaudio/panner-node.html"
     },
     {
-        "duration": "16.0",
+        "duration": "25.0",
         "name": "blink_perf.webaudio/timeline-insert-event.html"
     },
     {
-        "duration": "14.0",
+        "duration": "24.0",
         "name": "blink_perf.webcodecs/hardware-video-encoding.html"
     },
     {
@@ -1580,111 +1580,111 @@
         "name": "blink_perf.webcodecs/software-video-encoding.html"
     },
     {
-        "duration": "10.0",
+        "duration": "15.0",
         "name": "blink_perf.webcodecs/videoFrame-batch-copyTo-canvas.html"
     },
     {
-        "duration": "9.0",
+        "duration": "14.0",
         "name": "blink_perf.webcodecs/videoFrame-copyTo-canvas.html"
     },
     {
-        "duration": "9.0",
+        "duration": "14.0",
         "name": "blink_perf.webcodecs/videoFrame-copyTo-videoDecoder.html"
     },
     {
-        "duration": "9.0",
+        "duration": "14.0",
         "name": "blink_perf.webcodecs/videoFrame-createImageBitmap-canvas.html"
     },
     {
-        "duration": "9.0",
+        "duration": "14.0",
         "name": "blink_perf.webcodecs/videoFrame-createImageBitmap-imageDecoder.html"
     },
     {
-        "duration": "9.0",
+        "duration": "14.0",
         "name": "blink_perf.webcodecs/videoFrame-createImageBitmap-videoDecoder.html"
     },
     {
-        "duration": "9.0",
+        "duration": "15.0",
         "name": "blink_perf.webcodecs/videoFrame-drawImage-imageDecoder.html"
     },
     {
-        "duration": "9.0",
+        "duration": "14.0",
         "name": "blink_perf.webcodecs/videoFrame-drawImage.html"
     },
     {
-        "duration": "9.0",
+        "duration": "14.0",
         "name": "blink_perf.webcodecs/videoFrame-texImage2d.html"
     },
     {
-        "duration": "14.0",
+        "duration": "22.0",
         "name": "blink_perf.webgl/binding-bind-buffer.html"
     },
     {
-        "duration": "9.0",
+        "duration": "15.0",
         "name": "blink_perf.webgl/binding-buffer-sub-data.html"
     },
     {
-        "duration": "10.0",
+        "duration": "16.0",
         "name": "blink_perf.webgl/binding-draw-arrays.html"
     },
     {
-        "duration": "10.0",
+        "duration": "17.0",
         "name": "blink_perf.webgl/binding-typed-array-uniforms.html"
     },
     {
-        "duration": "13.0",
+        "duration": "26.0",
         "name": "blink_perf.webgl_fast_call/binding-bind-buffer.html"
     },
     {
-        "duration": "9.0",
+        "duration": "18.0",
         "name": "blink_perf.webgl_fast_call/binding-buffer-sub-data.html"
     },
     {
-        "duration": "10.0",
+        "duration": "18.0",
         "name": "blink_perf.webgl_fast_call/binding-draw-arrays.html"
     },
     {
-        "duration": "10.0",
+        "duration": "17.0",
         "name": "blink_perf.webgl_fast_call/binding-typed-array-uniforms.html"
     },
     {
-        "duration": "10.0",
+        "duration": "16.0",
         "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "10.0",
+        "duration": "19.0",
         "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html"
     },
     {
-        "duration": "46.0",
+        "duration": "55.0",
         "name": "octane/Octane"
     },
     {
-        "duration": "19.0",
+        "duration": "38.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html"
     },
     {
-        "duration": "14.0",
+        "duration": "19.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html"
     },
     {
-        "duration": "17.0",
+        "duration": "21.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html"
     },
     {
-        "duration": "15.0",
+        "duration": "20.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html"
     },
     {
-        "duration": "22.0",
+        "duration": "28.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html"
     },
     {
-        "duration": "20.0",
+        "duration": "18.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html"
     },
     {
-        "duration": "16.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html"
     },
     {
@@ -1692,43 +1692,43 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html"
     },
     {
-        "duration": "18.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html"
     },
     {
-        "duration": "15.0",
+        "duration": "13.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html"
     },
     {
-        "duration": "17.0",
+        "duration": "15.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html"
     },
     {
-        "duration": "19.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html"
     },
     {
-        "duration": "18.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html"
     },
     {
-        "duration": "16.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html"
     },
     {
-        "duration": "15.0",
+        "duration": "13.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html"
     },
     {
-        "duration": "18.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html"
     },
     {
-        "duration": "20.0",
+        "duration": "18.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html"
     },
     {
-        "duration": "17.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html"
     },
     {
@@ -1736,15 +1736,15 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html"
     },
     {
-        "duration": "16.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html"
     },
     {
-        "duration": "16.0",
+        "duration": "14.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html"
     },
     {
-        "duration": "18.0",
+        "duration": "16.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html"
     },
     {
@@ -1752,39 +1752,39 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html"
     },
     {
-        "duration": "19.0",
+        "duration": "18.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html"
     },
     {
-        "duration": "20.0",
+        "duration": "17.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html"
     },
     {
-        "duration": "329.0",
+        "duration": "333.0",
         "name": "rendering.mobile.notracing/motionmark_ramp_composite"
     },
     {
-        "duration": "32.0",
+        "duration": "28.0",
         "name": "rendering.mobile/accu_weather_2018"
     },
     {
-        "duration": "31.0",
+        "duration": "27.0",
         "name": "rendering.mobile/accu_weather_mobile_pinch_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "24.0",
         "name": "rendering.mobile/amazon_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "26.0",
         "name": "rendering.mobile/amazon_mobile_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "27.0",
         "name": "rendering.mobile/analog_clock_svg"
     },
     {
-        "duration": "31.0",
+        "duration": "29.0",
         "name": "rendering.mobile/androidpolice_mobile_2018"
     },
     {
@@ -1792,19 +1792,19 @@
         "name": "rendering.mobile/animometer_webgl"
     },
     {
-        "duration": "39.0",
+        "duration": "40.0",
         "name": "rendering.mobile/animometer_webgl_attrib_arrays"
     },
     {
-        "duration": "40.0",
+        "duration": "41.0",
         "name": "rendering.mobile/animometer_webgl_multi_draw"
     },
     {
-        "duration": "38.0",
+        "duration": "39.0",
         "name": "rendering.mobile/aquarium"
     },
     {
-        "duration": "6.0",
+        "duration": "5.0",
         "name": "rendering.mobile/aquarium_20k"
     },
     {
@@ -1812,7 +1812,7 @@
         "name": "rendering.mobile/background_color_animation"
     },
     {
-        "duration": "35.0",
+        "duration": "34.0",
         "name": "rendering.mobile/background_color_animation_with_gradient"
     },
     {
@@ -1824,7 +1824,7 @@
         "name": "rendering.mobile/balls_css_key_frame_animations"
     },
     {
-        "duration": "6.0",
+        "duration": "5.0",
         "name": "rendering.mobile/balls_css_key_frame_animations_composited_transform"
     },
     {
@@ -1832,11 +1832,11 @@
         "name": "rendering.mobile/balls_css_transition_2_properties"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "rendering.mobile/balls_css_transition_40_properties"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "rendering.mobile/balls_css_transition_all_properties"
     },
     {
@@ -1844,7 +1844,7 @@
         "name": "rendering.mobile/balls_javascript_canvas"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "rendering.mobile/balls_javascript_css"
     },
     {
@@ -1852,7 +1852,7 @@
         "name": "rendering.mobile/balls_svg_animations"
     },
     {
-        "duration": "33.0",
+        "duration": "36.0",
         "name": "rendering.mobile/basic_stream"
     },
     {
@@ -1860,35 +1860,35 @@
         "name": "rendering.mobile/bing_mobile_2018"
     },
     {
-        "duration": "36.0",
+        "duration": "37.0",
         "name": "rendering.mobile/blob"
     },
     {
-        "duration": "34.0",
+        "duration": "33.0",
         "name": "rendering.mobile/blogspot_2018"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "rendering.mobile/blogspot_mobile_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "28.0",
         "name": "rendering.mobile/blur_rotating_background"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "rendering.mobile/boingboing_mobile_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "29.0",
         "name": "rendering.mobile/booking.com_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "rendering.mobile/booking.com_mobile_2018"
     },
     {
-        "duration": "34.0",
+        "duration": "36.0",
         "name": "rendering.mobile/bouncing_balls_15"
     },
     {
@@ -1896,523 +1896,523 @@
         "name": "rendering.mobile/bouncing_balls_shadow"
     },
     {
-        "duration": "30.0",
+        "duration": "33.0",
         "name": "rendering.mobile/bouncing_clipped_rectangles"
     },
     {
-        "duration": "30.0",
+        "duration": "32.0",
         "name": "rendering.mobile/bouncing_gradient_circles"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "rendering.mobile/bouncing_png_images"
     },
     {
-        "duration": "32.0",
+        "duration": "34.0",
         "name": "rendering.mobile/bouncing_svg_images"
     },
     {
-        "duration": "35.0",
+        "duration": "36.0",
         "name": "rendering.mobile/camera_to_webgl"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "rendering.mobile/canvas2d_to_texture.html"
     },
     {
-        "duration": "41.0",
+        "duration": "38.0",
         "name": "rendering.mobile/canvas_05000_pixels_per_second"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/canvas_10000_pixels_per_second"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/canvas_20000_pixels_per_second"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/canvas_40000_pixels_per_second"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/canvas_60000_pixels_per_second"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/canvas_75000_pixels_per_second"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/canvas_90000_pixels_per_second"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "rendering.mobile/canvas_animation_no_clear"
     },
     {
-        "duration": "32.0",
+        "duration": "33.0",
         "name": "rendering.mobile/canvas_arcs"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "rendering.mobile/canvas_font_cycler"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "rendering.mobile/canvas_globalAlpha"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "rendering.mobile/canvas_lines"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "rendering.mobile/canvas_to_blob"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "rendering.mobile/canvas_to_canvas_draw"
     },
     {
-        "duration": "35.0",
+        "duration": "36.0",
         "name": "rendering.mobile/capitolvolkswagen_mobile_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "22.0",
         "name": "rendering.mobile/card_expansion"
     },
     {
-        "duration": "26.0",
+        "duration": "23.0",
         "name": "rendering.mobile/card_expansion_animated"
     },
     {
-        "duration": "28.0",
+        "duration": "30.0",
         "name": "rendering.mobile/card_expansion_images_text"
     },
     {
-        "duration": "25.0",
+        "duration": "21.0",
         "name": "rendering.mobile/card_flying"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "rendering.mobile/cc_poster_circle"
     },
     {
-        "duration": "26.0",
+        "duration": "28.0",
         "name": "rendering.mobile/cc_scroll_text_only"
     },
     {
-        "duration": "44.0",
+        "duration": "29.0",
         "name": "rendering.mobile/chip_tune"
     },
     {
-        "duration": "32.0",
+        "duration": "31.0",
         "name": "rendering.mobile/cnn_2018"
     },
     {
-        "duration": "45.0",
+        "duration": "27.0",
         "name": "rendering.mobile/cnn_article_mobile_2018"
     },
     {
-        "duration": "37.0",
+        "duration": "21.0",
         "name": "rendering.mobile/cnn_mobile_2018"
     },
     {
-        "duration": "9.0",
+        "duration": "2.0",
         "name": "rendering.mobile/cnn_mobile_pinch_2018"
     },
     {
-        "duration": "37.0",
+        "duration": "21.0",
         "name": "rendering.mobile/cnn_pathological_2018"
     },
     {
-        "duration": "42.0",
+        "duration": "29.0",
         "name": "rendering.mobile/compositor_heavy_animation"
     },
     {
-        "duration": "28.0",
+        "duration": "30.0",
         "name": "rendering.mobile/coordinated_animation"
     },
     {
-        "duration": "40.0",
+        "duration": "27.0",
         "name": "rendering.mobile/crafty_mind"
     },
     {
-        "duration": "37.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_animations_many_keyframes"
     },
     {
-        "duration": "36.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_animations_simultaneous_inline_style"
     },
     {
-        "duration": "35.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_animations_simultaneous_new_element"
     },
     {
-        "duration": "36.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_animations_simultaneous_style_element"
     },
     {
-        "duration": "36.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_animations_simultaneous_updating_class"
     },
     {
-        "duration": "36.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "37.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_animations_staggered_inline_style"
     },
     {
-        "duration": "37.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_animations_staggered_new_element"
     },
     {
-        "duration": "38.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_animations_staggered_style_element"
     },
     {
-        "duration": "38.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_animations_staggered_updating_class"
     },
     {
-        "duration": "38.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_animations_triggered_inline_style"
     },
     {
-        "duration": "38.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_animations_triggered_new_element"
     },
     {
-        "duration": "37.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_animations_triggered_style_element"
     },
     {
-        "duration": "37.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_animations_triggered_updating_class"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "rendering.mobile/css_opacity_plus_n_layers_0"
     },
     {
-        "duration": "33.0",
+        "duration": "36.0",
         "name": "rendering.mobile/css_opacity_plus_n_layers_75"
     },
     {
-        "duration": "33.0",
+        "duration": "36.0",
         "name": "rendering.mobile/css_opacity_plus_n_layers_99"
     },
     {
-        "duration": "36.0",
+        "duration": "25.0",
         "name": "rendering.mobile/css_transitions_inline_style"
     },
     {
-        "duration": "36.0",
+        "duration": "25.0",
         "name": "rendering.mobile/css_transitions_new_element"
     },
     {
-        "duration": "37.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_transitions_staggered_inline_style"
     },
     {
-        "duration": "36.0",
+        "duration": "25.0",
         "name": "rendering.mobile/css_transitions_staggered_new_element"
     },
     {
-        "duration": "36.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_transitions_staggered_style_element"
     },
     {
-        "duration": "35.0",
+        "duration": "28.0",
         "name": "rendering.mobile/css_transitions_staggered_updating_class"
     },
     {
-        "duration": "31.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_transitions_style_element"
     },
     {
-        "duration": "32.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_transitions_triggered_inline_style"
     },
     {
-        "duration": "32.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_transitions_triggered_new_element"
     },
     {
-        "duration": "31.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_transitions_triggered_style_element"
     },
     {
-        "duration": "31.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_transitions_triggered_updating_class"
     },
     {
-        "duration": "31.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_transitions_updating_class"
     },
     {
-        "duration": "31.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_value_type_color"
     },
     {
-        "duration": "31.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_value_type_filter"
     },
     {
-        "duration": "32.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_value_type_length"
     },
     {
-        "duration": "31.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_value_type_length_complex"
     },
     {
-        "duration": "31.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_value_type_length_simple"
     },
     {
-        "duration": "31.0",
+        "duration": "27.0",
         "name": "rendering.mobile/css_value_type_path"
     },
     {
-        "duration": "31.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_value_type_shadow"
     },
     {
-        "duration": "31.0",
+        "duration": "25.0",
         "name": "rendering.mobile/css_value_type_transform_complex"
     },
     {
-        "duration": "31.0",
+        "duration": "26.0",
         "name": "rendering.mobile/css_value_type_transform_simple"
     },
     {
-        "duration": "36.0",
+        "duration": "27.0",
         "name": "rendering.mobile/deviantart_mobile_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "21.0",
         "name": "rendering.mobile/digg_mobile_2018"
     },
     {
-        "duration": "32.0",
+        "duration": "26.0",
         "name": "rendering.mobile/docs_paper.html"
     },
     {
-        "duration": "32.0",
+        "duration": "26.0",
         "name": "rendering.mobile/docs_resume.html"
     },
     {
-        "duration": "33.0",
+        "duration": "27.0",
         "name": "rendering.mobile/docs_table.html"
     },
     {
-        "duration": "33.0",
+        "duration": "28.0",
         "name": "rendering.mobile/draw_image"
     },
     {
-        "duration": "32.0",
+        "duration": "27.0",
         "name": "rendering.mobile/draw_image_not_pixel_aligned"
     },
     {
-        "duration": "32.0",
+        "duration": "27.0",
         "name": "rendering.mobile/dynamic_canvas_to_hw_accelerated_canvas.html"
     },
     {
-        "duration": "35.0",
+        "duration": "28.0",
         "name": "rendering.mobile/dynamic_cube_map"
     },
     {
-        "duration": "33.0",
+        "duration": "27.0",
         "name": "rendering.mobile/dynamic_webgl_to_hw_accelerated_canvas.html"
     },
     {
-        "duration": "34.0",
+        "duration": "28.0",
         "name": "rendering.mobile/earth"
     },
     {
-        "duration": "29.0",
+        "duration": "22.0",
         "name": "rendering.mobile/ebay_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "18.0",
         "name": "rendering.mobile/ebay_mobile_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "21.0",
         "name": "rendering.mobile/ebay_mobile_pinch_2018"
     },
     {
-        "duration": "32.0",
+        "duration": "34.0",
         "name": "rendering.mobile/ebay_scroll_2018"
     },
     {
-        "duration": "6.0",
+        "duration": "2.0",
         "name": "rendering.mobile/effect_games"
     },
     {
-        "duration": "39.0",
+        "duration": "28.0",
         "name": "rendering.mobile/espn_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "23.0",
         "name": "rendering.mobile/espn_mobile_2018"
     },
     {
-        "duration": "6.0",
+        "duration": "2.0",
         "name": "rendering.mobile/espn_pathological_2018"
     },
     {
-        "duration": "34.0",
+        "duration": "27.0",
         "name": "rendering.mobile/extra_large_texture_uploads"
     },
     {
-        "duration": "35.0",
+        "duration": "25.0",
         "name": "rendering.mobile/facebook_2018"
     },
     {
-        "duration": "41.0",
+        "duration": "31.0",
         "name": "rendering.mobile/facebook_mobile_2018"
     },
     {
-        "duration": "42.0",
+        "duration": "30.0",
         "name": "rendering.mobile/falling_particle_simulation_cpu.html"
     },
     {
-        "duration": "38.0",
+        "duration": "28.0",
         "name": "rendering.mobile/falling_particle_simulation_gpu.html"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/famo_us_twitter_demo"
     },
     {
-        "duration": "36.0",
+        "duration": "28.0",
         "name": "rendering.mobile/fill_clear_rect.html"
     },
     {
-        "duration": "37.0",
+        "duration": "28.0",
         "name": "rendering.mobile/fill_shapes"
     },
     {
-        "duration": "37.0",
+        "duration": "28.0",
         "name": "rendering.mobile/filter_terrain_svg"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "rendering.mobile/flickr_scroll_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "30.0",
         "name": "rendering.mobile/font_wipe"
     },
     {
-        "duration": "29.0",
+        "duration": "21.0",
         "name": "rendering.mobile/forecast.io_mobile_2018"
     },
     {
-        "duration": "36.0",
+        "duration": "28.0",
         "name": "rendering.mobile/get_image_data_cpu.html"
     },
     {
-        "duration": "36.0",
+        "duration": "28.0",
         "name": "rendering.mobile/get_image_data_gpu.html"
     },
     {
-        "duration": "31.0",
+        "duration": "22.0",
         "name": "rendering.mobile/gmail_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "20.0",
         "name": "rendering.mobile/google_calendar_2018"
     },
     {
-        "duration": "35.0",
+        "duration": "26.0",
         "name": "rendering.mobile/google_docs_2018"
     },
     {
-        "duration": "38.0",
+        "duration": "32.0",
         "name": "rendering.mobile/google_docs_mobile_2022"
     },
     {
-        "duration": "32.0",
+        "duration": "23.0",
         "name": "rendering.mobile/google_image_search_2018"
     },
     {
-        "duration": "37.0",
+        "duration": "25.0",
         "name": "rendering.mobile/google_image_search_mobile_2018"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/google_news_ios"
     },
     {
-        "duration": "28.0",
+        "duration": "21.0",
         "name": "rendering.mobile/google_news_mobile_2018"
     },
     {
-        "duration": "32.0",
+        "duration": "26.0",
         "name": "rendering.mobile/google_plus_2018"
     },
     {
-        "duration": "33.0",
+        "duration": "25.0",
         "name": "rendering.mobile/google_plus_mobile_2018"
     },
     {
-        "duration": "36.0",
+        "duration": "23.0",
         "name": "rendering.mobile/google_search_mobile_pinch_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "20.0",
         "name": "rendering.mobile/google_web_search_2018"
     },
     {
-        "duration": "33.0",
+        "duration": "26.0",
         "name": "rendering.mobile/google_web_search_mobile_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "39.0",
         "name": "rendering.mobile/gpu_bound_shader.html"
     },
     {
-        "duration": "37.0",
+        "duration": "26.0",
         "name": "rendering.mobile/gsp.ro_mobile_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "35.0",
         "name": "rendering.mobile/guardian_pathological_2018"
     },
     {
-        "duration": "36.0",
+        "duration": "28.0",
         "name": "rendering.mobile/guimark_vector_chart"
     },
     {
-        "duration": "25.0",
+        "duration": "32.0",
         "name": "rendering.mobile/gws_boogie_expansion"
     },
     {
-        "duration": "25.0",
+        "duration": "32.0",
         "name": "rendering.mobile/gws_google_expansion"
     },
     {
-        "duration": "31.0",
+        "duration": "39.0",
         "name": "rendering.mobile/hakim"
     },
     {
-        "duration": "26.0",
+        "duration": "24.0",
         "name": "rendering.mobile/horizontal_vertical_expansion"
     },
     {
-        "duration": "27.0",
+        "duration": "35.0",
         "name": "rendering.mobile/hw_accelerated_canvas_to_sw_canvas.html"
     },
     {
-        "duration": "47.0",
+        "duration": "45.0",
         "name": "rendering.mobile/idle_power_animated_gif"
     },
     {
@@ -2420,255 +2420,255 @@
         "name": "rendering.mobile/idle_power_blank"
     },
     {
-        "duration": "54.0",
+        "duration": "43.0",
         "name": "rendering.mobile/idle_power_css_animation"
     },
     {
-        "duration": "46.0",
+        "duration": "43.0",
         "name": "rendering.mobile/idle_power_request_animation_frame"
     },
     {
-        "duration": "120.0",
+        "duration": "122.0",
         "name": "rendering.mobile/idle_power_set_timeout_long"
     },
     {
-        "duration": "64.0",
+        "duration": "53.0",
         "name": "rendering.mobile/idle_power_set_timetout"
     },
     {
-        "duration": "42.0",
+        "duration": "43.0",
         "name": "rendering.mobile/ie_chalkboard"
     },
     {
-        "duration": "32.0",
+        "duration": "30.0",
         "name": "rendering.mobile/ie_pirate_mark"
     },
     {
-        "duration": "29.0",
+        "duration": "36.0",
         "name": "rendering.mobile/infinite_scroll_element_n_layers_0"
     },
     {
-        "duration": "29.0",
+        "duration": "36.0",
         "name": "rendering.mobile/infinite_scroll_element_n_layers_75"
     },
     {
-        "duration": "29.0",
+        "duration": "36.0",
         "name": "rendering.mobile/infinite_scroll_element_n_layers_99"
     },
     {
-        "duration": "29.0",
+        "duration": "37.0",
         "name": "rendering.mobile/infinite_scroll_root_fixed_n_layers_0"
     },
     {
-        "duration": "30.0",
+        "duration": "36.0",
         "name": "rendering.mobile/infinite_scroll_root_fixed_n_layers_75"
     },
     {
-        "duration": "29.0",
+        "duration": "36.0",
         "name": "rendering.mobile/infinite_scroll_root_fixed_n_layers_99"
     },
     {
-        "duration": "30.0",
+        "duration": "37.0",
         "name": "rendering.mobile/infinite_scroll_root_fixed_raf_n_layers_0"
     },
     {
-        "duration": "30.0",
+        "duration": "37.0",
         "name": "rendering.mobile/infinite_scroll_root_fixed_raf_n_layers_75"
     },
     {
-        "duration": "29.0",
+        "duration": "36.0",
         "name": "rendering.mobile/infinite_scroll_root_fixed_raf_n_layers_99"
     },
     {
-        "duration": "30.0",
+        "duration": "36.0",
         "name": "rendering.mobile/infinite_scroll_root_n_layers_0"
     },
     {
-        "duration": "29.0",
+        "duration": "37.0",
         "name": "rendering.mobile/infinite_scroll_root_n_layers_75"
     },
     {
-        "duration": "29.0",
+        "duration": "36.0",
         "name": "rendering.mobile/infinite_scroll_root_n_layers_99"
     },
     {
-        "duration": "30.0",
+        "duration": "32.0",
         "name": "rendering.mobile/infinite_scrolling"
     },
     {
-        "duration": "31.0",
+        "duration": "39.0",
         "name": "rendering.mobile/jarro_doverson"
     },
     {
-        "duration": "23.0",
+        "duration": "27.0",
         "name": "rendering.mobile/jpeg_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "22.0",
+        "duration": "27.0",
         "name": "rendering.mobile/jpeg_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "31.0",
+        "duration": "39.0",
         "name": "rendering.mobile/js_full_screen_invalidation"
     },
     {
-        "duration": "30.0",
+        "duration": "37.0",
         "name": "rendering.mobile/js_opacity_plus_n_layers_0"
     },
     {
-        "duration": "30.0",
+        "duration": "38.0",
         "name": "rendering.mobile/js_opacity_plus_n_layers_75"
     },
     {
-        "duration": "31.0",
+        "duration": "38.0",
         "name": "rendering.mobile/js_opacity_plus_n_layers_99"
     },
     {
-        "duration": "33.0",
+        "duration": "39.0",
         "name": "rendering.mobile/js_paint_plus_n_layers_0"
     },
     {
-        "duration": "30.0",
+        "duration": "36.0",
         "name": "rendering.mobile/js_paint_plus_n_layers_75"
     },
     {
-        "duration": "30.0",
+        "duration": "35.0",
         "name": "rendering.mobile/js_paint_plus_n_layers_99"
     },
     {
-        "duration": "30.0",
+        "duration": "37.0",
         "name": "rendering.mobile/js_poster_circle"
     },
     {
-        "duration": "29.0",
+        "duration": "38.0",
         "name": "rendering.mobile/js_scroll_text_only"
     },
     {
-        "duration": "30.0",
+        "duration": "36.0",
         "name": "rendering.mobile/js_toggle_layer_plus_n_layers_0"
     },
     {
-        "duration": "31.0",
+        "duration": "36.0",
         "name": "rendering.mobile/js_toggle_layer_plus_n_layers_75"
     },
     {
-        "duration": "30.0",
+        "duration": "36.0",
         "name": "rendering.mobile/js_toggle_layer_plus_n_layers_99"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "rendering.mobile/kevs_3d"
     },
     {
-        "duration": "27.0",
+        "duration": "32.0",
         "name": "rendering.mobile/keyframed_animations"
     },
     {
-        "duration": "27.0",
+        "duration": "33.0",
         "name": "rendering.mobile/large_texture_uploads"
     },
     {
-        "duration": "27.0",
+        "duration": "34.0",
         "name": "rendering.mobile/latimes_pathological_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "30.0",
         "name": "rendering.mobile/linkedin_2018"
     },
     {
-        "duration": "39.0",
+        "duration": "49.0",
         "name": "rendering.mobile/linkedin_mobile_2018"
     },
     {
-        "duration": "37.0",
+        "duration": "47.0",
         "name": "rendering.mobile/linkedin_mobile_pinch_2018"
     },
     {
-        "duration": "34.0",
+        "duration": "42.0",
         "name": "rendering.mobile/linkedin_pathological_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "28.0",
         "name": "rendering.mobile/list_animation_simple"
     },
     {
-        "duration": "30.0",
+        "duration": "33.0",
         "name": "rendering.mobile/list_recycle_transform"
     },
     {
-        "duration": "27.0",
+        "duration": "36.0",
         "name": "rendering.mobile/main_0fps_impl_60fps"
     },
     {
-        "duration": "28.0",
+        "duration": "37.0",
         "name": "rendering.mobile/main_0fps_impl_60fps_no_update"
     },
     {
-        "duration": "28.0",
+        "duration": "38.0",
         "name": "rendering.mobile/main_0fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "28.0",
+        "duration": "37.0",
         "name": "rendering.mobile/main_0fps_with_jank_impl_0fps"
     },
     {
-        "duration": "27.0",
+        "duration": "32.0",
         "name": "rendering.mobile/main_15fps_impl_0fps"
     },
     {
-        "duration": "27.0",
+        "duration": "33.0",
         "name": "rendering.mobile/main_15fps_with_jank_impl_0fps"
     },
     {
-        "duration": "27.0",
+        "duration": "34.0",
         "name": "rendering.mobile/main_30fps_impl_0fps"
     },
     {
-        "duration": "27.0",
+        "duration": "33.0",
         "name": "rendering.mobile/main_30fps_impl_60fps"
     },
     {
-        "duration": "27.0",
+        "duration": "33.0",
         "name": "rendering.mobile/main_60fps_impl_0fps"
     },
     {
-        "duration": "27.0",
+        "duration": "33.0",
         "name": "rendering.mobile/main_60fps_impl_60fps"
     },
     {
-        "duration": "27.0",
+        "duration": "32.0",
         "name": "rendering.mobile/main_60fps_impl_60fps_no_update"
     },
     {
-        "duration": "27.0",
+        "duration": "33.0",
         "name": "rendering.mobile/main_60fps_impl_60fps_no_update_jank"
     },
     {
-        "duration": "42.0",
+        "duration": "50.0",
         "name": "rendering.mobile/main_60fps_with_extreme_jank_impl_0fps"
     },
     {
-        "duration": "27.0",
+        "duration": "33.0",
         "name": "rendering.mobile/main_60fps_with_jank_and_delay_impl_60fps"
     },
     {
-        "duration": "27.0",
+        "duration": "33.0",
         "name": "rendering.mobile/main_60fps_with_jank_impl_0fps"
     },
     {
-        "duration": "27.0",
+        "duration": "33.0",
         "name": "rendering.mobile/main_animations_half_presented"
     },
     {
-        "duration": "27.0",
+        "duration": "34.0",
         "name": "rendering.mobile/man_in_blue"
     },
     {
-        "duration": "40.0",
+        "duration": "41.0",
         "name": "rendering.mobile/many_images"
     },
     {
-        "duration": "36.0",
+        "duration": "38.0",
         "name": "rendering.mobile/many_planets_deep"
     },
     {
@@ -2676,11 +2676,11 @@
         "name": "rendering.mobile/maps_perf_test"
     },
     {
-        "duration": "27.0",
+        "duration": "29.0",
         "name": "rendering.mobile/mask_transition_animation"
     },
     {
-        "duration": "27.0",
+        "duration": "28.0",
         "name": "rendering.mobile/masonry"
     },
     {
@@ -2692,7 +2692,7 @@
         "name": "rendering.mobile/megi_dish"
     },
     {
-        "duration": "75.0",
+        "duration": "73.0",
         "name": "rendering.mobile/microgame_fps"
     },
     {
@@ -2704,23 +2704,23 @@
         "name": "rendering.mobile/microsoft_fireflies"
     },
     {
-        "duration": "34.0",
+        "duration": "36.0",
         "name": "rendering.mobile/microsoft_fish_ie_tank"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "rendering.mobile/microsoft_performance"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "rendering.mobile/microsoft_snow"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "rendering.mobile/microsoft_speed_reading"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "rendering.mobile/microsoft_tweet_map"
     },
     {
@@ -2728,23 +2728,23 @@
         "name": "rendering.mobile/microsoft_video_city"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "rendering.mobile/microsoft_worker_fountains"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "rendering.mobile/mix_10k"
     },
     {
-        "duration": "32.0",
+        "duration": "34.0",
         "name": "rendering.mobile/mix_blend_mode_animation_difference"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "rendering.mobile/mix_blend_mode_animation_hue"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "rendering.mobile/mix_blend_mode_animation_propagating_isolation"
     },
     {
@@ -2752,11 +2752,11 @@
         "name": "rendering.mobile/mix_blend_mode_animation_screen"
     },
     {
-        "duration": "32.0",
+        "duration": "38.0",
         "name": "rendering.mobile/mlb_mobile_2018"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/mobile_news_sandbox"
     },
     {
@@ -2764,7 +2764,7 @@
         "name": "rendering.mobile/motion_mark_canvas_fill_shapes"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "rendering.mobile/motion_mark_canvas_stroke_shapes"
     },
     {
@@ -2800,27 +2800,27 @@
         "name": "rendering.mobile/motionmark_fixed_2_seconds_suits"
     },
     {
-        "duration": "56.0",
+        "duration": "55.0",
         "name": "rendering.mobile/motionmark_ramp_canvas_arcs"
     },
     {
-        "duration": "55.0",
+        "duration": "56.0",
         "name": "rendering.mobile/motionmark_ramp_canvas_lines"
     },
     {
-        "duration": "52.0",
+        "duration": "54.0",
         "name": "rendering.mobile/motionmark_ramp_design"
     },
     {
-        "duration": "52.0",
+        "duration": "55.0",
         "name": "rendering.mobile/motionmark_ramp_images"
     },
     {
-        "duration": "53.0",
+        "duration": "56.0",
         "name": "rendering.mobile/motionmark_ramp_leaves"
     },
     {
-        "duration": "57.0",
+        "duration": "54.0",
         "name": "rendering.mobile/motionmark_ramp_multiply"
     },
     {
@@ -2828,43 +2828,43 @@
         "name": "rendering.mobile/motionmark_ramp_paths"
     },
     {
-        "duration": "54.0",
+        "duration": "52.0",
         "name": "rendering.mobile/motionmark_ramp_suits"
     },
     {
-        "duration": "37.0",
+        "duration": "38.0",
         "name": "rendering.mobile/new_tilings"
     },
     {
-        "duration": "32.0",
+        "duration": "34.0",
         "name": "rendering.mobile/no_op_raf"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "rendering.mobile/no_op_scroll"
     },
     {
-        "duration": "27.0",
+        "duration": "30.0",
         "name": "rendering.mobile/no_op_settimeout"
     },
     {
-        "duration": "28.0",
+        "duration": "31.0",
         "name": "rendering.mobile/no_op_touch_handler"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "rendering.mobile/no_update_compositor_animation_with_janky_main_animation"
     },
     {
-        "duration": "43.0",
+        "duration": "45.0",
         "name": "rendering.mobile/non_opaque_background_compositor_thread_scrolling_00050_pixels_per_second"
     },
     {
-        "duration": "44.0",
+        "duration": "46.0",
         "name": "rendering.mobile/non_opaque_background_main_thread_scrolling_00050_pixels_per_second"
     },
     {
-        "duration": "36.0",
+        "duration": "37.0",
         "name": "rendering.mobile/nvidia_vertex_buffer_object"
     },
     {
@@ -2872,143 +2872,143 @@
         "name": "rendering.mobile/nyc_gov_scroll_2018"
     },
     {
-        "duration": "36.0",
+        "duration": "38.0",
         "name": "rendering.mobile/nytimes_mobile_2018"
     },
     {
-        "duration": "34.0",
+        "duration": "33.0",
         "name": "rendering.mobile/nytimes_scroll_2018"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "rendering.mobile/off_screen_main_60fps"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "rendering.mobile/off_screen_main_60fps_jank"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "rendering.mobile/offscreen_animation_no_damage"
     },
     {
-        "duration": "32.0",
+        "duration": "34.0",
         "name": "rendering.mobile/overlay_background_color_css_transitions_page"
     },
     {
-        "duration": "33.0",
+        "duration": "30.0",
         "name": "rendering.mobile/paint_worklet"
     },
     {
-        "duration": "27.0",
+        "duration": "29.0",
         "name": "rendering.mobile/parallax_effect"
     },
     {
-        "duration": "33.0",
+        "duration": "30.0",
         "name": "rendering.mobile/particles"
     },
     {
-        "duration": "27.0",
+        "duration": "24.0",
         "name": "rendering.mobile/pbs_pathological_2018"
     },
     {
-        "duration": "24.0",
+        "duration": "21.0",
         "name": "rendering.mobile/physical_simulation"
     },
     {
-        "duration": "34.0",
+        "duration": "29.0",
         "name": "rendering.mobile/pinterest_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "22.0",
         "name": "rendering.mobile/pinterest_mobile_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "27.0",
         "name": "rendering.mobile/put_and_create_imagebitmap_from_imagedata"
     },
     {
-        "duration": "30.0",
+        "duration": "27.0",
         "name": "rendering.mobile/put_get_image_data"
     },
     {
-        "duration": "30.0",
+        "duration": "27.0",
         "name": "rendering.mobile/put_image_data.html"
     },
     {
-        "duration": "27.0",
+        "duration": "24.0",
         "name": "rendering.mobile/raf"
     },
     {
-        "duration": "27.0",
+        "duration": "23.0",
         "name": "rendering.mobile/raf_animation"
     },
     {
-        "duration": "27.0",
+        "duration": "23.0",
         "name": "rendering.mobile/raf_canvas"
     },
     {
-        "duration": "27.0",
+        "duration": "24.0",
         "name": "rendering.mobile/raf_touch_animation"
     },
     {
-        "duration": "28.0",
+        "duration": "25.0",
         "name": "rendering.mobile/recode_pathological_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "26.0",
         "name": "rendering.mobile/reddit_mobile_2018"
     },
     {
-        "duration": "30.0",
+        "duration": "29.0",
         "name": "rendering.mobile/runway_2019"
     },
     {
-        "duration": "32.0",
+        "duration": "31.0",
         "name": "rendering.mobile/san_angeles"
     },
     {
-        "duration": "38.0",
+        "duration": "29.0",
         "name": "rendering.mobile/second_batch_js_heavy"
     },
     {
-        "duration": "38.0",
+        "duration": "28.0",
         "name": "rendering.mobile/second_batch_js_light"
     },
     {
-        "duration": "39.0",
+        "duration": "29.0",
         "name": "rendering.mobile/second_batch_js_medium"
     },
     {
-        "duration": "29.0",
+        "duration": "26.0",
         "name": "rendering.mobile/sfgate_mobile_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "rendering.mobile/sheets_render.html"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "rendering.mobile/silk_finance"
     },
     {
-        "duration": "26.0",
+        "duration": "28.0",
         "name": "rendering.mobile/simple_text_page"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "rendering.mobile/simple_touch_drag"
     },
     {
-        "duration": "68.0",
+        "duration": "67.0",
         "name": "rendering.mobile/skelebuddies_wasm_2020"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "rendering.mobile/slashdot_mobile_2018"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "rendering.mobile/small_texture_uploads"
     },
     {
@@ -3016,59 +3016,59 @@
         "name": "rendering.mobile/smash_cat"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "rendering.mobile/spielzeugz"
     },
     {
-        "duration": "29.0",
+        "duration": "32.0",
         "name": "rendering.mobile/static_canvas_to_hw_accelerated_canvas.html"
     },
     {
-        "duration": "29.0",
+        "duration": "32.0",
         "name": "rendering.mobile/static_webgl_to_hw_accelerated_canvas.html"
     },
     {
-        "duration": "24.0",
+        "duration": "22.0",
         "name": "rendering.mobile/sticky_using_webkit"
     },
     {
-        "duration": "30.0",
+        "duration": "32.0",
         "name": "rendering.mobile/stroke_shapes"
     },
     {
-        "duration": "35.0",
+        "duration": "34.0",
         "name": "rendering.mobile/svg_icon_raster"
     },
     {
-        "duration": "25.0",
+        "duration": "22.0",
         "name": "rendering.mobile/swipe_to_dismiss"
     },
     {
-        "duration": "25.0",
+        "duration": "27.0",
         "name": "rendering.mobile/sync_scroll_offset"
     },
     {
-        "duration": "39.0",
+        "duration": "38.0",
         "name": "rendering.mobile/techcrunch_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "30.0",
         "name": "rendering.mobile/techcrunch_mobile_2018"
     },
     {
-        "duration": "53.0",
+        "duration": "52.0",
         "name": "rendering.mobile/text_05000_pixels_per_second"
     },
     {
-        "duration": "41.0",
+        "duration": "37.0",
         "name": "rendering.mobile/text_10000_pixels_per_second"
     },
     {
-        "duration": "39.0",
+        "duration": "36.0",
         "name": "rendering.mobile/text_20000_pixels_per_second"
     },
     {
-        "duration": "36.0",
+        "duration": "33.0",
         "name": "rendering.mobile/text_40000_pixels_per_second"
     },
     {
@@ -3084,11 +3084,11 @@
         "name": "rendering.mobile/text_90000_pixels_per_second"
     },
     {
-        "duration": "50.0",
+        "duration": "51.0",
         "name": "rendering.mobile/text_constant_full_page_raster_05000_pixels_per_second"
     },
     {
-        "duration": "48.0",
+        "duration": "49.0",
         "name": "rendering.mobile/text_constant_full_page_raster_10000_pixels_per_second"
     },
     {
@@ -3096,11 +3096,11 @@
         "name": "rendering.mobile/text_constant_full_page_raster_20000_pixels_per_second"
     },
     {
-        "duration": "43.0",
+        "duration": "45.0",
         "name": "rendering.mobile/text_constant_full_page_raster_40000_pixels_per_second"
     },
     {
-        "duration": "46.0",
+        "duration": "47.0",
         "name": "rendering.mobile/text_constant_full_page_raster_60000_pixels_per_second"
     },
     {
@@ -3108,47 +3108,47 @@
         "name": "rendering.mobile/text_constant_full_page_raster_75000_pixels_per_second"
     },
     {
-        "duration": "49.0",
+        "duration": "46.0",
         "name": "rendering.mobile/text_constant_full_page_raster_90000_pixels_per_second"
     },
     {
-        "duration": "42.0",
+        "duration": "34.0",
         "name": "rendering.mobile/text_fling_05000_pixels_per_second"
     },
     {
-        "duration": "42.0",
+        "duration": "34.0",
         "name": "rendering.mobile/text_fling_10000_pixels_per_second"
     },
     {
-        "duration": "43.0",
+        "duration": "34.0",
         "name": "rendering.mobile/text_fling_20000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "8.0",
         "name": "rendering.mobile/text_hover_05000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "8.0",
         "name": "rendering.mobile/text_hover_10000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "8.0",
         "name": "rendering.mobile/text_hover_20000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "8.0",
         "name": "rendering.mobile/text_hover_40000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "8.0",
         "name": "rendering.mobile/text_hover_60000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "8.0",
         "name": "rendering.mobile/text_hover_75000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "8.0",
         "name": "rendering.mobile/text_hover_90000_pixels_per_second"
     },
     {
@@ -3156,7 +3156,7 @@
         "name": "rendering.mobile/text_scroll_input_every_other_vsync_plus_0us"
     },
     {
-        "duration": "47.0",
+        "duration": "46.0",
         "name": "rendering.mobile/text_scroll_input_one_per_vsync_minus_1000us"
     },
     {
@@ -3164,19 +3164,19 @@
         "name": "rendering.mobile/text_scroll_input_one_per_vsync_minus_3000us"
     },
     {
-        "duration": "46.0",
+        "duration": "47.0",
         "name": "rendering.mobile/text_scroll_input_one_per_vsync_minus_300us"
     },
     {
-        "duration": "47.0",
+        "duration": "48.0",
         "name": "rendering.mobile/text_scroll_input_one_per_vsync_plus_0us"
     },
     {
-        "duration": "48.0",
+        "duration": "49.0",
         "name": "rendering.mobile/text_scroll_input_one_per_vsync_plus_1000us"
     },
     {
-        "duration": "48.0",
+        "duration": "47.0",
         "name": "rendering.mobile/text_scroll_input_one_per_vsync_plus_3000us"
     },
     {
@@ -3184,51 +3184,51 @@
         "name": "rendering.mobile/text_scroll_input_one_per_vsync_plus_300us"
     },
     {
-        "duration": "47.0",
+        "duration": "48.0",
         "name": "rendering.mobile/text_scroll_input_two_per_vsync_plus_0us"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/text_scrollbar_100_pixels_per_second"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/text_scrollbar_1200_pixels_per_second"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/text_scrollbar_200_pixels_per_second"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/text_scrollbar_2300_pixels_per_second"
     },
     {
-        "duration": "5.0",
+        "duration": "2.0",
         "name": "rendering.mobile/text_scrollbar_700_pixels_per_second"
     },
     {
-        "duration": "28.0",
+        "duration": "29.0",
         "name": "rendering.mobile/theverge_article_mobile_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "29.0",
         "name": "rendering.mobile/theverge_mobile_2018"
     },
     {
-        "duration": "33.0",
+        "duration": "36.0",
         "name": "rendering.mobile/throughput_scrolling_active_handler"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "rendering.mobile/throughput_scrolling_composited"
     },
     {
-        "duration": "35.0",
+        "duration": "36.0",
         "name": "rendering.mobile/throughput_scrolling_passive_handler"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "rendering.mobile/throughput_scrolling_uncomposited"
     },
     {
@@ -3236,67 +3236,67 @@
         "name": "rendering.mobile/tiny_racing_v3_wasm_2020"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "rendering.mobile/toBlob_duration.html"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "rendering.mobile/toBlob_duration_jpeg.html"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "rendering.mobile/toBlob_small_canvas_in_worker.html"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "rendering.mobile/touch_handler_scrolling"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "rendering.mobile/transfer_from_imageBitmap.html"
     },
     {
-        "duration": "32.0",
+        "duration": "33.0",
         "name": "rendering.mobile/transform_transitions"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "rendering.mobile/transform_transitions_js_block"
     },
     {
-        "duration": "28.0",
+        "duration": "29.0",
         "name": "rendering.mobile/twitch_2018"
     },
     {
-        "duration": "28.0",
+        "duration": "27.0",
         "name": "rendering.mobile/twitch_mobile_pinch_2018"
     },
     {
-        "duration": "43.0",
+        "duration": "40.0",
         "name": "rendering.mobile/twitter_2018"
     },
     {
-        "duration": "44.0",
+        "duration": "42.0",
         "name": "rendering.mobile/twitter_mobile_2018"
     },
     {
-        "duration": "36.0",
+        "duration": "34.0",
         "name": "rendering.mobile/update_history_state"
     },
     {
-        "duration": "30.0",
+        "duration": "28.0",
         "name": "rendering.mobile/usatoday_mobile_2018"
     },
     {
-        "duration": "27.0",
+        "duration": "30.0",
         "name": "rendering.mobile/vertical_expansion"
     },
     {
-        "duration": "35.0",
+        "duration": "34.0",
         "name": "rendering.mobile/video_to_hw_accelerated_canvas"
     },
     {
-        "duration": "34.0",
+        "duration": "33.0",
         "name": "rendering.mobile/video_to_sub_texture"
     },
     {
@@ -3316,23 +3316,23 @@
         "name": "rendering.mobile/video_to_texture"
     },
     {
-        "duration": "34.0",
+        "duration": "33.0",
         "name": "rendering.mobile/web_animation_value_type_color"
     },
     {
-        "duration": "35.0",
+        "duration": "34.0",
         "name": "rendering.mobile/web_animation_value_type_length_3d"
     },
     {
-        "duration": "35.0",
+        "duration": "34.0",
         "name": "rendering.mobile/web_animation_value_type_length_complex"
     },
     {
-        "duration": "35.0",
+        "duration": "34.0",
         "name": "rendering.mobile/web_animation_value_type_length_simple"
     },
     {
-        "duration": "35.0",
+        "duration": "33.0",
         "name": "rendering.mobile/web_animation_value_type_path"
     },
     {
@@ -3340,23 +3340,23 @@
         "name": "rendering.mobile/web_animation_value_type_shadow"
     },
     {
-        "duration": "35.0",
+        "duration": "34.0",
         "name": "rendering.mobile/web_animation_value_type_transform_complex"
     },
     {
-        "duration": "35.0",
+        "duration": "34.0",
         "name": "rendering.mobile/web_animation_value_type_transform_simple"
     },
     {
-        "duration": "41.0",
+        "duration": "39.0",
         "name": "rendering.mobile/web_animations_many_keyframes"
     },
     {
-        "duration": "35.0",
+        "duration": "34.0",
         "name": "rendering.mobile/web_animations_set_current_time"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "rendering.mobile/web_animations_simultaneous"
     },
     {
@@ -3364,31 +3364,31 @@
         "name": "rendering.mobile/web_animations_staggered_chaining"
     },
     {
-        "duration": "34.0",
+        "duration": "33.0",
         "name": "rendering.mobile/web_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "36.0",
+        "duration": "35.0",
         "name": "rendering.mobile/web_animations_staggered_triggering_page"
     },
     {
-        "duration": "7.0",
+        "duration": "5.0",
         "name": "rendering.mobile/webgl_to_texture"
     },
     {
-        "duration": "31.0",
+        "duration": "28.0",
         "name": "rendering.mobile/webp_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "31.0",
+        "duration": "30.0",
         "name": "rendering.mobile/webp_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "38.0",
+        "duration": "37.0",
         "name": "rendering.mobile/wikipedia_2018"
     },
     {
-        "duration": "34.0",
+        "duration": "32.0",
         "name": "rendering.mobile/wikipedia_delayed_scroll_start_2018"
     },
     {
@@ -3396,15 +3396,15 @@
         "name": "rendering.mobile/wikipedia_mobile_2018"
     },
     {
-        "duration": "38.0",
+        "duration": "36.0",
         "name": "rendering.mobile/wordpress_2018"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "rendering.mobile/wordpress_mobile_2018"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "rendering.mobile/worldjournal_mobile_2018"
     },
     {
@@ -3412,75 +3412,75 @@
         "name": "rendering.mobile/wow_wiki_pathological_2018"
     },
     {
-        "duration": "35.0",
+        "duration": "39.0",
         "name": "rendering.mobile/wowwiki_mobile_2018"
     },
     {
-        "duration": "7.0",
+        "duration": "5.0",
         "name": "rendering.mobile/wsj_mobile_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "25.0",
         "name": "rendering.mobile/yahoo_answers_2018"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "rendering.mobile/yahoo_answers_mobile_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "21.0",
         "name": "rendering.mobile/yahoo_news_2018"
     },
     {
-        "duration": "22.0",
+        "duration": "25.0",
         "name": "rendering.mobile/yahoo_news_mobile_2018"
     },
     {
-        "duration": "20.0",
+        "duration": "25.0",
         "name": "rendering.mobile/yahoo_sports_2018"
     },
     {
-        "duration": "17.0",
+        "duration": "21.0",
         "name": "rendering.mobile/yahoo_sports_pathological_2018"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "rendering.mobile/youtube_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "19.0",
         "name": "rendering.mobile/youtube_mobile_2018"
     },
     {
-        "duration": "21.0",
+        "duration": "25.0",
         "name": "rendering.mobile/zdnet_pathological_2018"
     },
     {
-        "duration": "25.0",
+        "duration": "22.0",
         "name": "rendering.mobile/zoom_in_animation"
     },
     {
-        "duration": "26.0",
+        "duration": "25.0",
         "name": "speedometer-future/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "26.0",
+        "duration": "24.0",
         "name": "speedometer/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "93.0",
+        "duration": "82.0",
         "name": "speedometer2-future/Speedometer2"
     },
     {
-        "duration": "99.0",
+        "duration": "85.0",
         "name": "speedometer2/Speedometer2"
     },
     {
-        "duration": "138.0",
+        "duration": "116.0",
         "name": "speedometer3-future/Speedometer3"
     },
     {
-        "duration": "136.0",
+        "duration": "113.0",
         "name": "speedometer3/Speedometer3"
     },
     {
@@ -3488,15 +3488,15 @@
         "name": "system_health.common_mobile/background:media:imgur:2019"
     },
     {
-        "duration": "46.0",
+        "duration": "47.0",
         "name": "system_health.common_mobile/background:news:nytimes:2019"
     },
     {
-        "duration": "32.0",
+        "duration": "35.0",
         "name": "system_health.common_mobile/background:search:google:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "34.0",
         "name": "system_health.common_mobile/background:social:facebook:2019"
     },
     {
@@ -3504,11 +3504,11 @@
         "name": "system_health.common_mobile/background:tools:gmail:2019"
     },
     {
-        "duration": "15.0",
+        "duration": "20.0",
         "name": "system_health.common_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "15.0",
+        "duration": "20.0",
         "name": "system_health.common_mobile/browse:chrome:omnibox:2019"
     },
     {
@@ -3516,23 +3516,23 @@
         "name": "system_health.common_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "56.0",
         "name": "system_health.common_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "5.0",
         "name": "system_health.common_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "5.0",
         "name": "system_health.common_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "49.0",
+        "duration": "55.0",
         "name": "system_health.common_mobile/browse:media:tiktok_infinite_scroll:2021"
     },
     {
-        "duration": "58.0",
+        "duration": "63.0",
         "name": "system_health.common_mobile/browse:media:youtube:2019"
     },
     {
@@ -3540,7 +3540,7 @@
         "name": "system_health.common_mobile/browse:news:businessinsider:2021"
     },
     {
-        "duration": "54.0",
+        "duration": "55.0",
         "name": "system_health.common_mobile/browse:news:cnn:2021"
     },
     {
@@ -3552,15 +3552,15 @@
         "name": "system_health.common_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "59.0",
         "name": "system_health.common_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "42.0",
+        "duration": "47.0",
         "name": "system_health.common_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "62.0",
+        "duration": "68.0",
         "name": "system_health.common_mobile/browse:news:reddit:2019"
     },
     {
@@ -3568,15 +3568,15 @@
         "name": "system_health.common_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "58.0",
+        "duration": "62.0",
         "name": "system_health.common_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "system_health.common_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "37.0",
         "name": "system_health.common_mobile/browse:search:amp:sxg:2019"
     },
     {
@@ -3584,11 +3584,11 @@
         "name": "system_health.common_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "61.0",
+        "duration": "66.0",
         "name": "system_health.common_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "62.0",
+        "duration": "71.0",
         "name": "system_health.common_mobile/browse:shopping:flipkart:2019"
     },
     {
@@ -3600,23 +3600,23 @@
         "name": "system_health.common_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "79.0",
+        "duration": "82.0",
         "name": "system_health.common_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "3.0",
+        "duration": "5.0",
         "name": "system_health.common_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.common_mobile/browse:social:pinterest_infinite_scroll:2021"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.common_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "82.0",
+        "duration": "88.0",
         "name": "system_health.common_mobile/browse:social:twitter:2019"
     },
     {
@@ -3624,219 +3624,219 @@
         "name": "system_health.common_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "46.0",
+        "duration": "53.0",
         "name": "system_health.common_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:chrome:blank"
     },
     {
-        "duration": "25.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:games:bubbles:2020"
     },
     {
-        "duration": "29.0",
+        "duration": "36.0",
         "name": "system_health.common_mobile/load:games:lazors"
     },
     {
-        "duration": "30.0",
+        "duration": "36.0",
         "name": "system_health.common_mobile/load:games:spychase:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "33.0",
         "name": "system_health.common_mobile/load:media:dailymotion:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:media:facebook_feed:mobile:2020"
     },
     {
-        "duration": "25.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:media:facebook_photos:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:media:facebook_photos:mobile:2020"
     },
     {
-        "duration": "27.0",
+        "duration": "34.0",
         "name": "system_health.common_mobile/load:media:flickr:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "34.0",
         "name": "system_health.common_mobile/load:media:google_images:2018"
     },
     {
-        "duration": "27.0",
+        "duration": "33.0",
         "name": "system_health.common_mobile/load:media:imgur:2018"
     },
     {
-        "duration": "3.0",
+        "duration": "5.0",
         "name": "system_health.common_mobile/load:media:soundcloud:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:media:youtube:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "34.0",
         "name": "system_health.common_mobile/load:news:bbc:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "34.0",
         "name": "system_health.common_mobile/load:news:cnn:2020"
     },
     {
-        "duration": "26.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:news:irctc:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "35.0",
         "name": "system_health.common_mobile/load:news:nytimes:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "33.0",
         "name": "system_health.common_mobile/load:news:qq:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:news:reddit:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:news:washingtonpost:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:news:wikipedia:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "33.0",
         "name": "system_health.common_mobile/load:search:amazon:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "33.0",
         "name": "system_health.common_mobile/load:search:baidu:2018"
     },
     {
-        "duration": "27.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:search:ebay:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:search:google:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "33.0",
         "name": "system_health.common_mobile/load:search:naver:2023"
     },
     {
-        "duration": "26.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:search:taobao:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "31.0",
         "name": "system_health.common_mobile/load:search:yahoo:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:search:yandex:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:social:instagram:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:social:pinterest:2019"
     },
     {
-        "duration": "27.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:social:twitter:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "5.0",
         "name": "system_health.common_mobile/load:tools:docs:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:tools:drive:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "5.0",
         "name": "system_health.common_mobile/load:tools:dropbox:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "5.0",
         "name": "system_health.common_mobile/load:tools:gmail:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "34.0",
         "name": "system_health.common_mobile/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "26.0",
+        "duration": "32.0",
         "name": "system_health.common_mobile/load:tools:weather:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.common_mobile/long_running:tools:gmail-background"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.common_mobile/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "34.0",
+        "duration": "43.0",
         "name": "system_health.memory_mobile/background:media:imgur:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "50.0",
         "name": "system_health.memory_mobile/background:news:nytimes:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "43.0",
         "name": "system_health.memory_mobile/background:search:google:2019"
     },
     {
-        "duration": "31.0",
+        "duration": "40.0",
         "name": "system_health.memory_mobile/background:social:facebook:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "system_health.memory_mobile/background:tools:gmail:2019"
     },
     {
-        "duration": "14.0",
+        "duration": "25.0",
         "name": "system_health.memory_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "system_health.memory_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "86.0",
+        "duration": "84.0",
         "name": "system_health.memory_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "55.0",
+        "duration": "59.0",
         "name": "system_health.memory_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "52.0",
+        "duration": "55.0",
         "name": "system_health.memory_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "76.0",
+        "duration": "78.0",
         "name": "system_health.memory_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "57.0",
+        "duration": "58.0",
         "name": "system_health.memory_mobile/browse:media:tiktok_infinite_scroll:2021"
     },
     {
-        "duration": "66.0",
+        "duration": "67.0",
         "name": "system_health.memory_mobile/browse:media:youtube:2019"
     },
     {
@@ -3856,19 +3856,19 @@
         "name": "system_health.memory_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "53.0",
+        "duration": "64.0",
         "name": "system_health.memory_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "41.0",
+        "duration": "51.0",
         "name": "system_health.memory_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "68.0",
+        "duration": "69.0",
         "name": "system_health.memory_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "59.0",
+        "duration": "54.0",
         "name": "system_health.memory_mobile/browse:news:toi:2019"
     },
     {
@@ -3876,11 +3876,11 @@
         "name": "system_health.memory_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "34.0",
+        "duration": "37.0",
         "name": "system_health.memory_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "36.0",
+        "duration": "39.0",
         "name": "system_health.memory_mobile/browse:search:amp:sxg:2019"
     },
     {
@@ -3888,11 +3888,11 @@
         "name": "system_health.memory_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "64.0",
         "name": "system_health.memory_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "68.0",
+        "duration": "64.0",
         "name": "system_health.memory_mobile/browse:shopping:flipkart:2019"
     },
     {
@@ -3904,15 +3904,15 @@
         "name": "system_health.memory_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "80.0",
+        "duration": "83.0",
         "name": "system_health.memory_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "88.0",
+        "duration": "89.0",
         "name": "system_health.memory_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "1.0",
+        "duration": "3.0",
         "name": "system_health.memory_mobile/browse:social:pinterest_infinite_scroll:2021"
     },
     {
@@ -3928,23 +3928,23 @@
         "name": "system_health.memory_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "53.0",
+        "duration": "56.0",
         "name": "system_health.memory_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "36.0",
+        "duration": "35.0",
         "name": "system_health.memory_mobile/load:chrome:blank"
     },
     {
-        "duration": "32.0",
+        "duration": "34.0",
         "name": "system_health.memory_mobile/load:games:bubbles:2020"
     },
     {
-        "duration": "34.0",
+        "duration": "38.0",
         "name": "system_health.memory_mobile/load:games:lazors"
     },
     {
-        "duration": "37.0",
+        "duration": "40.0",
         "name": "system_health.memory_mobile/load:games:spychase:2018"
     },
     {
@@ -3952,39 +3952,39 @@
         "name": "system_health.memory_mobile/load:media:dailymotion:2019"
     },
     {
-        "duration": "28.0",
+        "duration": "36.0",
         "name": "system_health.memory_mobile/load:media:facebook_feed:mobile:2020"
     },
     {
-        "duration": "30.0",
+        "duration": "36.0",
         "name": "system_health.memory_mobile/load:media:facebook_photos:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "37.0",
         "name": "system_health.memory_mobile/load:media:facebook_photos:mobile:2020"
     },
     {
-        "duration": "30.0",
+        "duration": "37.0",
         "name": "system_health.memory_mobile/load:media:flickr:2018"
     },
     {
-        "duration": "28.0",
+        "duration": "36.0",
         "name": "system_health.memory_mobile/load:media:google_images:2018"
     },
     {
-        "duration": "29.0",
+        "duration": "36.0",
         "name": "system_health.memory_mobile/load:media:imgur:2018"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "system_health.memory_mobile/load:media:soundcloud:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "35.0",
         "name": "system_health.memory_mobile/load:media:youtube:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "system_health.memory_mobile/load:news:bbc:2019"
     },
     {
@@ -3992,303 +3992,303 @@
         "name": "system_health.memory_mobile/load:news:cnn:2020"
     },
     {
-        "duration": "29.0",
+        "duration": "37.0",
         "name": "system_health.memory_mobile/load:news:irctc:2019"
     },
     {
-        "duration": "36.0",
+        "duration": "38.0",
         "name": "system_health.memory_mobile/load:news:nytimes:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "36.0",
         "name": "system_health.memory_mobile/load:news:qq:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "36.0",
         "name": "system_health.memory_mobile/load:news:reddit:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "37.0",
         "name": "system_health.memory_mobile/load:news:washingtonpost:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "37.0",
         "name": "system_health.memory_mobile/load:news:wikipedia:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "system_health.memory_mobile/load:search:amazon:2019"
     },
     {
-        "duration": "36.0",
+        "duration": "37.0",
         "name": "system_health.memory_mobile/load:search:baidu:2018"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "system_health.memory_mobile/load:search:ebay:2018"
     },
     {
-        "duration": "31.0",
+        "duration": "38.0",
         "name": "system_health.memory_mobile/load:search:google:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "36.0",
         "name": "system_health.memory_mobile/load:search:naver:2023"
     },
     {
-        "duration": "32.0",
+        "duration": "36.0",
         "name": "system_health.memory_mobile/load:search:taobao:2019"
     },
     {
-        "duration": "25.0",
+        "duration": "34.0",
         "name": "system_health.memory_mobile/load:search:yahoo:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "34.0",
         "name": "system_health.memory_mobile/load:search:yandex:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "37.0",
         "name": "system_health.memory_mobile/load:social:instagram:2019"
     },
     {
-        "duration": "34.0",
+        "duration": "37.0",
         "name": "system_health.memory_mobile/load:social:pinterest:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "38.0",
         "name": "system_health.memory_mobile/load:social:twitter:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "system_health.memory_mobile/load:tools:docs:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "system_health.memory_mobile/load:tools:drive:2019"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "system_health.memory_mobile/load:tools:dropbox:2019"
     },
     {
-        "duration": "2.0",
+        "duration": "4.0",
         "name": "system_health.memory_mobile/load:tools:gmail:2019"
     },
     {
-        "duration": "33.0",
+        "duration": "36.0",
         "name": "system_health.memory_mobile/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "25.0",
+        "duration": "35.0",
         "name": "system_health.memory_mobile/load:tools:weather:2019"
     },
     {
-        "duration": "1.0",
+        "duration": "3.0",
         "name": "system_health.memory_mobile/long_running:tools:gmail-background"
     },
     {
-        "duration": "1.0",
+        "duration": "3.0",
         "name": "system_health.memory_mobile/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "30.0",
+        "duration": "25.0",
         "name": "system_health.webview_startup/load:chrome:blank"
     },
     {
-        "duration": "5.0",
+        "duration": "7.0",
         "name": "v8.browsing_mobile/browse:chrome:newtab:2019"
     },
     {
-        "duration": "15.0",
+        "duration": "23.0",
         "name": "v8.browsing_mobile/browse:chrome:omnibox:2019"
     },
     {
-        "duration": "76.0",
+        "duration": "84.0",
         "name": "v8.browsing_mobile/browse:media:facebook_photos:2019"
     },
     {
-        "duration": "53.0",
+        "duration": "60.0",
         "name": "v8.browsing_mobile/browse:media:flickr_infinite_scroll:2019"
     },
     {
-        "duration": "5.0",
+        "duration": "7.0",
         "name": "v8.browsing_mobile/browse:media:googleplaystore:2019"
     },
     {
-        "duration": "5.0",
+        "duration": "7.0",
         "name": "v8.browsing_mobile/browse:media:imgur:2019"
     },
     {
-        "duration": "52.0",
+        "duration": "59.0",
         "name": "v8.browsing_mobile/browse:media:tiktok_infinite_scroll:2021"
     },
     {
-        "duration": "60.0",
+        "duration": "67.0",
         "name": "v8.browsing_mobile/browse:media:youtube:2019"
     },
     {
-        "duration": "5.0",
+        "duration": "7.0",
         "name": "v8.browsing_mobile/browse:news:businessinsider:2021"
     },
     {
-        "duration": "52.0",
+        "duration": "58.0",
         "name": "v8.browsing_mobile/browse:news:cnn:2021"
     },
     {
-        "duration": "9.0",
+        "duration": "6.0",
         "name": "v8.browsing_mobile/browse:news:cricbuzz:2019"
     },
     {
-        "duration": "56.0",
+        "duration": "52.0",
         "name": "v8.browsing_mobile/browse:news:globo:2019"
     },
     {
-        "duration": "57.0",
+        "duration": "63.0",
         "name": "v8.browsing_mobile/browse:news:nytimes:2019"
     },
     {
-        "duration": "42.0",
+        "duration": "50.0",
         "name": "v8.browsing_mobile/browse:news:qq:2019"
     },
     {
-        "duration": "59.0",
+        "duration": "66.0",
         "name": "v8.browsing_mobile/browse:news:reddit:2019"
     },
     {
-        "duration": "50.0",
+        "duration": "56.0",
         "name": "v8.browsing_mobile/browse:news:toi:2019"
     },
     {
-        "duration": "61.0",
+        "duration": "67.0",
         "name": "v8.browsing_mobile/browse:news:washingtonpost:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "37.0",
         "name": "v8.browsing_mobile/browse:search:amp:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "38.0",
         "name": "v8.browsing_mobile/browse:search:amp:sxg:2019"
     },
     {
-        "duration": "63.0",
+        "duration": "61.0",
         "name": "v8.browsing_mobile/browse:shopping:amazon:2019"
     },
     {
-        "duration": "65.0",
+        "duration": "58.0",
         "name": "v8.browsing_mobile/browse:shopping:avito:2019"
     },
     {
-        "duration": "68.0",
+        "duration": "62.0",
         "name": "v8.browsing_mobile/browse:shopping:flipkart:2019"
     },
     {
-        "duration": "5.0",
+        "duration": "7.0",
         "name": "v8.browsing_mobile/browse:shopping:lazada:2019"
     },
     {
-        "duration": "5.0",
+        "duration": "7.0",
         "name": "v8.browsing_mobile/browse:social:facebook:2019"
     },
     {
-        "duration": "76.0",
+        "duration": "84.0",
         "name": "v8.browsing_mobile/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "5.0",
+        "duration": "7.0",
         "name": "v8.browsing_mobile/browse:social:instagram:2019"
     },
     {
-        "duration": "5.0",
+        "duration": "7.0",
         "name": "v8.browsing_mobile/browse:social:pinterest_infinite_scroll:2021"
     },
     {
-        "duration": "68.0",
+        "duration": "76.0",
         "name": "v8.browsing_mobile/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "84.0",
+        "duration": "92.0",
         "name": "v8.browsing_mobile/browse:social:twitter:2019"
     },
     {
-        "duration": "5.0",
+        "duration": "7.0",
         "name": "v8.browsing_mobile/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "47.0",
+        "duration": "55.0",
         "name": "v8.browsing_mobile/browse:tools:maps:2019"
     },
     {
-        "duration": "77.0",
+        "duration": "91.0",
         "name": "wasmpspdfkit/https://pspdfkit.com/webassembly-benchmark/"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "webrtc/10s_datachannel_transfer"
     },
     {
-        "duration": "21.0",
+        "duration": "26.0",
         "name": "webrtc/canvas_capture_peer_connection"
     },
     {
-        "duration": "31.0",
+        "duration": "36.0",
         "name": "webrtc/codec_constraints_h264"
     },
     {
-        "duration": "31.0",
+        "duration": "36.0",
         "name": "webrtc/codec_constraints_vp8"
     },
     {
-        "duration": "31.0",
+        "duration": "37.0",
         "name": "webrtc/codec_constraints_vp9"
     },
     {
-        "duration": "31.0",
+        "duration": "36.0",
         "name": "webrtc/encoded_insertable_streams"
     },
     {
-        "duration": "21.0",
+        "duration": "26.0",
         "name": "webrtc/hd_local_stream_10s"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "webrtc/insertable_streams_audio_processing"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "webrtc/insertable_streams_video_processing_camera_canvas2d_video"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "webrtc/insertable_streams_video_processing_camera_noop_video"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "webrtc/insertable_streams_video_processing_camera_webgl_pc"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "webrtc/insertable_streams_video_processing_camera_webgl_video"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "webrtc/insertable_streams_video_processing_pc_webgl_video"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "webrtc/insertable_streams_video_processing_video_webgl_video"
     },
     {
-        "duration": "31.0",
+        "duration": "36.0",
         "name": "webrtc/multiple_peerconnections"
     },
     {
-        "duration": "1.0",
+        "duration": "2.0",
         "name": "webrtc/negotiate-timing"
     },
     {
-        "duration": "32.0",
+        "duration": "37.0",
         "name": "webrtc/pause_play_peerconnections"
     }
 ]
diff --git a/tools/rust/build_crubit.py b/tools/rust/build_crubit.py
index bd6f912..5330d1f 100755
--- a/tools/rust/build_crubit.py
+++ b/tools/rust/build_crubit.py
@@ -4,22 +4,28 @@
 # found in the LICENSE file.
 '''Builds the Crubit tool.
 
-!!! DO NOT USE IN PRODUCTION
-Builds the Crubit tool (an experiment for Rust/C++ FFI bindings generation).
+Builds the Crubit tools for generating Rust/C++ bindings.
 
-This script clones the Crubit repository, checks it out to a defined revision,
-and then uses Bazel to build Crubit.
+This script must be run after //tools/rust/build_rust.py as it uses the outputs
+of that script in the compilation of Crubit. It uses:
+- The LLVM and Clang libraries and headers in `RUST_HOST_LLVM_INSTALL_DIR`.
+- The rust toolchain binaries and libraries in `RUST_TOOLCHAIN_OUT_DIR`.
+
+This script:
+- Clones the Abseil repository, checks out a defined revision.
+- Builds Abseil with Cmake.
+- Clones the Crubit repository, checks out a defined revision.
+- Builds Crubit's rs_bindings_from_cc with Cargo.
+- Adds rs_bindings_from_cc and the Crubit support libraries into the
+  toolchain package in `RUST_TOOLCHAIN_OUT_DIR`.
+
+The cc_bindings_from_rs binary is not yet built, as there's no Cargo rules to build it yet.
 '''
 
 import argparse
-import collections
-import hashlib
 import os
 import platform
 import shutil
-import stat
-import string
-import subprocess
 import sys
 
 from pathlib import Path
@@ -29,186 +35,177 @@
     os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'clang',
                  'scripts'))
 
-from update import (CLANG_REVISION, CLANG_SUB_REVISION, LLVM_BUILD_DIR)
-from build import (LLVM_BOOTSTRAP_INSTALL_DIR, DownloadDebianSysroot)
+from build import (AddCMakeToPath, AddZlibToPath, CheckoutGitRepo,
+                   DownloadDebianSysroot, RunCommand, THIRD_PARTY_DIR)
+from update import (RmTree)
 
-from update_rust import (CHROMIUM_DIR, CRUBIT_REVISION, THIRD_PARTY_DIR)
+from build_rust import (RUST_HOST_LLVM_INSTALL_DIR)
+from update_rust import (CHROMIUM_DIR, ABSL_REVISION, CRUBIT_REVISION,
+                         RUST_TOOLCHAIN_OUT_DIR)
 
-BAZEL_DIR = os.path.join(CHROMIUM_DIR, 'tools', 'bazel')
-CRUBIT_SRC_DIR = os.path.join(THIRD_PARTY_DIR, 'crubit', 'src')
+ABSL_GIT = 'https://github.com/abseil/abseil-cpp'
+CRUBIT_GIT = 'https://github.com/google/crubit'
+
+ABSL_SRC_DIR = os.path.join(CHROMIUM_DIR, 'third_party',
+                            'rust-toolchain-intermediate', 'absl')
+ABSL_INSTALL_DIR = os.path.join(ABSL_SRC_DIR, 'install')
+CRUBIT_SRC_DIR = os.path.join(CHROMIUM_DIR, 'third_party',
+                              'rust-toolchain-intermediate', 'crubit')
+
+EXE = '.exe' if sys.platform == 'win32' else ''
 
 
-def BazelExe():
-    if sys.platform == 'darwin':
-        if platform.machine() == 'arm64':
-            return os.path.join(BAZEL_DIR, 'mac-arm64', 'bazel')
-        else:
-            return os.path.join(BAZEL_DIR, 'mac-amd64', 'bazel')
-    elif sys.platform == 'win32':
-        return os.path.join(BAZEL_DIR, 'windows-amd64', 'bazel.exe')
-    else:
-        return os.path.join(BAZEL_DIR, 'linux-amd64', 'bazel')
+def BuildAbsl(env, debug):
+    os.chdir(ABSL_SRC_DIR)
 
-
-def RunCommand(command, env=None, cwd=None, fail_hard=True):
-    print('Running', command)
-    if subprocess.run(command, env=env, cwd=cwd,
-                      shell=sys.platform == 'win32').returncode == 0:
-        return True
-    print('Failed.')
-    if fail_hard:
-        raise RuntimeError(f"Failed to run {command}")
-    return False
-
-
-def CheckoutCrubit(commit, dir):
-    """Checkout the Crubit repo at a certain git commit in dir. Any local
-    modifications in dir will be lost."""
-
-    print('Checking out crubit repo %s into %s' % (commit, dir))
-
-    # Try updating the current repo if it exists and has no local diff.
-    if os.path.isdir(dir):
-        os.chdir(dir)
-        # git diff-index --quiet returns success when there is no diff.
-        # Also check that the first commit is reachable.
-        if (RunCommand(['git', 'diff-index', '--quiet', 'HEAD'],
-                       fail_hard=False)
-                and RunCommand(['git', 'fetch'], fail_hard=False)
-                and RunCommand(['git', 'checkout', commit], fail_hard=False)):
-            return
-
-        # If we can't use the current repo, delete it.
-        os.chdir(CHROMIUM_DIR)  # Can't remove dir if we're in it.
-        print('Removing %s.' % dir)
-        RmTree(dir)
-
-    clone_cmd = ['git', 'clone', 'https://github.com/google/crubit.git', dir]
-
-    if RunCommand(clone_cmd, fail_hard=False):
-        os.chdir(dir)
-        if RunCommand(['git', 'checkout', commit], fail_hard=False):
-            return
-
-    print('CheckoutCrubit failed.')
-    sys.exit(1)
-
-
-def BuildCrubit():
-    # TODO(crbug.com/40229251): Use locally built Rust instead of having
-    # Bazel always download the whole Rust toolchain from the internet.
-
-    # This environment variable is consumed by crubit/bazel/llvm.bzl and will
-    # configure Crubit's build to include and link against LLVM+Clang headers
-    # and libraries built when building Chromium toolchain.  (Instead of
-    # downloading LLVM+Clang and building it during Crubit build.)
-    env = {"LLVM_INSTALL_PATH": LLVM_BOOTSTRAP_INSTALL_DIR}
-
-    # Use the compiler and linker from `LLVM_BUILD_DIR`.
-    #
-    # Note that we use `bin/clang` from `LLVM_BUILD_DIR`, but depend on headers
-    # and libraries from `LLVM_BOOTSTRAP_INSTALL_DIR`.  The former helps ensure
-    # that we use the same compiler as the final one used elsewhere in Chromium.
-    # The latter is needed, because the headers+libraries are not available
-    # anywhere else.
-    clang_path = os.path.join(LLVM_BUILD_DIR, "bin", "clang")
-    env["CXX"] = f"{clang_path}++"
-    env["LD"] = f"{clang_path}++"
-    # CC is set via `--repo_env` rather than via `env` to ensure that we
-    # override the defaults from `crubit/.bazelrc`.
-    extra_args = [
-        "--repo_env=CC=",  # Unset/ignore the value set via crubit/.bazelrc
-        f"--repo_env=CC={clang_path}",
+    configure_cmd = [
+        'cmake',
+        '-B',
+        'out',
+        '-GNinja',
+        # Because Crubit is built with C++20.
+        '-DCMAKE_CXX_STANDARD=20',
+        f'-DCMAKE_INSTALL_PREFIX={ABSL_INSTALL_DIR}',
+        '-DABSL_PROPAGATE_CXX_STD=ON',
+        '-DABSL_BUILD_TESTING=OFF',
+        '-DABSL_USE_GOOGLETEST_HEAD=OFF',
+        # LLVM is built with static CRT. Make Abseil match it.
+        '-DABSL_MSVC_STATIC_RUNTIME=ON',
     ]
+    if not debug:
+        configure_cmd.append('-DCMAKE_BUILD_TYPE=Release')
 
-    if sys.platform.startswith('linux'):
-        # Include and link against the C++ stdlib from the sysroot.
-        sysroot = DownloadDebianSysroot('amd64')
-        sysroot_flag = (f'--sysroot={sysroot}' if sysroot else '')
-        env["BAZEL_CXXOPTS"] = sysroot_flag
-        env["BAZEL_LINKOPTS"] = f"{sysroot_flag}:-static-libstdc++"
-        env["BAZEL_LINKLIBS"] = f"-lm"
+    RunCommand(configure_cmd, setenv=True, env=env)
+    build_cmd = ['cmake', '--build', 'out', '--target', 'all']
+    RunCommand(build_cmd, setenv=True, env=env)
+    install_cmd = ['cmake', '--install', 'out']
+    RunCommand(install_cmd, setenv=True, env=env)
 
-    # Run bazel build ...
-    args = [
-        BazelExe(), "build", "rs_bindings_from_cc:rs_bindings_from_cc_impl"
-    ]
-    RunCommand(args + extra_args, env=env, cwd=CRUBIT_SRC_DIR)
+    os.chdir(CHROMIUM_DIR)
 
 
-def InstallCrubit(install_dir):
-    assert os.path.isdir(install_dir)
+def BuildCrubit(env, debug):
+    os.chdir(CRUBIT_SRC_DIR)
 
-    print('Installing crubit binaries to %s' % install_dir)
+    CRUBIT_BINS = ['rs_bindings_from_cc']
 
-    BAZEL_BIN_DIR = os.path.join(CRUBIT_SRC_DIR, "bazel-bin")
-    SOURCE_PATH = os.path.join(BAZEL_BIN_DIR, "rs_bindings_from_cc",
-                               "rs_bindings_from_cc_impl")
-    TARGET_PATH = os.path.join(install_dir, "rs_bindings_from_cc")
-    shutil.copyfile(SOURCE_PATH, TARGET_PATH)
+    build_cmd = ['cargo', 'build']
+    for bin in CRUBIT_BINS:
+        build_cmd += ['--bin', bin]
+    if not debug:
+        build_cmd.append('--release')
+    RunCommand(build_cmd, setenv=True, env=env)
 
-    # Change from r-xr-xr-x to rwxrwxr-x, so that future copies will work fine.
-    os.chmod(TARGET_PATH,
-             stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH | stat.S_IXOTH)
+    print(f'Installing Crubit to {RUST_TOOLCHAIN_OUT_DIR} ...')
+    target_dir = os.path.join(CRUBIT_SRC_DIR, 'target',
+                              'debug' if debug else 'release')
+    for bin in CRUBIT_BINS:
+        bin = bin + EXE
+        shutil.copy(os.path.join(target_dir, bin),
+                    os.path.join(RUST_TOOLCHAIN_OUT_DIR, 'bin', bin))
 
+    support_build_dir = os.path.join(CRUBIT_SRC_DIR, 'support')
+    support_out_dir = os.path.join(RUST_TOOLCHAIN_OUT_DIR, 'lib', 'crubit')
+    if os.path.exists(support_out_dir):
+        RmTree(support_out_dir)
+    shutil.copytree(support_build_dir, support_out_dir)
 
-def CleanBazel():
-    RunCommand([BazelExe(), "clean", "--expunge"], cwd=CRUBIT_SRC_DIR)
-
-
-def ShutdownBazel():
-    RunCommand([BazelExe(), "shutdown"], cwd=CRUBIT_SRC_DIR)
-
-
-def WritableDir(d):
-    """ Utility function to use as `argparse` `type` to verify that the argument
-    is a writeable dir (and resolve it as an absolute path).  """
-
-    try:
-        real_d = os.path.realpath(d)
-    except Exception as e:
-        raise ArgumentTypeError(f"realpath failed: {e}")
-    if not os.path.isdir(real_d):
-        raise ArgumentTypeError(f"Not a directory: {d}")
-    if not os.access(real_d, os.W_OK):
-        raise ArgumentTypeError(f"Cannot write to: {d}")
-    return real_d
+    os.chdir(CHROMIUM_DIR)
 
 
 def main():
     parser = argparse.ArgumentParser(
         description='Build and package Crubit tools')
-    parser.add_argument('-v',
-                        '--verbose',
-                        action='count',
-                        help='run subcommands with verbosity')
-    parser.add_argument(
-        '--install-to',
-        type=WritableDir,
-        help='skip Crubit git checkout. Useful for trying local changes')
-    parser.add_argument(
-        '--skip-clean',
-        action='store_true',
-        help='skip cleanup. Useful for retrying/rebuilding local changes')
     parser.add_argument(
         '--skip-checkout',
         action='store_true',
-        help='skip Crubit git checkout. Useful for trying local changes')
+        help=('skip checking out source code. Useful for trying local'
+              'changes'))
+    parser.add_argument('--debug',
+                        action='store_true',
+                        help=('build Crubit in debug mode'))
     args, rest = parser.parse_known_args()
+    assert (not rest)
 
     if not args.skip_checkout:
-        CheckoutCrubit(CRUBIT_REVISION, CRUBIT_SRC_DIR)
+        CheckoutGitRepo("absl", ABSL_GIT, ABSL_REVISION, ABSL_SRC_DIR)
+        CheckoutGitRepo("crubit", CRUBIT_GIT, CRUBIT_REVISION, CRUBIT_SRC_DIR)
+    if sys.platform.startswith('linux'):
+        arch = 'arm64' if platform.machine() == 'aarch64' else 'amd64'
+        sysroot = DownloadDebianSysroot(arch, args.skip_checkout)
 
-    try:
-        if not args.skip_clean:
-            CleanBazel()
+    llvm_bin_dir = os.path.join(RUST_HOST_LLVM_INSTALL_DIR, 'bin')
+    rust_bin_dir = os.path.join(RUST_TOOLCHAIN_OUT_DIR, 'bin')
 
-        BuildCrubit()
+    AddCMakeToPath()
 
-        if args.install_to:
-            InstallCrubit(args.install_to)
-    finally:
-        ShutdownBazel()
+    env = os.environ
+
+    path_trailing_sep = os.pathsep if env['PATH'] else ''
+    env['PATH'] = (f'{llvm_bin_dir}{os.pathsep}'
+                   f'{rust_bin_dir}{path_trailing_sep}'
+                   f'{env["PATH"]}')
+
+    if sys.platform == 'win32':
+        # CMake on Windows doesn't like depot_tools's ninja.bat wrapper.
+        ninja_dir = os.path.join(THIRD_PARTY_DIR, 'ninja')
+        env['PATH'] = f'{ninja_dir}{os.pathsep}{env["PATH"]}'
+
+    env['CXXFLAGS'] = ''
+    env['RUSTFLAGS'] = ''
+
+    if sys.platform == 'win32':
+        env['CC'] = 'clang-cl'
+        env['CXX'] = 'clang-cl'
+    else:
+        env['CC'] = 'clang'
+        env['CXX'] = 'clang++'
+
+    # We link with lld via clang, except on windows where we point to lld-link
+    # directly.
+    if sys.platform == 'win32':
+        env['RUSTFLAGS'] += f' -Clinker=lld-link'
+    else:
+        env['RUSTFLAGS'] += f' -Clinker=clang'
+        env['RUSTFLAGS'] += f' -Clink-arg=-fuse-ld=lld'
+
+    if sys.platform == 'win32':
+        # LLVM is built with static CRT. Make Rust match it.
+        env['RUSTFLAGS'] += f' -Ctarget-feature=+crt-static'
+
+    if sys.platform.startswith('linux'):
+        sysroot_flag = (f'--sysroot={sysroot}' if sysroot else '')
+        env['CXXFLAGS'] += f" {sysroot_flag}"
+        env['RUSTFLAGS'] += f" -Clink-arg={sysroot_flag}"
+
+    if sys.platform == 'darwin':
+        import subprocess
+        # The system/xcode compiler would find system SDK correctly, but
+        # the Clang we've built does not. See
+        # https://github.com/llvm/llvm-project/issues/45225
+        sdk_path = subprocess.check_output(['xcrun', '--show-sdk-path'],
+                                           text=True).rstrip()
+        env['CXXFLAGS'] += f' -isysroot {sdk_path}'
+        env['RUSTFLAGS'] += f' -Clink-arg=-isysroot -Clink-arg={sdk_path}'
+
+    if sys.platform == 'win32':
+        # LLVM depends on Zlib.
+        zlib_dir = AddZlibToPath(dry_run=args.skip_checkout)
+        env['CXXFLAGS'] += f' /I{zlib_dir}'
+        env['RUSTFLAGS'] += f' -Clink-arg=/LIBPATH:{zlib_dir}'
+        # Prevent deprecation warnings.
+        env['CXXFLAGS'] += ' /D_CRT_SECURE_NO_DEPRECATE'
+
+    BuildAbsl(env, args.debug)
+
+    env['ABSL_INCLUDE_PATH'] = os.path.join(ABSL_INSTALL_DIR, 'include')
+    env['ABSL_LIB_STATIC_PATH'] = os.path.join(ABSL_INSTALL_DIR, 'lib')
+    env['CLANG_INCLUDE_PATH'] = os.path.join(RUST_HOST_LLVM_INSTALL_DIR,
+                                             'include')
+    env['CLANG_LIB_STATIC_PATH'] = os.path.join(RUST_HOST_LLVM_INSTALL_DIR,
+                                                'lib')
+
+    BuildCrubit(env, args.debug)
 
     return 0
 
diff --git a/tools/rust/package_rust.py b/tools/rust/package_rust.py
index b8a8da54..6eb8b84 100755
--- a/tools/rust/package_rust.py
+++ b/tools/rust/package_rust.py
@@ -26,25 +26,6 @@
 RUST_TOOLCHAIN_PACKAGE_NAME = f'rust-toolchain-{PACKAGE_VERSION}.tar.xz'
 
 
-# TODO(crbug.com/40226863): Use this function (after integrating Crubit
-# into Chromium; this work is on hold right now - see also
-# https://crbug.com/1510943#c2).
-def BuildCrubit():
-    with open(os.path.join(THIRD_PARTY_DIR, BUILDLOG_NAME),
-              'w',
-              encoding='utf-8') as log:
-        build_cmd = [sys.executable, os.path.join(THIS_DIR, 'build_crubit.py')]
-        # TODO(crbug.com/40226863): Default to `fail_hard` once we
-        # actually depend on the build step (i.e. once we start packaging
-        # Crubit).
-        TeeCmd(build_cmd, log, fail_hard=False)
-
-    # TODO(crbug.com/40226863): Rename this function to
-    # BuildAndInstallCrubit and actually install Crubit binaries into
-    # RUST_TOOLCHAIN_OUT_DIR/bin (once we gain confidence that Crubit continues
-    # to build uneventfully on the bots).
-
-
 def main():
     parser = argparse.ArgumentParser(description='build and package Rust')
     parser.add_argument('--upload',
@@ -90,6 +71,12 @@
         build_cmd = [sys.executable, os.path.join(THIS_DIR, 'build_vet.py')]
         TeeCmd(build_cmd, log)
 
+        # Build Crubit.
+        build_cmd = [sys.executable, os.path.join(THIS_DIR, 'build_crubit.py')]
+        # TODO: crbug.com/40226863 - Remove `fail_hard=False` once we can depend
+        # on the OSS Crubit build staying green with latest Rust and Clang.
+        TeeCmd(build_cmd, log, fail_hard=False)
+
     # Strip everything in bin/ to reduce the package size.
     bin_dir_path = os.path.join(RUST_TOOLCHAIN_OUT_DIR, 'bin')
     if sys.platform != 'win32' and os.path.exists(bin_dir_path):
diff --git a/tools/rust/update_rust.py b/tools/rust/update_rust.py
index 64b9e8ec..cb78d2dc 100755
--- a/tools/rust/update_rust.py
+++ b/tools/rust/update_rust.py
@@ -32,18 +32,16 @@
 # These fields are written by //tools/clang/scripts/upload_revision.py, and
 # should not be changed manually.
 RUST_REVISION = '009e73825af0e59ad4fc603562e038b3dbd6593a'
-RUST_SUB_REVISION = 22
+RUST_SUB_REVISION = 23
 
-# Trunk on 2022-10-15.
+# The revision of Crubit to use from https://github.com/google/crubit
 #
-# The revision specified below should typically be the same as the
-# `crubit_revision` specified in the //DEPS file.  More details and roll
-# instructions can be found in tools/rust/README.md.
-#
-# TODO(danakj): This should be included in --print-rust-revision when we want
-# code to depend on using crubit rs_to_cc_bindings.
-CRUBIT_REVISION = 'f5cbdf4b54b0e6b9f63a4464a2c901c82e0f0209'
-CRUBIT_SUB_REVISION = 1
+# If changing the CRUBIT_REVISION but not the RUST_REVISION, bump the
+# RUST_SUB_REVISION to generate a unique package name.
+CRUBIT_REVISION = 'fa6caca0969c9d1dec584186eb85ebdd0fe02955'
+# The Absl revision used for building Crubit. Can be bumped to the latest when
+# rolling Crubit. There's no reason to change this if not rolling Crubit.
+ABSL_REVISION = 'ba5fd0979b4e74bd4d1b8da1d84347173bd9f17f'
 
 # Hash of src/stage0.json, which itself contains the stage0 toolchain hashes.
 # We trust the Rust build system checks, but to ensure it is not tampered with
diff --git a/tools/search_engine_choice/OWNERS b/tools/search_engine_choice/OWNERS
index a8ff91d..c7aa42b 100644
--- a/tools/search_engine_choice/OWNERS
+++ b/tools/search_engine_choice/OWNERS
@@ -1 +1 @@
-file://components/search_engines/search_engine_choice/OWNERS
+file://components/search_engines/search_engine_choice/COMPLIANCE_OWNERS
diff --git a/ui/accessibility/BUILD.gn b/ui/accessibility/BUILD.gn
index d1ab3de8..451b022d 100644
--- a/ui/accessibility/BUILD.gn
+++ b/ui/accessibility/BUILD.gn
@@ -72,6 +72,8 @@
     "ax_event.h",
     "ax_event_intent.cc",
     "ax_event_intent.h",
+    "ax_location_and_scroll_updates.cc",
+    "ax_location_and_scroll_updates.h",
     "ax_mode.cc",
     "ax_mode.h",
     "ax_mode_histogram_logger.cc",
@@ -317,7 +319,7 @@
     "mojom/ax_action_data_mojom_traits_unittest.cc",
     "mojom/ax_event_intent_mojom_traits_unittest.cc",
     "mojom/ax_event_mojom_traits_unittest.cc",
-    "mojom/ax_location_changes_mojom_traits_unittest.cc",
+    "mojom/ax_location_and_scroll_updates_mojom_traits_unittest.cc",
     "mojom/ax_mode_mojom_traits_unittest.cc",
     "mojom/ax_node_data_mojom_traits_unittest.cc",
     "mojom/ax_relative_bounds_mojom_traits_unittest.cc",
diff --git a/ui/accessibility/ax_location_and_scroll_updates.cc b/ui/accessibility/ax_location_and_scroll_updates.cc
new file mode 100644
index 0000000..1d0f958
--- /dev/null
+++ b/ui/accessibility/ax_location_and_scroll_updates.cc
@@ -0,0 +1,35 @@
+// 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 "ui/accessibility/ax_location_and_scroll_updates.h"
+
+#include "ui/accessibility/ax_relative_bounds.h"
+
+namespace ui {
+AXLocationChange::AXLocationChange(int id, AXRelativeBounds& bounds)
+    : id(id), new_location(bounds) {}
+AXLocationChange::AXLocationChange(AXLocationChange&& other) = default;
+AXLocationChange& AXLocationChange::operator=(AXLocationChange&& other) =
+    default;
+AXLocationChange::AXLocationChange(const AXLocationChange& other) = default;
+AXLocationChange& AXLocationChange::operator=(const AXLocationChange& other) =
+    default;
+AXLocationChange::~AXLocationChange() = default;
+
+AXScrollChange::AXScrollChange(int id, int x, int y)
+    : id(id), scroll_x(x), scroll_y(y) {}
+AXScrollChange::AXScrollChange(AXScrollChange&& other) = default;
+AXScrollChange& AXScrollChange::operator=(AXScrollChange&& other) = default;
+AXScrollChange::AXScrollChange(const AXScrollChange& other) = default;
+AXScrollChange& AXScrollChange::operator=(const AXScrollChange& other) =
+    default;
+AXScrollChange::~AXScrollChange() = default;
+
+AXLocationAndScrollUpdates::AXLocationAndScrollUpdates() = default;
+AXLocationAndScrollUpdates::AXLocationAndScrollUpdates(
+    AXLocationAndScrollUpdates&& other) = default;
+AXLocationAndScrollUpdates& AXLocationAndScrollUpdates::operator=(
+    AXLocationAndScrollUpdates&& other) = default;
+AXLocationAndScrollUpdates::~AXLocationAndScrollUpdates() = default;
+}  // namespace ui
diff --git a/ui/accessibility/ax_location_and_scroll_updates.h b/ui/accessibility/ax_location_and_scroll_updates.h
new file mode 100644
index 0000000..d402cd8
--- /dev/null
+++ b/ui/accessibility/ax_location_and_scroll_updates.h
@@ -0,0 +1,64 @@
+// 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 UI_ACCESSIBILITY_AX_LOCATION_AND_SCROLL_UPDATES_H_
+#define UI_ACCESSIBILITY_AX_LOCATION_AND_SCROLL_UPDATES_H_
+
+#include "ui/accessibility/ax_base_export.h"
+#include "ui/accessibility/ax_relative_bounds.h"
+namespace ui {
+struct AX_BASE_EXPORT AXLocationChange {
+ public:
+  AXLocationChange() = default;
+  AXLocationChange(int id, AXRelativeBounds& bounds);
+
+  AXLocationChange(const AXLocationChange& other);
+  AXLocationChange& operator=(const AXLocationChange& other);
+
+  AXLocationChange(AXLocationChange&& other);
+  AXLocationChange& operator=(AXLocationChange&& other);
+
+  ~AXLocationChange();
+
+  int id;
+  AXRelativeBounds new_location;
+};
+
+struct AX_BASE_EXPORT AXScrollChange {
+ public:
+  AXScrollChange() = default;
+  AXScrollChange(int id, int x, int y);
+
+  AXScrollChange(const AXScrollChange& other);
+  AXScrollChange& operator=(const AXScrollChange& other);
+
+  AXScrollChange(AXScrollChange&& other);
+  AXScrollChange& operator=(AXScrollChange&& other);
+
+  ~AXScrollChange();
+
+  int id;
+  int scroll_x;
+  int scroll_y;
+};
+
+struct AX_BASE_EXPORT AXLocationAndScrollUpdates {
+ public:
+  AXLocationAndScrollUpdates();
+
+  AXLocationAndScrollUpdates(const AXLocationAndScrollUpdates& other) = delete;
+  AXLocationAndScrollUpdates& operator=(
+      const AXLocationAndScrollUpdates& other) = delete;
+
+  AXLocationAndScrollUpdates(AXLocationAndScrollUpdates&& other);
+  AXLocationAndScrollUpdates& operator=(AXLocationAndScrollUpdates&& other);
+
+  ~AXLocationAndScrollUpdates();
+
+  std::vector<AXLocationChange> location_changes;
+  std::vector<AXScrollChange> scroll_changes;
+};
+}  // namespace ui
+
+#endif  // UI_ACCESSIBILITY_AX_LOCATION_AND_SCROLL_UPDATES_H_
diff --git a/ui/accessibility/ax_node.cc b/ui/accessibility/ax_node.cc
index fe9364b..ff1a2f6 100644
--- a/ui/accessibility/ax_node.cc
+++ b/ui/accessibility/ax_node.cc
@@ -781,6 +781,16 @@
   }
 }
 
+void AXNode::SetScrollInfo(const int& scroll_x, const int& scroll_y) {
+  data_.AddIntAttribute(ax::mojom::IntAttribute::kScrollX, scroll_x);
+  data_.AddIntAttribute(ax::mojom::IntAttribute::kScrollY, scroll_y);
+}
+
+void AXNode::GetScrollInfo(int* scroll_x, int* scroll_y) const {
+  *scroll_x = GetIntAttribute(ax::mojom::IntAttribute::kScrollX);
+  *scroll_y = GetIntAttribute(ax::mojom::IntAttribute::kScrollY);
+}
+
 void AXNode::SetIndexInParent(size_t index_in_parent) {
   index_in_parent_ = index_in_parent;
 }
diff --git a/ui/accessibility/ax_node.h b/ui/accessibility/ax_node.h
index 5495f6e1..fd61512 100644
--- a/ui/accessibility/ax_node.h
+++ b/ui/accessibility/ax_node.h
@@ -270,6 +270,12 @@
                    const gfx::RectF& location,
                    gfx::Transform* transform);
 
+  // Update this node's scroll x and y. This is separate from |SetData| just
+  // because changing only the scroll info is common and should be more
+  // efficient than re-copying all of the data.
+  void SetScrollInfo(const int& scroll_x, const int& scroll_y);
+  void GetScrollInfo(int* scroll_x, int* scroll_y) const;
+
   // Set the index in parent, for example if siblings were inserted or deleted.
   void SetIndexInParent(size_t index_in_parent);
 
diff --git a/ui/accessibility/ax_updates_and_events.cc b/ui/accessibility/ax_updates_and_events.cc
index 7c91df9..95c876b 100644
--- a/ui/accessibility/ax_updates_and_events.cc
+++ b/ui/accessibility/ax_updates_and_events.cc
@@ -16,11 +16,4 @@
 
 AXUpdatesAndEvents::~AXUpdatesAndEvents() = default;
 
-AXLocationChanges::AXLocationChanges()
-    : id(-1), ax_tree_id(AXTreeIDUnknown()) {}
-
-AXLocationChanges::AXLocationChanges(const AXLocationChanges& other) = default;
-
-AXLocationChanges::~AXLocationChanges() {}
-
 }  // namespace ui
diff --git a/ui/accessibility/ax_updates_and_events.h b/ui/accessibility/ax_updates_and_events.h
index 072a81a3..fe6c02887 100644
--- a/ui/accessibility/ax_updates_and_events.h
+++ b/ui/accessibility/ax_updates_and_events.h
@@ -39,18 +39,6 @@
   std::vector<AXEvent> events;
 };
 
-struct AX_BASE_EXPORT AXLocationChanges {
- public:
-  AXLocationChanges();
-  AXLocationChanges(
-      const AXLocationChanges& other);
-  ~AXLocationChanges();
-
-  int id;
-  AXTreeID ax_tree_id;
-  AXRelativeBounds new_location;
-};
-
 }  // namespace ui
 
 #endif  // UI_ACCESSIBILITY_AX_UPDATES_AND_EVENTS_H_
diff --git a/ui/accessibility/mojom/BUILD.gn b/ui/accessibility/mojom/BUILD.gn
index 3cbe17a8..8d305e8 100644
--- a/ui/accessibility/mojom/BUILD.gn
+++ b/ui/accessibility/mojom/BUILD.gn
@@ -10,7 +10,7 @@
     "ax_action_data.mojom",
     "ax_event.mojom",
     "ax_event_intent.mojom",
-    "ax_location_changes.mojom",
+    "ax_location_and_scroll_updates.mojom",
     "ax_mode.mojom",
     "ax_node_data.mojom",
     "ax_relative_bounds.mojom",
@@ -88,12 +88,26 @@
     {
       types = [
         {
-          mojom = "ax.mojom.AXLocationChanges"
-          cpp = "::ui::AXLocationChanges"
+          mojom = "ax.mojom.AXLocationChange"
+          cpp = "::ui::AXLocationChange"
+        },
+        {
+          mojom = "ax.mojom.AXScrollChange"
+          cpp = "::ui::AXScrollChange"
+        },
+        {
+          mojom = "ax.mojom.AXLocationAndScrollUpdates"
+          cpp = "::ui::AXLocationAndScrollUpdates"
+
+          # This is necessary to avoid expensive copies after this data is
+          # created and passed around. Subsequent methods of the data can
+          # choose to apply const if appropriate. We avoid use move_only here
+          # because it requires the caller copy when passing to the mojo pipe.
+          non_const_ref = true
         },
       ]
-      traits_sources = [ "ax_location_changes_mojom_traits.cc" ]
-      traits_headers = [ "ax_location_changes_mojom_traits.h" ]
+      traits_sources = [ "ax_location_and_scroll_updates_mojom_traits.cc" ]
+      traits_headers = [ "ax_location_and_scroll_updates_mojom_traits.h" ]
       traits_public_deps = [ "//ui/accessibility:ax_base" ]
     },
     {
diff --git a/ui/accessibility/mojom/ax_location_and_scroll_updates.mojom b/ui/accessibility/mojom/ax_location_and_scroll_updates.mojom
new file mode 100644
index 0000000..ef1b7dc2
--- /dev/null
+++ b/ui/accessibility/mojom/ax_location_and_scroll_updates.mojom
@@ -0,0 +1,30 @@
+// 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.
+
+module ax.mojom;
+
+import "ui/accessibility/mojom/ax_relative_bounds.mojom";
+import "ui/accessibility/mojom/ax_tree_id.mojom";
+
+struct AXLocationChange {
+  // ID of the object whose location is changing.
+  int32 id;
+
+  // The object's new location info.
+  ax.mojom.AXRelativeBounds new_location;
+};
+
+struct AXScrollChange {
+  // ID of the object whose scroll position is changing.
+  int32 id;
+
+  // The object's new scroll info
+  int32 scroll_x;
+  int32 scroll_y;
+};
+
+struct AXLocationAndScrollUpdates {
+  array<AXLocationChange> location_changes;
+  array<AXScrollChange> scroll_changes;
+};
diff --git a/ui/accessibility/mojom/ax_location_and_scroll_updates_mojom_traits.cc b/ui/accessibility/mojom/ax_location_and_scroll_updates_mojom_traits.cc
new file mode 100644
index 0000000..1c97f29a
--- /dev/null
+++ b/ui/accessibility/mojom/ax_location_and_scroll_updates_mojom_traits.cc
@@ -0,0 +1,46 @@
+// 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 "ui/accessibility/mojom/ax_location_and_scroll_updates_mojom_traits.h"
+
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
+#include "ui/accessibility/mojom/ax_location_and_scroll_updates.mojom-shared.h"
+#include "ui/accessibility/mojom/ax_relative_bounds_mojom_traits.h"
+#include "ui/accessibility/mojom/ax_tree_update_mojom_traits.h"
+
+namespace mojo {
+
+// static
+bool StructTraits<ax::mojom::AXLocationChangeDataView, ui::AXLocationChange>::
+    Read(ax::mojom::AXLocationChangeDataView data, ui::AXLocationChange* out) {
+  out->id = data.id();
+  if (!data.ReadNewLocation(&out->new_location)) {
+    return false;
+  }
+  return true;
+}
+
+bool StructTraits<ax::mojom::AXScrollChangeDataView, ui::AXScrollChange>::Read(
+    ax::mojom::AXScrollChangeDataView data,
+    ui::AXScrollChange* out) {
+  out->id = data.id();
+  out->scroll_x = data.scroll_x();
+  out->scroll_y = data.scroll_y();
+  return true;
+}
+
+bool StructTraits<ax::mojom::AXLocationAndScrollUpdatesDataView,
+                  ui::AXLocationAndScrollUpdates>::
+    Read(ax::mojom::AXLocationAndScrollUpdatesDataView data,
+         ui::AXLocationAndScrollUpdates* out) {
+  if (!data.ReadLocationChanges(&out->location_changes)) {
+    return false;
+  }
+  if (!data.ReadScrollChanges(&out->scroll_changes)) {
+    return false;
+  }
+  return true;
+}
+
+}  // namespace mojo
diff --git a/ui/accessibility/mojom/ax_location_and_scroll_updates_mojom_traits.h b/ui/accessibility/mojom/ax_location_and_scroll_updates_mojom_traits.h
new file mode 100644
index 0000000..cef2ee5
--- /dev/null
+++ b/ui/accessibility/mojom/ax_location_and_scroll_updates_mojom_traits.h
@@ -0,0 +1,51 @@
+// 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 UI_ACCESSIBILITY_MOJOM_AX_LOCATION_AND_SCROLL_UPDATES_MOJOM_TRAITS_H_
+#define UI_ACCESSIBILITY_MOJOM_AX_LOCATION_AND_SCROLL_UPDATES_MOJOM_TRAITS_H_
+
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
+#include "ui/accessibility/ax_updates_and_events.h"
+#include "ui/accessibility/mojom/ax_location_and_scroll_updates.mojom-shared.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<ax::mojom::AXLocationChangeDataView, ui::AXLocationChange> {
+  static int32_t id(const ui::AXLocationChange& p) { return p.id; }
+  static const ui::AXRelativeBounds& new_location(
+      const ui::AXLocationChange& p) {
+    return p.new_location;
+  }
+  static bool Read(ax::mojom::AXLocationChangeDataView data,
+                   ui::AXLocationChange* out);
+};
+
+template <>
+struct StructTraits<ax::mojom::AXScrollChangeDataView, ui::AXScrollChange> {
+  static int32_t id(const ui::AXScrollChange& p) { return p.id; }
+  static int32_t scroll_x(const ui::AXScrollChange& p) { return p.scroll_x; }
+  static int32_t scroll_y(const ui::AXScrollChange& p) { return p.scroll_y; }
+  static bool Read(ax::mojom::AXScrollChangeDataView data,
+                   ui::AXScrollChange* out);
+};
+
+template <>
+struct StructTraits<ax::mojom::AXLocationAndScrollUpdatesDataView,
+                    ui::AXLocationAndScrollUpdates> {
+  static const std::vector<ui::AXLocationChange>& location_changes(
+      const ui::AXLocationAndScrollUpdates& p) {
+    return p.location_changes;
+  }
+  static const std::vector<ui::AXScrollChange>& scroll_changes(
+      const ui::AXLocationAndScrollUpdates& p) {
+    return p.scroll_changes;
+  }
+  static bool Read(ax::mojom::AXLocationAndScrollUpdatesDataView data,
+                   ui::AXLocationAndScrollUpdates* out);
+};
+
+}  // namespace mojo
+
+#endif  // UI_ACCESSIBILITY_MOJOM_AX_LOCATION_AND_SCROLL_UPDATES_MOJOM_TRAITS_H_
diff --git a/ui/accessibility/mojom/ax_location_and_scroll_updates_mojom_traits_unittest.cc b/ui/accessibility/mojom/ax_location_and_scroll_updates_mojom_traits_unittest.cc
new file mode 100644
index 0000000..e17dce2
--- /dev/null
+++ b/ui/accessibility/mojom/ax_location_and_scroll_updates_mojom_traits_unittest.cc
@@ -0,0 +1,44 @@
+// 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 "ui/accessibility/mojom/ax_location_and_scroll_updates_mojom_traits.h"
+
+#include "mojo/public/cpp/test_support/test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
+#include "ui/accessibility/ax_updates_and_events.h"
+#include "ui/accessibility/mojom/ax_location_and_scroll_updates.mojom.h"
+
+using mojo::test::SerializeAndDeserialize;
+
+TEST(AXLocationAndScrollUpdatesMojomTraitsTest, LocationChangeRoundTrip) {
+  ui::AXRelativeBounds input_bounds;
+  input_bounds.offset_container_id = 111;
+  input_bounds.bounds = gfx::RectF(1, 2, 3, 4);
+  input_bounds.transform = std::make_unique<gfx::Transform>();
+  input_bounds.transform->Scale(1.0, 2.0);
+  ui::AXLocationChange input(1, input_bounds);
+
+  ui::AXLocationChange output;
+  EXPECT_TRUE(
+      SerializeAndDeserialize<ax::mojom::AXLocationChange>(input, output));
+  EXPECT_EQ(1, output.id);
+  EXPECT_EQ(111, output.new_location.offset_container_id);
+  EXPECT_EQ(1, output.new_location.bounds.x());
+  EXPECT_EQ(2, output.new_location.bounds.y());
+  EXPECT_EQ(3, output.new_location.bounds.width());
+  EXPECT_EQ(4, output.new_location.bounds.height());
+  EXPECT_FALSE(output.new_location.transform->IsIdentity());
+}
+
+TEST(AXLocationAndScrollUpdatesMojomTraitsTest, ScrollChangeRoundTrip) {
+  ui::AXScrollChange input(7, 15, 20);
+
+  ui::AXScrollChange output;
+  EXPECT_TRUE(
+      SerializeAndDeserialize<ax::mojom::AXScrollChange>(input, output));
+  EXPECT_EQ(7, output.id);
+  EXPECT_EQ(15, output.scroll_x);
+  EXPECT_EQ(20, output.scroll_y);
+}
diff --git a/ui/accessibility/mojom/ax_location_changes.mojom b/ui/accessibility/mojom/ax_location_changes.mojom
deleted file mode 100644
index c63406b..0000000
--- a/ui/accessibility/mojom/ax_location_changes.mojom
+++ /dev/null
@@ -1,14 +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.
-
-module ax.mojom;
-
-import "ui/accessibility/mojom/ax_relative_bounds.mojom";
-import "ui/accessibility/mojom/ax_tree_id.mojom";
-
-struct AXLocationChanges {
-  int32 id;
-  ax.mojom.AXTreeID ax_tree_id;
-  ax.mojom.AXRelativeBounds new_location;
-};
\ No newline at end of file
diff --git a/ui/accessibility/mojom/ax_location_changes_mojom_traits.cc b/ui/accessibility/mojom/ax_location_changes_mojom_traits.cc
deleted file mode 100644
index 17f61fb..0000000
--- a/ui/accessibility/mojom/ax_location_changes_mojom_traits.cc
+++ /dev/null
@@ -1,26 +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 "ui/accessibility/mojom/ax_location_changes_mojom_traits.h"
-
-#include "ui/accessibility/mojom/ax_relative_bounds_mojom_traits.h"
-#include "ui/accessibility/mojom/ax_tree_update_mojom_traits.h"
-
-namespace mojo {
-
-// static
-bool StructTraits<ax::mojom::AXLocationChangesDataView, ui::AXLocationChanges>::
-    Read(ax::mojom::AXLocationChangesDataView data,
-         ui::AXLocationChanges* out) {
-  out->id = data.id();
-  if (!data.ReadAxTreeId(&out->ax_tree_id)) {
-    return false;
-  }
-  if (!data.ReadNewLocation(&out->new_location)) {
-    return false;
-  }
-  return true;
-}
-
-}  // namespace mojo
diff --git a/ui/accessibility/mojom/ax_location_changes_mojom_traits.h b/ui/accessibility/mojom/ax_location_changes_mojom_traits.h
deleted file mode 100644
index 22428baa..0000000
--- a/ui/accessibility/mojom/ax_location_changes_mojom_traits.h
+++ /dev/null
@@ -1,30 +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 UI_ACCESSIBILITY_MOJOM_AX_LOCATION_CHANGES_MOJOM_TRAITS_H_
-#define UI_ACCESSIBILITY_MOJOM_AX_LOCATION_CHANGES_MOJOM_TRAITS_H_
-
-#include "ui/accessibility/ax_updates_and_events.h"
-#include "ui/accessibility/mojom/ax_location_changes.mojom-shared.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<ax::mojom::AXLocationChangesDataView,
-                    ui::AXLocationChanges> {
-  static int32_t id(const ui::AXLocationChanges& p) { return p.id; }
-  static const ui::AXTreeID& ax_tree_id(const ui::AXLocationChanges& p) {
-    return p.ax_tree_id;
-  }
-  static const ui::AXRelativeBounds& new_location(
-      const ui::AXLocationChanges& p) {
-    return p.new_location;
-  }
-  static bool Read(ax::mojom::AXLocationChangesDataView data,
-                   ui::AXLocationChanges* out);
-};
-
-}  // namespace mojo
-
-#endif  // UI_ACCESSIBILITY_MOJOM_AX_LOCATION_CHANGES_MOJOM_TRAITS_H_
diff --git a/ui/accessibility/mojom/ax_location_changes_mojom_traits_unittest.cc b/ui/accessibility/mojom/ax_location_changes_mojom_traits_unittest.cc
deleted file mode 100644
index 52209b2..0000000
--- a/ui/accessibility/mojom/ax_location_changes_mojom_traits_unittest.cc
+++ /dev/null
@@ -1,38 +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 "ui/accessibility/mojom/ax_location_changes_mojom_traits.h"
-
-#include "mojo/public/cpp/test_support/test_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/accessibility/ax_updates_and_events.h"
-#include "ui/accessibility/mojom/ax_location_changes.mojom.h"
-
-using mojo::test::SerializeAndDeserialize;
-
-TEST(AXLocationChangesMojomTraitsTest, RoundTrip) {
-  ui::AXLocationChanges input;
-  input.id = 1;
-  ui::AXTreeID input_tree_id = ui::AXTreeID::CreateNewAXTreeID();
-  input.ax_tree_id = input_tree_id;
-
-  ui::AXRelativeBounds input_bounds;
-  input_bounds.offset_container_id = 111;
-  input_bounds.bounds = gfx::RectF(1, 2, 3, 4);
-  input_bounds.transform = std::make_unique<gfx::Transform>();
-  input_bounds.transform->Scale(1.0, 2.0);
-  input.new_location = input_bounds;
-
-  ui::AXLocationChanges output;
-  EXPECT_TRUE(
-      SerializeAndDeserialize<ax::mojom::AXLocationChanges>(input, output));
-  EXPECT_EQ(1, output.id);
-  EXPECT_EQ(input_tree_id, output.ax_tree_id);
-  EXPECT_EQ(111, output.new_location.offset_container_id);
-  EXPECT_EQ(1, output.new_location.bounds.x());
-  EXPECT_EQ(2, output.new_location.bounds.y());
-  EXPECT_EQ(3, output.new_location.bounds.width());
-  EXPECT_EQ(4, output.new_location.bounds.height());
-  EXPECT_FALSE(output.new_location.transform->IsIdentity());
-}
diff --git a/ui/accessibility/platform/browser_accessibility_manager.cc b/ui/accessibility/platform/browser_accessibility_manager.cc
index 161902b5..6888e29 100644
--- a/ui/accessibility/platform/browser_accessibility_manager.cc
+++ b/ui/accessibility/platform/browser_accessibility_manager.cc
@@ -647,7 +647,7 @@
 void BrowserAccessibilityManager::FinalizeAccessibilityEvents() {}
 
 void BrowserAccessibilityManager::OnLocationChanges(
-    const std::vector<AXLocationChanges>& changes) {
+    const AXLocationAndScrollUpdates& changes) {
   TRACE_EVENT0("accessibility",
                is_post_load_
                    ? "BrowserAccessibilityManager::OnLocationChanges"
@@ -655,26 +655,59 @@
   SCOPED_UMA_HISTOGRAM_TIMER_MICROS(
       "Accessibility.Performance.BrowserAccessibilityManager::"
       "OnLocationChanges");
-  for (auto& change : changes) {
+  bool can_fire_events = CanFireEvents();
+  for (auto& change : changes.scroll_changes) {
     BrowserAccessibility* obj = GetFromID(change.id);
-    if (!obj)
+    if (!obj) {
       continue;
+    }
+
+    AXNode* node = obj->node();
+    int old_scrollx, old_scrolly;
+    node->GetScrollInfo(&old_scrollx, &old_scrolly);
+    node->SetScrollInfo(change.scroll_x, change.scroll_y);
+
+    if (can_fire_events) {
+      if (change.scroll_x != old_scrollx) {
+        FireGeneratedEvent(
+            ui::AXEventGenerator::Event::SCROLL_HORIZONTAL_POSITION_CHANGED,
+            node);
+      }
+      if (change.scroll_y != old_scrolly) {
+        FireGeneratedEvent(
+            ui::AXEventGenerator::Event::SCROLL_VERTICAL_POSITION_CHANGED,
+            node);
+      }
+    }
+  }
+
+  for (auto& change : changes.location_changes) {
+    BrowserAccessibility* obj = GetFromID(change.id);
+    if (!obj) {
+      continue;
+    }
     AXNode* node = obj->node();
     node->SetLocation(change.new_location.offset_container_id,
                       change.new_location.bounds,
                       change.new_location.transform.get());
   }
+
   // Only send location change events when the page is not in back/forward
   // cache.
-  if (CanFireEvents()) {
-    SendLocationChangeEvents(changes);
+  if (can_fire_events && !changes.location_changes.empty()) {
+    SendLocationChangeEvents(changes.location_changes);
   }
-  if (!location_change_callback_for_testing_.is_null())
+
+  // Only send location change callback when there's actually changed locations.
+  // Required for tests to detect location change that's not scrolling.
+  if (!location_change_callback_for_testing_.is_null() &&
+      !changes.location_changes.empty()) {
     location_change_callback_for_testing_.Run();
+  }
 }
 
 void BrowserAccessibilityManager::SendLocationChangeEvents(
-    const std::vector<AXLocationChanges>& changes) {
+    const std::vector<AXLocationChange>& changes) {
   for (auto& change : changes) {
     BrowserAccessibility* obj = GetFromID(change.id);
     if (obj)
diff --git a/ui/accessibility/platform/browser_accessibility_manager.h b/ui/accessibility/platform/browser_accessibility_manager.h
index 866c11f..54b7c63e 100644
--- a/ui/accessibility/platform/browser_accessibility_manager.h
+++ b/ui/accessibility/platform/browser_accessibility_manager.h
@@ -23,6 +23,7 @@
 #include "cc/base/rtree.h"
 #include "ui/accessibility/ax_action_data.h"
 #include "ui/accessibility/ax_action_handler_registry.h"
+#include "ui/accessibility/ax_location_and_scroll_updates.h"
 #include "ui/accessibility/ax_node.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/accessibility/ax_node_id_forward.h"
@@ -271,7 +272,7 @@
 
   // Called when the renderer process updates the location of accessibility
   // objects. Calls SendLocationChangeEvents(), which can be overridden.
-  void OnLocationChanges(const std::vector<AXLocationChanges>& changes);
+  void OnLocationChanges(const AXLocationAndScrollUpdates& changes);
 
   // Called when a new find in page result is received. We hold on to this
   // information and don't activate it until the user requests it.
@@ -514,7 +515,7 @@
   // their location has changed. This is called by OnLocationChanges
   // after it's updated the internal data structure.
   virtual void SendLocationChangeEvents(
-      const std::vector<AXLocationChanges>& changes);
+      const std::vector<AXLocationChange>& changes);
 
   // Given the data from an atomic update, collect the nodes that need updating
   // assuming that this platform is one where plain text node content is
diff --git a/ui/accessibility/platform/fuchsia/browser_accessibility_manager_fuchsia_unittest.cc b/ui/accessibility/platform/fuchsia/browser_accessibility_manager_fuchsia_unittest.cc
index 16cac0f8..ac7502f 100644
--- a/ui/accessibility/platform/fuchsia/browser_accessibility_manager_fuchsia_unittest.cc
+++ b/ui/accessibility/platform/fuchsia/browser_accessibility_manager_fuchsia_unittest.cc
@@ -288,15 +288,11 @@
   }
 
   // Send location update for node 2.
-  std::vector<AXLocationChanges> changes;
+  AXLocationAndScrollUpdates changes;
   AXRelativeBounds relative_bounds;
   relative_bounds.bounds =
       gfx::RectF(/*x=*/1, /*y=*/2, /*width=*/3, /*height=*/4);
-  AXLocationChanges change;
-  change.id = 2;
-  change.ax_tree_id = tree_id;
-  change.new_location = relative_bounds;
-  changes.push_back(change);
+  changes.location_changes.emplace_back(2, relative_bounds);
   manager_->OnLocationChanges(std::move(changes));
 
   {
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn
index 07dd433c..8451015 100644
--- a/ui/android/BUILD.gn
+++ b/ui/android/BUILD.gn
@@ -106,9 +106,12 @@
   sources = [
     "dummy_screen_android.cc",
     "dummy_screen_android.h",
+    "fake_modal_dialog_manager_bridge.cc",
+    "fake_modal_dialog_manager_bridge.h",
   ]
 
   deps = [
+    ":ui_javatest_jni_headers",
     "//ui/android",
     "//ui/display",
   ]
@@ -554,6 +557,7 @@
     # For androidx.test.espresso.ViewInteraction
     "//third_party/android_deps:espresso_java",
     "//third_party/android_deps:material_design_java",
+    "//third_party/androidx:androidx_activity_activity_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/androidx:androidx_appcompat_appcompat_java",
     "//third_party/androidx:androidx_appcompat_appcompat_resources_java",
@@ -682,6 +686,7 @@
   deps = [
     ":android",
     ":java_enums_srcjar",
+    ":test_support",
     ":ui_java",
     ":ui_java_test_support",
     ":ui_javatest_jni_headers",
diff --git a/ui/android/fake_modal_dialog_manager_bridge.cc b/ui/android/fake_modal_dialog_manager_bridge.cc
new file mode 100644
index 0000000..06c3f22
--- /dev/null
+++ b/ui/android/fake_modal_dialog_manager_bridge.cc
@@ -0,0 +1,50 @@
+// 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 "ui/android/fake_modal_dialog_manager_bridge.h"
+
+#include "base/android/jni_android.h"
+#include "ui/android/window_android.h"
+
+// Must come after all headers that specialize FromJniType() / ToJniType().
+#include "ui/android/ui_javatest_jni_headers/FakeModalDialogManager_jni.h"
+
+namespace ui {
+
+// static.
+std::unique_ptr<FakeModalDialogManagerBridge>
+FakeModalDialogManagerBridge::CreateForTab(WindowAndroid* window,
+                                           bool use_empty_java_presenter) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  auto fake_manager = base::WrapUnique(new FakeModalDialogManagerBridge(
+      Java_FakeModalDialogManager_createForTab(env, use_empty_java_presenter),
+      window));
+  window->SetModalDialogManagerForTesting(fake_manager->j_fake_manager_);
+  return fake_manager;
+}
+
+FakeModalDialogManagerBridge::~FakeModalDialogManagerBridge() {
+  window_->SetModalDialogManagerForTesting(
+      base::android::ScopedJavaLocalRef<jobject>());
+}
+
+void FakeModalDialogManagerBridge::ClickPositiveButton() {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  Java_FakeModalDialogManager_clickPositiveButton(env, j_fake_manager_);
+}
+
+bool FakeModalDialogManagerBridge::IsSuspend(
+    ModalDialogManagerBridge::ModalDialogType dialog_type) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  return static_cast<bool>(Java_FakeModalDialogManager_isSuspended(
+      env, j_fake_manager_, static_cast<int>(dialog_type)));
+}
+
+// private.
+FakeModalDialogManagerBridge::FakeModalDialogManagerBridge(
+    base::android::ScopedJavaLocalRef<jobject> j_fake_manager,
+    WindowAndroid* window)
+    : j_fake_manager_(j_fake_manager), window_(window) {}
+
+}  // namespace ui
diff --git a/ui/android/fake_modal_dialog_manager_bridge.h b/ui/android/fake_modal_dialog_manager_bridge.h
new file mode 100644
index 0000000..fa65da0
--- /dev/null
+++ b/ui/android/fake_modal_dialog_manager_bridge.h
@@ -0,0 +1,47 @@
+// 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 UI_ANDROID_FAKE_MODAL_DIALOG_MANAGER_BRIDGE_H_
+#define UI_ANDROID_FAKE_MODAL_DIALOG_MANAGER_BRIDGE_H_
+
+#include "base/android/scoped_java_ref.h"
+#include "base/memory/raw_ptr.h"
+#include "ui/android/modal_dialog_manager_bridge.h"
+#include "ui/android/ui_android_export.h"
+
+namespace ui {
+
+class WindowAndroid;
+
+class UI_ANDROID_EXPORT FakeModalDialogManagerBridge {
+ public:
+  // `use_empty_java_presenter`, when set to true, tells
+  // `FakeModalDialogManager.java` to use an empty Presenter instead of a mocked
+  // one. An empty presenter is typically for browser tests and a mocked one is
+  // for unittests.
+  static std::unique_ptr<FakeModalDialogManagerBridge> CreateForTab(
+      WindowAndroid* window,
+      bool use_empty_java_presenter);
+
+  FakeModalDialogManagerBridge(const FakeModalDialogManagerBridge&) = delete;
+  FakeModalDialogManagerBridge& operator=(const FakeModalDialogManagerBridge&) =
+      delete;
+  ~FakeModalDialogManagerBridge();
+
+  void ClickPositiveButton();
+
+  bool IsSuspend(ModalDialogManagerBridge::ModalDialogType dialog_type);
+
+ private:
+  FakeModalDialogManagerBridge(
+      base::android::ScopedJavaLocalRef<jobject> j_fake_manager_,
+      WindowAndroid* window);
+
+  const base::android::ScopedJavaLocalRef<jobject> j_fake_manager_;
+  const raw_ptr<WindowAndroid> window_;
+};
+
+}  // namespace ui
+
+#endif  // UI_ANDROID_FAKE_MODAL_DIALOG_MANAGER_BRIDGE_H_
diff --git a/ui/android/java/src/org/chromium/ui/gl/SurfaceTextureListener.java b/ui/android/java/src/org/chromium/ui/gl/SurfaceTextureListener.java
index 22dbc06d..062e9c0 100644
--- a/ui/android/java/src/org/chromium/ui/gl/SurfaceTextureListener.java
+++ b/ui/android/java/src/org/chromium/ui/gl/SurfaceTextureListener.java
@@ -27,6 +27,7 @@
     }
 
     @Override
+    @SuppressWarnings("Finalize")  // TODO(crbug.com/40286193): Remove in favor of destroy().
     protected void finalize() throws Throwable {
         try {
             SurfaceTextureListenerJni.get()
diff --git a/ui/android/javatests/src/org/chromium/ui/test/util/MockitoHelper.java b/ui/android/javatests/src/org/chromium/ui/test/util/MockitoHelper.java
index 703d9be..f5ba804d 100644
--- a/ui/android/javatests/src/org/chromium/ui/test/util/MockitoHelper.java
+++ b/ui/android/javatests/src/org/chromium/ui/test/util/MockitoHelper.java
@@ -50,7 +50,7 @@
     }
 
     /** When no argument is needed. */
-    public static <T> Stubber doRunnable(Runnable runnable) {
+    public static Stubber doRunnable(Runnable runnable) {
         return Mockito.doAnswer(
                 ignored -> {
                     runnable.run();
diff --git a/ui/android/javatests/src/org/chromium/ui/test/util/modaldialog/FakeModalDialogManager.java b/ui/android/javatests/src/org/chromium/ui/test/util/modaldialog/FakeModalDialogManager.java
index 779ac3c..83696519 100644
--- a/ui/android/javatests/src/org/chromium/ui/test/util/modaldialog/FakeModalDialogManager.java
+++ b/ui/android/javatests/src/org/chromium/ui/test/util/modaldialog/FakeModalDialogManager.java
@@ -4,26 +4,48 @@
 
 package org.chromium.ui.test.util.modaldialog;
 
-import org.jni_zero.CalledByNative;
+import androidx.activity.ComponentDialog;
+
+import org.jni_zero.CalledByNativeForTesting;
 import org.jni_zero.JNINamespace;
 import org.mockito.Mockito;
 
+import org.chromium.base.Callback;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
 import org.chromium.ui.modelutil.PropertyModel;
 
-/** A fake ModalDialogManager for use in tests involving modals. */
+/**
+ * A fake ModalDialogManager for use in tests involving modals. Unlike ModalDialogManager, this
+ * class is managed by its native `FakeModalDialogManagerBridge`.
+ */
 @JNINamespace("ui")
 public class FakeModalDialogManager extends ModalDialogManager {
     private PropertyModel mShownDialogModel;
 
-    @CalledByNative
-    private static FakeModalDialogManager createForTab() {
-        return new FakeModalDialogManager(ModalDialogType.TAB);
+    @CalledByNativeForTesting
+    private static FakeModalDialogManager createForTab(boolean useEmptyPresenter) {
+        ModalDialogManager.Presenter presenter =
+                useEmptyPresenter
+                        ? new ModalDialogManager.Presenter() {
+                            @Override
+                            protected void addDialogView(
+                                    PropertyModel model,
+                                    Callback<ComponentDialog> onDialogCreatedCallback) {}
+
+                            @Override
+                            protected void removeDialogView(PropertyModel model) {}
+                        }
+                        : Mockito.mock(Presenter.class);
+        return new FakeModalDialogManager(presenter, ModalDialogType.TAB);
     }
 
     public FakeModalDialogManager(int modalDialogType) {
-        super(Mockito.mock(Presenter.class), modalDialogType);
+        this(Mockito.mock(Presenter.class), modalDialogType);
+    }
+
+    public FakeModalDialogManager(ModalDialogManager.Presenter presenter, int modalDialogType) {
+        super(presenter, modalDialogType);
     }
 
     @Override
@@ -37,7 +59,13 @@
         mShownDialogModel = null;
     }
 
-    @CalledByNative
+    @Override
+    @CalledByNativeForTesting
+    public boolean isSuspended(@ModalDialogType int dialogType) {
+        return super.isSuspended(dialogType);
+    }
+
+    @CalledByNativeForTesting
     public void clickPositiveButton() {
         mShownDialogModel
                 .get(ModalDialogProperties.CONTROLLER)
diff --git a/ui/android/modal_dialog_wrapper_unittest.cc b/ui/android/modal_dialog_wrapper_unittest.cc
index e3414ea..73dc75ac 100644
--- a/ui/android/modal_dialog_wrapper_unittest.cc
+++ b/ui/android/modal_dialog_wrapper_unittest.cc
@@ -12,12 +12,10 @@
 #include "base/memory/weak_ptr.h"
 #include "base/test/bind.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/android/fake_modal_dialog_manager_bridge.h"
 #include "ui/android/window_android.h"
 #include "ui/base/models/dialog_model.h"
 
-// Must come after all headers that specialize FromJniType() / ToJniType().
-#include "ui/android/ui_javatest_jni_headers/FakeModalDialogManager_jni.h"
-
 namespace ui {
 
 TEST(ModalDialogWrapperTest, ShowTabModal) {
@@ -33,14 +31,11 @@
       .SetCloseActionCallback(base::DoNothing());
 
   auto window = ui::WindowAndroid::CreateForTesting();
-  JNIEnv* env = base::android::AttachCurrentThread();
-  base::android::ScopedJavaLocalRef<jobject> fake_modal_dialog_manager =
-      Java_FakeModalDialogManager_createForTab(env);
-  window->SetModalDialogManager(fake_modal_dialog_manager);
+  auto fake_dialog_manager = FakeModalDialogManagerBridge::CreateForTab(
+      window->get(), /*use_empty_java_presenter=*/false);
 
   ModalDialogWrapper::ShowTabModal(dialog_builder.Build(), window->get());
-  Java_FakeModalDialogManager_clickPositiveButton(env,
-                                                  fake_modal_dialog_manager);
+  fake_dialog_manager->ClickPositiveButton();
   EXPECT_TRUE(ok_called);
 }
 
@@ -57,10 +52,8 @@
           base::BindLambdaForTesting([&closed]() { closed = true; }));
 
   auto window = ui::WindowAndroid::CreateForTesting();
-  JNIEnv* env = base::android::AttachCurrentThread();
-  base::android::ScopedJavaLocalRef<jobject> fake_modal_dialog_manager =
-      Java_FakeModalDialogManager_createForTab(env);
-  window->SetModalDialogManager(fake_modal_dialog_manager);
+  auto fake_dialog_manager = FakeModalDialogManagerBridge::CreateForTab(
+      window->get(), /*use_empty_java_presenter=*/false);
 
   ModalDialogWrapper::ShowTabModal(dialog_builder.Build(), window->get());
   ModalDialogWrapper::GetDialogForTesting()->Close();
diff --git a/ui/android/window_android.cc b/ui/android/window_android.cc
index c2121b3d..2eb7287 100644
--- a/ui/android/window_android.cc
+++ b/ui/android/window_android.cc
@@ -277,6 +277,13 @@
                                                            GetJavaObject()));
 }
 
+void WindowAndroid::SetModalDialogManagerForTesting(
+    base::android::ScopedJavaLocalRef<jobject> java_modal_dialog_manager) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  ui::Java_WindowAndroid_setModalDialogManagerForTesting(
+      env, GetJavaObject(), java_modal_dialog_manager);
+}
+
 void WindowAndroid::SetWideColorEnabled(bool enabled) {
   JNIEnv* env = AttachCurrentThread();
   Java_WindowAndroid_setWideColorEnabled(env, GetJavaObject(), enabled);
diff --git a/ui/android/window_android.h b/ui/android/window_android.h
index 8365064..b71b956 100644
--- a/ui/android/window_android.h
+++ b/ui/android/window_android.h
@@ -40,6 +40,7 @@
 // WindowAndroid is also the root of a ViewAndroid tree.
 class UI_ANDROID_EXPORT WindowAndroid : public ViewAndroid {
  public:
+  // Intended for unittests only.
   class ScopedWindowAndroidForTesting {
    public:
     ScopedWindowAndroidForTesting(WindowAndroid* window);
@@ -120,6 +121,10 @@
 
   ModalDialogManagerBridge* GetModalDialogManagerBridge();
 
+  // Intended for native browser tests.
+  void SetModalDialogManagerForTesting(
+      base::android::ScopedJavaLocalRef<jobject> java_modal_dialog_manager);
+
   float mouse_wheel_scroll_factor() const { return mouse_wheel_scroll_factor_; }
 
   static std::unique_ptr<ScopedWindowAndroidForTesting> CreateForTesting();
diff --git a/ui/webui/resources/cr_components/history_embeddings/history_embeddings.html b/ui/webui/resources/cr_components/history_embeddings/history_embeddings.html
index 7f04f9d..eb2c864 100644
--- a/ui/webui/resources/cr_components/history_embeddings/history_embeddings.html
+++ b/ui/webui/resources/cr_components/history_embeddings/history_embeddings.html
@@ -281,7 +281,9 @@
         <div>Source:</div>
         <div class="favicon"
             style$="background-image: [[getFavicon_(answerSource_)]]"></div>
-        <div class="result-url">[[answerSource_.urlForDisplay]]</div>
+        <div class="result-url">
+          [[answerSource_.urlForDisplay]] &bull; [[answerSource_.shortDateTime]]
+        </div>
       </a>
     </div>
 
diff --git a/ui/webui/resources/cr_components/history_embeddings/history_embeddings.mojom b/ui/webui/resources/cr_components/history_embeddings/history_embeddings.mojom
index f9962422..0d2af98 100644
--- a/ui/webui/resources/cr_components/history_embeddings/history_embeddings.mojom
+++ b/ui/webui/resources/cr_components/history_embeddings/history_embeddings.mojom
@@ -37,9 +37,13 @@
   // The URL formatted for display.
   string url_for_display;
 
-  // A localized string for the last visit time for the above URL, from history.
+  // A localized string for how long it has been since the last visit time for
+  // the above URL, from history.
   string relative_time;
 
+  // A localized string for the last visit time for the above URL, from history.
+  string short_date_time;
+
   // The last visit time for the above URL, from history. Used for removing
   // history item.
   // TODO(crbug.com/335282446): BrowsingHistoryService requires a double here.