diff --git a/AUTHORS b/AUTHORS
index 6fb28c31..34b17f6 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -557,6 +557,7 @@
 Jaehyun Lee <j-hyun.lee@samsung.com>
 Jaekyeom Kim <btapiz@gmail.com>
 Jaemin Seo <jaemin86.seo@samsung.com>
+Jaemo Koo <jaemok@amazon.com>
 Jaeseok Yoon <yjaeseok@gmail.com>
 Jaewon Choi <jaewon.james.choi@gmail.com>
 Jaewon Jung <jw.jung@navercorp.com>
@@ -614,6 +615,7 @@
 Jiahe Zhang <jiahe.zhang@intel.com>
 Jiajia Qin <jiajia.qin@intel.com>
 Jiajie Hu <jiajie.hu@intel.com>
+Jianfeng Liu <liujianfeng1994@gmail.com>
 Jiangzhen Hou <houjiangzhen@360.cn>
 Jianjun Zhu <jianjun.zhu@intel.com>
 Jianneng Zhong <muzuiget@gmail.com>
diff --git a/DEPS b/DEPS
index 321c174..1045ea2e 100644
--- a/DEPS
+++ b/DEPS
@@ -305,11 +305,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': '8c572c92ad2038d9a0488d55599a138ab24941eb',
+  'src_internal_revision': '1b190e361c56e70d2c0e57fc9b56dc7af3a75fea',
   # 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': '65a5cd082bea45d16a7b4a251934acc632e77032',
+  'skia_revision': 'ae6df7264c6eedbe988e05a12455c619e1a0f242',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -360,7 +360,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_revision': '6338f2a6814b3f50a0bb3a4c563ef30e4561041a',
+  'freetype_revision': 'd5973932d0f5e0336c1de6fad3d8029a8bde1957',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -424,7 +424,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'c36093e932c33b6269204461ebbf864bd7e717de',
+  'dawn_revision': 'e30eacb0b6e8725e79c283908b7cb0c7f219ac44',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -500,7 +500,7 @@
 
   # If you change this, also update the libc++ revision in
   # //buildtools/deps_revisions.gni.
-  'libcxx_revision':       'cec6ffaa620122c200e742b7b0d034ce4e5c40bd',
+  'libcxx_revision':       '2a2315e69ab61cb488c18fbbb1cd502be049c122',
 
   # GN CIPD package version.
   'gn_version': 'git_revision:e4702d7409069c4f12d45ea7b7f0890717ca3f4b',
@@ -824,7 +824,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '12e84541a2d44aa5535caf8b1a073fa64376c0c6',
+    'b0a7c7b4fab38799037256bba133600deda76ca8',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -986,7 +986,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'VhiGCU24L3DYdm5QY-9RX9d2FneEUMrhgxAtcZU6T4AC',
+          'version': '9IelXPBu99khi6r9QOkX4FrKB_7NjXcTUMb-FZSMdSgC',
       },
     ],
     'condition': 'checkout_android',
@@ -1689,7 +1689,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '9c4d5090f6a29c785d4e2a1a1f577bcc17eeb648',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '11e588ed3a8fc568f13a4ae156fa848d00909937',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1997,7 +1997,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'QXWHxCuOb4jyDSq3KW3uUQoveYmoeDTHpefujIUWzAEC',
+        'version': 'HkIWhz2CQreexqdXRSe9wEkwfIiFPNvaAW3b0swczmoC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -5499,7 +5499,6 @@
                'reproxy.cfg.template',
                '--rewrapper_cfg_project',
                Var('rewrapper_cfg_project'),
-               '--quiet',
                ],
   },
   {
@@ -5515,7 +5514,6 @@
                '--rewrapper_cfg_project',
                Var('rewrapper_cfg_project'),
                '--skip_remoteexec_cfg_fetch',
-               '--quiet',
                ],
   },
   # Configure Siso for developer builds.
diff --git a/android_webview/browser/gfx/hardware_renderer.cc b/android_webview/browser/gfx/hardware_renderer.cc
index d2987ba..8649210 100644
--- a/android_webview/browser/gfx/hardware_renderer.cc
+++ b/android_webview/browser/gfx/hardware_renderer.cc
@@ -61,6 +61,9 @@
 BASE_FEATURE(kWebViewUseOutputSurfaceClipRect,
              "WebViewUseOutputSurfaceClipRect",
              base::FEATURE_ENABLED_BY_DEFAULT);
+BASE_FEATURE(kDrawAndSwapInjectLatency,
+             "DrawAndSwapInjectLatency",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 class ScopedAcquireExternalContext {
  public:
@@ -633,6 +636,10 @@
 
   DCHECK_CALLED_ON_VALID_THREAD(render_thread_checker_);
 
+  if (base::FeatureList::IsEnabled(kDrawAndSwapInjectLatency)) {
+    usleep(1000);
+  }
+
   // Ensure that the context is synced from external and synced back before
   // returning. This is only necessary when using ANGLE to keep its internals
   // synced with the external context
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java
index b424568b..2cddb4d 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java
@@ -27,7 +27,6 @@
 import android.view.WindowManager;
 import android.view.autofill.AutofillValue;
 
-import androidx.annotation.RequiresApi;
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 
@@ -87,8 +86,6 @@
 @RunWith(Parameterized.class)
 @UseParametersRunnerFactory(AwJUnit4ClassRunnerWithParameters.Factory.class)
 @Batch(Batch.PER_CLASS)
-@MinAndroidSdkLevel(Build.VERSION_CODES.O)
-@RequiresApi(Build.VERSION_CODES.O)
 public class AwAutofillTest extends AwParameterizedTest {
     public static final boolean DEBUG = false;
     public static final String TAG = "AutofillTest";
diff --git a/base/allocator/partition_allocator/DEPS b/base/allocator/partition_allocator/DEPS
index 72c0d0f7..98a3aa9 100644
--- a/base/allocator/partition_allocator/DEPS
+++ b/base/allocator/partition_allocator/DEPS
@@ -2,18 +2,17 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-include_rules = [
-    # The basic rule is that PartitionAlloc library must not depend on Chromium
-    # project in order to be a standalone library.
-    "-base",
-    "-build",
-    "-build_overrides",
-    "-testing",
-    "-third_party",
+# PartitionAlloc library must not depend on Chromium
+# project in order to be a standalone library.
+noparent = True
 
-    "+base/allocator/partition_allocator",
-    "+build/build_config.h",
-    "+build/buildflag.h",
+include_rules = [
+  # `partition_alloc` can depends on itself, via the `include_dirs` it declares.
+  "+partition_alloc",
+
+  # Build flags to infer the architecture and operating system in use.
+  "+build/build_config.h",
+  "+build/buildflag.h",
 ]
 
 specific_include_rules = {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.cc b/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.cc
index 8b35d2a..d4b6f6af 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.cc
@@ -2,24 +2,24 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h"
+#include "partition_alloc/address_pool_manager.h"
 
 #include <algorithm>
 #include <atomic>
 #include <cstdint>
 #include <limits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_space_stats.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/alignment.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_space_stats.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/notreached.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/reservation_offset_table.h"
+#include "partition_alloc/thread_isolation/alignment.h"
 
 #if BUILDFLAG(IS_APPLE) || BUILDFLAG(ENABLE_THREAD_ISOLATION)
 #include <sys/mman.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h b/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h
index 2fc8ca20..27851d2 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h
@@ -8,22 +8,22 @@
 #include <bitset>
 #include <limits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_types.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/alignment.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_pool_manager_types.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_lock.h"
+#include "partition_alloc/thread_isolation/alignment.h"
+#include "partition_alloc/thread_isolation/thread_isolation.h"
 
 #if !BUILDFLAG(HAS_64_BIT_POINTERS)
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.h"
+#include "partition_alloc/address_pool_manager_bitmap.h"
 #endif
 
 namespace partition_alloc {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.cc b/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.cc
index 84884ad..ace3db9 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.h"
+#include "partition_alloc/address_pool_manager_bitmap.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_constants.h"
 
 #if !BUILDFLAG(HAS_64_BIT_POINTERS)
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.h b/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.h
index ebbe17e7..a6f4102 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.h
@@ -10,13 +10,13 @@
 #include <bitset>
 #include <limits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_lock.h"
 
 #if !BUILDFLAG(HAS_64_BIT_POINTERS)
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_unittest.cc
index f2501f08..54281ee 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_unittest.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h"
+#include "partition_alloc/address_pool_manager.h"
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_space_stats.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_space_stats.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_constants.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace partition_alloc::internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.cc b/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.cc
index f069c1e..1a9aff75 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h"
+#include "partition_alloc/address_space_randomization.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/random.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/random.h"
 
 #if BUILDFLAG(IS_WIN)
 #include <windows.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h b/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h
index c336c54..90882673 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h
@@ -7,10 +7,10 @@
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization_unittest.cc
index afec439c..cb920da 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization_unittest.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h"
+#include "partition_alloc/address_space_randomization.h"
 
 #include <cstdint>
 #include <vector>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/random.h"
 #include "build/build_config.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/random.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if BUILDFLAG(IS_WIN)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/address_space_stats.h b/base/allocator/partition_allocator/src/partition_alloc/address_space_stats.h
index 5b28417..a580d7b 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/address_space_stats.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/address_space_stats.h
@@ -7,8 +7,8 @@
 
 #include <cstddef>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/allocation_guard.cc b/base/allocator/partition_allocator/src/partition_alloc/allocation_guard.cc
index 64e9410e..c0bbd934 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/allocation_guard.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/allocation_guard.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/allocation_guard.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/allocation_guard.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
+#include "partition_alloc/partition_alloc_config.h"
 
 #if PA_CONFIG(HAS_ALLOCATION_GUARD)
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/allocation_guard.h b/base/allocator/partition_allocator/src/partition_alloc/allocation_guard.h
index 1a69198d..d1ae6081e 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/allocation_guard.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/allocation_guard.h
@@ -5,9 +5,9 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_ALLOCATION_GUARD_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_ALLOCATION_GUARD_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_config.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.cc b/base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.cc
index 1b2e9d9..b4d9e66 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.cc
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/compressed_pointer.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 #if BUILDFLAG(ENABLE_POINTER_COMPRESSION)
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.h b/base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.h
index 1802c1d8..af78c06 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.h
@@ -8,11 +8,11 @@
 #include <climits>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 #if BUILDFLAG(ENABLE_POINTER_COMPRESSION)
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/compressed_pointer_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/compressed_pointer_unittest.cc
index c009bbb3..52de3bf 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/compressed_pointer_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/compressed_pointer_unittest.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.h"
+#include "partition_alloc/compressed_pointer.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
+#include "partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_root.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace partition_alloc {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.cc b/base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.cc
index 4946b9b..b2d5632 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.h"
+#include "partition_alloc/dangling_raw_ptr_checks.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_check.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.h b/base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.h
index 0e118265ba..3ee9493 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.h
@@ -7,7 +7,7 @@
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 // When compiled with build flags `enable_dangling_raw_ptr_checks`, dangling
 // raw_ptr are reported. Its behavior can be configured here.
diff --git a/base/allocator/partition_allocator/src/partition_alloc/encoded_next_freelist.h b/base/allocator/partition_allocator/src/partition_alloc/encoded_next_freelist.h
index 89f5845..323899b 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/encoded_next_freelist.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/encoded_next_freelist.h
@@ -8,20 +8,20 @@
 #include <cstddef>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc-inl.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h"
 #include "build/build_config.h"
+#include "partition_alloc/freeslot_bitmap.h"
+#include "partition_alloc/partition_alloc-inl.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_ref_count.h"
 
 #if !defined(ARCH_CPU_BIG_ENDIAN)
-#include "base/allocator/partition_allocator/src/partition_alloc/reverse_bytes.h"
+#include "partition_alloc/reverse_bytes.h"
 #endif  // !defined(ARCH_CPU_BIG_ENDIAN)
 
 namespace partition_alloc::internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/extended_api.cc b/base/allocator/partition_allocator/src/partition_alloc/extended_api.cc
index 5ca0c0f..f87f071 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/extended_api.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/extended_api.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/extended_api.h"
+#include "partition_alloc/extended_api.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_cache.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h"
+#include "partition_alloc/thread_cache.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/extended_api.h b/base/allocator/partition_allocator/src/partition_alloc/extended_api.h
index 7b154b6..fd57e63b 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/extended_api.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/extended_api.h
@@ -5,10 +5,10 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_EXTENDED_API_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_EXTENDED_API_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_stats.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_cache.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_root.h"
+#include "partition_alloc/partition_stats.h"
+#include "partition_alloc/thread_cache.h"
 
 namespace partition_alloc::internal {
 // Get allocation stats for the thread cache partition on the current
diff --git a/base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap.h b/base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap.h
index c11b78d2..50b0ae21 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap.h
@@ -9,11 +9,11 @@
 #include <cstdint>
 #include <utility>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/freeslot_bitmap_constants.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_constants.h"
 
 #if BUILDFLAG(USE_FREESLOT_BITMAP)
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_constants.h b/base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_constants.h
index 00e0a5d..2b20e72b 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_constants.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_constants.h
@@ -7,12 +7,12 @@
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/reservation_offset_table.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_unittest.cc
index 31920e1..cbeaa3c 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_unittest.cc
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap.h"
+#include "partition_alloc/freeslot_bitmap.h"
 
 #include <cstdint>
 #include <limits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
+#include "partition_alloc/freeslot_bitmap_constants.h"
+#include "partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_page.h"
+#include "partition_alloc/partition_root.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 // This test is disabled when MEMORY_TOOL_REPLACES_ALLOCATOR is defined because
diff --git a/base/allocator/partition_allocator/src/partition_alloc/gwp_asan_support.cc b/base/allocator/partition_allocator/src/partition_alloc/gwp_asan_support.cc
index 31b8569..a562e43 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/gwp_asan_support.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/gwp_asan_support.cc
@@ -2,20 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/gwp_asan_support.h"
+#include "partition_alloc/gwp_asan_support.h"
 
 #if BUILDFLAG(ENABLE_GWP_ASAN_SUPPORT)
 
-#include "base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
 #include "build/build_config.h"
+#include "partition_alloc/freeslot_bitmap_constants.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_alloc_base/no_destructor.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_bucket.h"
+#include "partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_page.h"
+#include "partition_alloc/partition_ref_count.h"
+#include "partition_alloc/partition_root.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/gwp_asan_support.h b/base/allocator/partition_allocator/src/partition_alloc/gwp_asan_support.h
index 697acbb..e68bac47 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/gwp_asan_support.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/gwp_asan_support.h
@@ -5,8 +5,8 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_GWP_ASAN_SUPPORT_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_GWP_ASAN_SUPPORT_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 #if BUILDFLAG(ENABLE_GWP_ASAN_SUPPORT)
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/hardening_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/hardening_unittest.cc
index f2a83925..8a80371 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/hardening_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/hardening_unittest.cc
@@ -6,11 +6,11 @@
 #include <string>
 #include <vector>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_freelist_entry.h"
+#include "partition_alloc/partition_page.h"
+#include "partition_alloc/partition_root.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 // With *SAN, PartitionAlloc is rerouted to malloc().
diff --git a/base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.cc b/base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.cc
index 28bba39e..100e316 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.h"
+#include "partition_alloc/lightweight_quarantine.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_stats.h"
+#include "partition_alloc/partition_page.h"
+#include "partition_alloc/partition_root.h"
+#include "partition_alloc/partition_stats.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.h b/base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.h
index b34759d29..a611cec 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.h
@@ -25,11 +25,11 @@
 #include <numeric>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/export_template.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/export_template.h"
+#include "partition_alloc/partition_alloc_base/rand_util.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_lock.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine_unittest.cc
index 89f8b57..c60b8346 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine_unittest.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.h"
+#include "partition_alloc/lightweight_quarantine.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_stats.h"
+#include "partition_alloc/partition_alloc_for_testing.h"
+#include "partition_alloc/partition_page.h"
+#include "partition_alloc/partition_root.h"
+#include "partition_alloc/partition_stats.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace partition_alloc {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.cc b/base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.cc
index d700cb50..f6f1acb9 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.h"
+#include "partition_alloc/memory_reclaimer.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc_base/no_destructor.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_config.h"
 
 #if BUILDFLAG(USE_STARSCAN)
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/starscan/pcscan.h"
 #endif
 
 namespace partition_alloc {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.h b/base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.h
index 82a23476..c793a9b 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.h
@@ -8,12 +8,12 @@
 #include <memory>
 #include <set>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/no_destructor.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_lock.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer_unittest.cc
index 38b51a7..742138c1 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer_unittest.cc
@@ -2,24 +2,24 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.h"
+#include "partition_alloc/memory_reclaimer.h"
 
 #include <memory>
 #include <utility>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_for_testing.h"
+#include "partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && \
     PA_CONFIG(THREAD_CACHE_SUPPORTED)
-#include "base/allocator/partition_allocator/src/partition_alloc/extended_api.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_cache.h"
+#include "partition_alloc/extended_api.h"
+#include "partition_alloc/thread_cache.h"
 #endif
 
 // Otherwise, PartitionAlloc doesn't allocate any memory, and the tests are
diff --git a/base/allocator/partition_allocator/src/partition_alloc/oom.cc b/base/allocator/partition_allocator/src/partition_alloc/oom.cc
index 1d695683..f6839ebc 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/oom.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/oom.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/oom.h"
+#include "partition_alloc/oom.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/oom_callback.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
 #include "build/build_config.h"
+#include "partition_alloc/oom_callback.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/debug/alias.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
 
 #if BUILDFLAG(IS_WIN)
 #include <windows.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/oom.h b/base/allocator/partition_allocator/src/partition_alloc/oom.h
index a6657f6c..7cc20696 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/oom.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/oom.h
@@ -7,13 +7,13 @@
 
 #include <cstddef>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/allocation_guard.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/allocation_guard.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 #if BUILDFLAG(IS_WIN)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/windows_types.h"
+#include "partition_alloc/partition_alloc_base/win/windows_types.h"
 #endif
 
 namespace partition_alloc {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/oom_callback.cc b/base/allocator/partition_allocator/src/partition_alloc/oom_callback.cc
index 3528489..0db8407 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/oom_callback.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/oom_callback.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/oom_callback.h"
+#include "partition_alloc/oom_callback.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_check.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/oom_callback.h b/base/allocator/partition_allocator/src/partition_alloc/oom_callback.h
index 5f816f4..a8611c0 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/oom_callback.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/oom_callback.h
@@ -5,7 +5,7 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_OOM_CALLBACK_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_OOM_CALLBACK_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc b/base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc
index d8134e6..f05060f3 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc
@@ -2,29 +2,29 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
+#include "partition_alloc/page_allocator.h"
 
 #include <atomic>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_internal.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_space_randomization.h"
+#include "partition_alloc/page_allocator_internal.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_lock.h"
 
 #if BUILDFLAG(IS_WIN)
 #include <windows.h>
 #endif
 
 #if BUILDFLAG(IS_WIN)
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_win.h"
+#include "partition_alloc/page_allocator_internals_win.h"
 #elif BUILDFLAG(IS_POSIX)
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_posix.h"
+#include "partition_alloc/page_allocator_internals_posix.h"
 #elif BUILDFLAG(IS_FUCHSIA)
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_fuchsia.h"
+#include "partition_alloc/page_allocator_internals_fuchsia.h"
 #else
 #error Platform not supported.
 #endif
diff --git a/base/allocator/partition_allocator/src/partition_alloc/page_allocator.h b/base/allocator/partition_allocator/src/partition_alloc/page_allocator.h
index 17569be..307735e 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/page_allocator.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/page_allocator.h
@@ -8,12 +8,12 @@
 #include <cstddef>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h"
 #include "build/build_config.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/thread_isolation/thread_isolation.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h
index cb6116c..8f11cf1 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h
@@ -7,9 +7,9 @@
 
 #include <stddef.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 #if BUILDFLAG(IS_APPLE) && defined(ARCH_CPU_64_BITS)
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internal.h b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internal.h
index 0a2b13c..0a97ca57 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internal.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internal.h
@@ -8,7 +8,7 @@
 #include <cstddef>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
+#include "partition_alloc/page_allocator.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_fuchsia.h b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_fuchsia.h
index 256d783..f9347a6 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_fuchsia.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_fuchsia.h
@@ -20,11 +20,11 @@
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.h"
+#include "partition_alloc/partition_alloc_base/no_destructor.h"
+#include "partition_alloc/partition_alloc_base/notreached.h"
+#include "partition_alloc/partition_alloc_check.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_posix.cc b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_posix.cc
index e96514f..571c2c0c 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_posix.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_posix.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/partition_alloc_base/cpu.h"
+#include "partition_alloc/partition_alloc_base/notreached.h"
 
 #include <sys/mman.h>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_posix.h b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_posix.h
index 75b45a1..45c5a30 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_posix.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_posix.h
@@ -13,26 +13,26 @@
 
 #include <sys/mman.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/oom.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/eintr_wrapper.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h"
 #include "build/build_config.h"
+#include "partition_alloc/oom.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/notreached.h"
+#include "partition_alloc/partition_alloc_base/posix/eintr_wrapper.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/thread_isolation/thread_isolation.h"
 
 #if BUILDFLAG(IS_APPLE)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/foundation_util.h"
+#include "partition_alloc/partition_alloc_base/apple/foundation_util.h"
 #if BUILDFLAG(IS_IOS)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.h"
+#include "partition_alloc/partition_alloc_base/ios/ios_util.h"
 #elif BUILDFLAG(IS_MAC)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.h"
+#include "partition_alloc/partition_alloc_base/mac/mac_util.h"
 #else
 #error "Unknown platform"
 #endif
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/scoped_cftyperef.h"
+#include "partition_alloc/partition_alloc_base/apple/scoped_cftyperef.h"
 
 #include <Availability.h>
 #include <Security/Security.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_win.h b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_win.h
index 4c5469b..84beb88 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_win.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_win.h
@@ -7,12 +7,12 @@
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/oom.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_internal.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/oom.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/page_allocator_internal.h"
+#include "partition_alloc/partition_alloc_base/notreached.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_unittest.cc
index 772a3d1..048cdbb7 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
+#include "partition_alloc/page_allocator.h"
 
 #include <stdlib.h>
 #include <string.h>
@@ -12,14 +12,14 @@
 #include <string>
 #include <vector>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_space_randomization.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_alloc_base/cpu.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/notreached.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/tagging.h"
 
 #if defined(LINUX_NAME_REGION)
 #include "base/debug/proc_maps_linux.h"
@@ -34,7 +34,7 @@
 #include <sys/time.h>
 #endif  // BUILDFLAG(IS_POSIX)
 
-#include "base/allocator/partition_allocator/src/partition_alloc/arm_bti_test_functions.h"
+#include "partition_alloc/arm_bti_test_functions.h"
 
 #if PA_CONFIG(HAS_MEMORY_TAGGING)
 #include <arm_acle.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_address_space.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_address_space.cc
index 8df4cc0..6ad0d1f 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_address_space.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_address_space.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_address_space.h"
 
 #include <array>
 #include <cstddef>
@@ -10,18 +10,18 @@
 #include <ostream>
 #include <string>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_pool_manager.h"
+#include "partition_alloc/compressed_pointer.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/debug/alias.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/thread_isolation/thread_isolation.h"
 
 #if BUILDFLAG(IS_IOS)
 #include <mach-o/dyld.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h b/base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h
index dec969509..d6a342b 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h
@@ -8,22 +8,22 @@
 #include <cstddef>
 #include <utility>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_types.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/alignment.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_pool_manager_types.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/notreached.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/thread_isolation/alignment.h"
 
 #if BUILDFLAG(ENABLE_THREAD_ISOLATION)
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h"
+#include "partition_alloc/thread_isolation/thread_isolation.h"
 #endif
 
 // The feature is not applicable to 32-bit address space.
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc-inl.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc-inl.h
index e808347..129b4bc 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc-inl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc-inl.h
@@ -8,14 +8,14 @@
 #include <algorithm>
 #include <cstring>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/random.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_ref_count.h"
+#include "partition_alloc/random.h"
+#include "partition_alloc/tagging.h"
+#include "partition_alloc/thread_isolation/thread_isolation.h"
 
 // Prefetch *x into memory.
 #if defined(__clang__) || defined(COMPILER_GCC)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc.cc
index 780aa65..b33d5c8 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc.cc
@@ -2,27 +2,27 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc.h"
 
 #include <string.h>
 
 #include <cstdint>
 #include <memory>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_direct_map_extent.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_oom.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_stats.h"
+#include "partition_alloc/address_pool_manager.h"
+#include "partition_alloc/memory_reclaimer.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_hooks.h"
+#include "partition_alloc/partition_direct_map_extent.h"
+#include "partition_alloc/partition_oom.h"
+#include "partition_alloc/partition_page.h"
+#include "partition_alloc/partition_root.h"
+#include "partition_alloc/partition_stats.h"
 
 #if BUILDFLAG(USE_STARSCAN)
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/starscan/pcscan.h"
 #endif
 
 namespace partition_alloc {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h
index c88946f..1e23b94e 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h
@@ -5,11 +5,11 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_oom.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_oom.h"
+#include "partition_alloc/partition_root.h"
 
 // *** HOUSEKEEPING RULES ***
 //
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_allocation_data.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_allocation_data.h
index ec47adff..709d154 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_allocation_data.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_allocation_data.h
@@ -7,9 +7,9 @@
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/tagging.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/foundation_util.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/foundation_util.h
index 516538b2..037d429 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/foundation_util.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/foundation_util.h
@@ -7,7 +7,7 @@
 
 #include <CoreFoundation/CoreFoundation.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal::base::apple {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/foundation_util.mm b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/foundation_util.mm
index e49906b..7bcafc3 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/foundation_util.mm
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/foundation_util.mm
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/foundation_util.h"
+#include "partition_alloc/partition_alloc_base/apple/foundation_util.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/check.h"
 
 namespace partition_alloc::internal::base::apple {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.cc
index 21d6aa27..759fb15 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.h"
+#include "partition_alloc/partition_alloc_base/apple/mach_logging.h"
 
 #include <iomanip>
 #include <string>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.h"
+#include "partition_alloc/partition_alloc_base/strings/stringprintf.h"
 
 namespace {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.h
index 2f3b504..6b632d6f 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.h
@@ -7,10 +7,10 @@
 
 #include <mach/mach.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
 
 // Use the PA_MACH_LOG family of macros along with a mach_error_t
 // (kern_return_t) containing a Mach error. The error value will be decoded so
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/scoped_cftyperef.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/scoped_cftyperef.h
index 147386e..297f1ef1 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/scoped_cftyperef.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/scoped_cftyperef.h
@@ -7,7 +7,7 @@
 
 #include <CoreFoundation/CoreFoundation.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/scoped_typeref.h"
+#include "partition_alloc/partition_alloc_base/apple/scoped_typeref.h"
 
 namespace partition_alloc::internal::base::apple {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/scoped_typeref.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/scoped_typeref.h
index 0df3e7e..3f6dab7f 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/scoped_typeref.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/scoped_typeref.h
@@ -5,8 +5,8 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_APPLE_SCOPED_TYPEREF_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_APPLE_SCOPED_TYPEREF_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/scoped_policy.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/memory/scoped_policy.h"
 
 namespace partition_alloc::internal::base::apple {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/augmentations/compiler_specific.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/augmentations/compiler_specific.h
index 29674f3..1310a7d2 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/augmentations/compiler_specific.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/augmentations/compiler_specific.h
@@ -7,7 +7,7 @@
 
 // Extensions for PA's copy of `//base/compiler_specific.h`.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
 
 // PA_ATTRIBUTE_RETURNS_NONNULL
 //
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bit_cast.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bit_cast.h
index 7a0d0b2..0918a56 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bit_cast.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bit_cast.h
@@ -7,7 +7,7 @@
 
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
 
 #if !PA_HAS_BUILTIN(__builtin_bit_cast)
 #include <string.h>  // memcpy
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h
index 2af5acd..d9538c3 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h
@@ -11,9 +11,9 @@
 #include <cstdint>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
 
 namespace partition_alloc::internal::base::bits {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits_pa_unittest.cc
index 3f595bb..2d052b003 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits_pa_unittest.cc
@@ -4,7 +4,7 @@
 
 // This file contains the unit tests for the bit utilities.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
 
 #include <cstddef>
 #include <limits>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.cc
index bc67e1e..9db9470 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/check.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
 
 namespace partition_alloc::internal::logging {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h
index ff8efa4a..054ca3d 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h
@@ -7,12 +7,12 @@
 
 #include <iosfwd>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/log_message.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
+#include "partition_alloc/partition_alloc_base/log_message.h"
+#include "partition_alloc/partition_alloc_base/strings/cstring_builder.h"
 
 #define PA_STRINGIFY_IMPL(s) #s
 #define PA_STRINGIFY(s) PA_STRINGIFY_IMPL(s)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export_pa_unittest.cc
index bb4fd2b..4d205b05 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export_pa_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace partition_alloc::internal::base {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.cc
index 0000d86a..b24b8936 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h"
+#include "partition_alloc/partition_alloc_base/cpu.h"
 
 #include <inttypes.h>
 #include <limits.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h
index ec3590c..929f122d0 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h
@@ -5,8 +5,8 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_CPU_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_CPU_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu_pa_unittest.cc
index ea168af..063159ae 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu_pa_unittest.cc
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/cpu.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace partition_alloc {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.cc
index 12ac7068..842266a 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h"
+#include "partition_alloc/partition_alloc_base/debug/alias.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
 
 namespace partition_alloc::internal::base::debug {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h
index 2289c39d..f72d042 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h
@@ -7,7 +7,7 @@
 
 #include <stddef.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal::base::debug {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.cc
index e789c541..28a630c 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.h"
+#include "partition_alloc/partition_alloc_base/debug/stack_trace.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/process/process_handle.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread.h"
 
 #include <stdint.h>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.h
index 740529a..24c1deb4 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.h
@@ -8,9 +8,9 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
 
 namespace partition_alloc::internal::base::debug {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_android.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_android.cc
index bb945a3..65e6e43 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_android.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_android.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.h"
+#include "partition_alloc/partition_alloc_base/debug/stack_trace.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
 
 #include <string.h>
 #include <unistd.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_linux.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_linux.cc
index 6c61163..f9dfe86 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_linux.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_linux.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.h"
+#include "partition_alloc/partition_alloc_base/debug/stack_trace.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
 
 namespace partition_alloc::internal::base::debug {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_mac.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_mac.cc
index be4678d..4fc9155 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_mac.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_mac.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.h"
+#include "partition_alloc/partition_alloc_base/debug/stack_trace.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
 
 // Surprisingly, uClibc defines __GLIBC__ in some build configs, but
 // execinfo.h and backtrace(3) are really only present in glibc and in macOS
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_posix.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_posix.cc
index caa5791..3fed895c 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_posix.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_posix.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.h"
+#include "partition_alloc/partition_alloc_base/debug/stack_trace.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/eintr_wrapper.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/posix/eintr_wrapper.h"
+#include "partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
 
 #include <fcntl.h>
 #include <string.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_win.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_win.cc
index dd347d0..00b34f17 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_win.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_win.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.h"
+#include "partition_alloc/partition_alloc_base/debug/stack_trace.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/process/process_handle.h"
+#include "partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
 
 #include <windows.h>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.cc
index 3700c7f..dfa436a 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.h"
+#include "partition_alloc/partition_alloc_base/files/file_path.h"
 
 #include <string.h>
 #include <algorithm>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/check.h"
 
 #if BUILDFLAG(IS_WIN)
 #include <windows.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.h
index 609d49cb..76e98af 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.h
@@ -106,8 +106,8 @@
 #include <iosfwd>
 #include <string>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 // Windows-style drive letter support and pathname separator characters can be
 // enabled and disabled independently, to aid testing.  These #defines are
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path_pa_unittest.cc
index 33cde7b..43f7296 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path_pa_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.h"
+#include "partition_alloc/partition_alloc_base/files/file_path.h"
 
 #include <stddef.h>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util.h
index cd80918f..89e95d01 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util.h
@@ -12,8 +12,8 @@
 #include <stdint.h>
 #include <stdio.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
 #include <sys/stat.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util_posix.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util_posix.cc
index ed3754ca..ac1795d 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util_posix.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util_posix.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util.h"
+#include "partition_alloc/partition_alloc_base/files/file_util.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/eintr_wrapper.h"
+#include "partition_alloc/partition_alloc_base/posix/eintr_wrapper.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.cc
index 1074ab10b..3c9e10e 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.h"
+#include "partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.h"
 
 #include <zircon/status.h>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.h
index 0f17854..879c8fe 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.h
@@ -8,10 +8,10 @@
 #include <lib/fit/function.h>
 #include <zircon/types.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
 
 // Use the PA_ZX_LOG family of macros along with a zx_status_t containing a
 // Zircon error. The error value will be decoded so that logged messages explain
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging_pa_unittest.cc
index f020680..271d4483 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging_pa_unittest.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.h"
+#include "partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.h"
 
 #include <fuchsia/logger/cpp/fidl.h>
 #include <lib/fidl/cpp/binding.h>
 #include <lib/sys/cpp/component_context.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.h
index bdc7b31b..cde4453 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.h
@@ -7,7 +7,7 @@
 
 #include <stdint.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal::base::ios {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.mm b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.mm
index 1772b46..499b892f 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.mm
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.mm
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.h"
+#include "partition_alloc/partition_alloc_base/ios/ios_util.h"
 
 #include <array>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info.h"
+#include "partition_alloc/partition_alloc_base/system/sys_info.h"
 
 namespace partition_alloc::internal::base::ios {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/log_message.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/log_message.cc
index eee763a..5a9aa184 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/log_message.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/log_message.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/log_message.h"
+#include "partition_alloc/partition_alloc_base/log_message.h"
 
 // TODO(1151236): After finishing copying //base files to PA library, remove
 // defined(BASE_CHECK_H_) from here.
@@ -14,15 +14,15 @@
 #error "log_message.h should not include check.h"
 #endif
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/alias.h"
+#include "partition_alloc/partition_alloc_base/debug/stack_trace.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
+#include "partition_alloc/partition_alloc_base/strings/string_util.h"
+#include "partition_alloc/partition_alloc_base/strings/stringprintf.h"
 
 #if BUILDFLAG(IS_WIN)
 
@@ -40,7 +40,7 @@
 #endif
 
 #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.h"
+#include "partition_alloc/partition_alloc_base/posix/safe_strerror.h"
 #endif
 
 namespace partition_alloc::internal::logging {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/log_message.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/log_message.h
index 3be4c56..5751251 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/log_message.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/log_message.h
@@ -7,11 +7,11 @@
 
 #include <stddef.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/scoped_clear_last_error.h"
+#include "partition_alloc/partition_alloc_base/strings/cstring_builder.h"
 
 namespace partition_alloc::internal::logging {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.cc
index 275d54d..d4fd55d 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
 
 // TODO(1151236): After finishing copying //base files to PA library, remove
 // defined(BASE_CHECK_H_) from here.
@@ -14,10 +14,10 @@
 #error "logging.h should not include check.h"
 #endif
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/alias.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
 
 #include <algorithm>
 
@@ -40,7 +40,7 @@
 #include <unistd.h>
 #endif
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/eintr_wrapper.h"
+#include "partition_alloc/partition_alloc_base/posix/eintr_wrapper.h"
 
 namespace partition_alloc::internal::logging {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h
index fc641da..6c28fe2 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h
@@ -10,11 +10,11 @@
 #include <cassert>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/log_message.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/log_message.h"
 
 // TODO(1151236): Need to update the description, because logging for PA
 // standalone library was minimized.
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging_pa_unittest.cc
index 5fa8147..0f97804 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging_pa_unittest.cc
@@ -5,9 +5,9 @@
 #include <sstream>
 #include <string>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
 
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.h
index ed79036e..0ef49db7 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.h
@@ -8,7 +8,7 @@
 #include <AvailabilityMacros.h>
 #import <CoreGraphics/CoreGraphics.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal::base::mac {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.mm b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.mm
index 94b08d1f..e86d162e 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.mm
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.h"
+#include "partition_alloc/partition_alloc_base/mac/mac_util.h"
 
 #include <stddef.h>
 #include <string.h>
@@ -10,8 +10,8 @@
 #include <sys/types.h>
 #include <sys/utsname.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
 
 // This is a simplified version of base::mac. Because
 // "base/strings/string_split.h" is unavailable, only provide access to the
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size.h
index ffbb707..698eb2a 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size.h
@@ -7,7 +7,7 @@
 
 #include <stddef.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size_posix.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size_posix.cc
index b11857d4..245bc58 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size_posix.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size_posix.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size.h"
+#include "partition_alloc/partition_alloc_base/memory/page_size.h"
 
 #include <unistd.h>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size_win.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size_win.cc
index 6f41c08..e5bfb76e 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size_win.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size_win.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size.h"
+#include "partition_alloc/partition_alloc_base/memory/page_size.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/ref_counted.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/ref_counted.cc
index 06594af..8bbff1c6 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/ref_counted.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/ref_counted.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/ref_counted.h"
+#include "partition_alloc/partition_alloc_base/memory/ref_counted.h"
 
 #include <limits>
 #include <ostream>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
 
 namespace partition_alloc::internal::base::subtle {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/ref_counted.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/ref_counted.h
index 5bcd35c..78f99c6 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/ref_counted.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/ref_counted.h
@@ -5,13 +5,13 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_MEMORY_REF_COUNTED_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_MEMORY_REF_COUNTED_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/atomic_ref_count.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/scoped_refptr.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/atomic_ref_count.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/memory/scoped_refptr.h"
 
 namespace partition_alloc::internal::base {
 namespace subtle {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/scoped_refptr.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/scoped_refptr.h
index f438df4..fc0a786 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/scoped_refptr.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/scoped_refptr.h
@@ -11,8 +11,8 @@
 #include <type_traits>
 #include <utility>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.cc
index 461e8cf..23ab7a3 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.h"
+#include "partition_alloc/partition_alloc_base/native_library.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.h
index aa95ecb..ff37c5eb 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.h
@@ -10,9 +10,9 @@
 
 #include <string>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/files/file_path.h"
 
 #if BUILDFLAG(IS_WIN)
 #include <windows.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library_pa_unittest.cc
index fd15483..82d28c1 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library_pa_unittest.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.h"
+#include "partition_alloc/partition_alloc_base/native_library.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.h"
+#include "partition_alloc/partition_alloc_base/files/file_path.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace partition_alloc::internal::base {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library_posix.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library_posix.cc
index f410115..54611f9 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library_posix.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library_posix.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.h"
+#include "partition_alloc/partition_alloc_base/native_library.h"
 
 #include <dlfcn.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/files/file_path.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h
index 7bb1cdd69..71655a1e 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h
@@ -5,7 +5,7 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_NOTREACHED_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_NOTREACHED_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/check.h"
 
 // PA_NOTREACHED() annotates paths that are supposed to be unreachable. They
 // crash if they are ever hit.
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math.h
index 3d1c765..495594a 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math.h
@@ -10,7 +10,7 @@
 #include <limits>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math_impl.h"
+#include "partition_alloc/partition_alloc_base/numerics/checked_math_impl.h"
 
 namespace partition_alloc::internal::base {
 namespace internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math_impl.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math_impl.h
index ea32015..12a8c5cb 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math_impl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math_impl.h
@@ -14,8 +14,8 @@
 #include <limits>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_shared_impl.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_math_shared_impl.h"
 
 namespace partition_alloc::internal::base::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/clamped_math.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/clamped_math.h
index ec382b24..e89480f 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/clamped_math.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/clamped_math.h
@@ -10,7 +10,7 @@
 #include <limits>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/clamped_math_impl.h"
+#include "partition_alloc/partition_alloc_base/numerics/clamped_math_impl.h"
 
 namespace partition_alloc::internal::base {
 namespace internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/clamped_math_impl.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/clamped_math_impl.h
index ef96b9e..a0fdf3a7 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/clamped_math_impl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/clamped_math_impl.h
@@ -14,9 +14,9 @@
 #include <limits>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_shared_impl.h"
+#include "partition_alloc/partition_alloc_base/numerics/checked_math.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_math_shared_impl.h"
 
 namespace partition_alloc::internal::base::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h
index ae069f5e..17e4c68 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h
@@ -11,10 +11,10 @@
 #include <limits>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions_impl.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions_impl.h"
 
 #if defined(__ARMEL__) && !defined(__native_client__)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions_arm_impl.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions_arm_impl.h"
 #define PA_BASE_HAS_OPTIMIZED_SAFE_CONVERSIONS (1)
 #else
 #define PA_BASE_HAS_OPTIMIZED_SAFE_CONVERSIONS (0)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions_arm_impl.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions_arm_impl.h
index 25c24c9f..5e0af67 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions_arm_impl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions_arm_impl.h
@@ -9,7 +9,7 @@
 #include <limits>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions_impl.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions_impl.h"
 
 namespace partition_alloc::internal::base::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math.h
index 00a20aa..d664df5 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math.h
@@ -5,8 +5,8 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_NUMERICS_SAFE_MATH_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_NUMERICS_SAFE_MATH_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/clamped_math.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
+#include "partition_alloc/partition_alloc_base/numerics/checked_math.h"
+#include "partition_alloc/partition_alloc_base/numerics/clamped_math.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
 
 #endif  // BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_NUMERICS_SAFE_MATH_H_
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_arm_impl.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_arm_impl.h
index ea1e053..d4ae826c 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_arm_impl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_arm_impl.h
@@ -8,7 +8,7 @@
 #include <cassert>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
 
 namespace partition_alloc::internal::base::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_clang_gcc_impl.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_clang_gcc_impl.h
index 49fd9be..e44cb4fd 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_clang_gcc_impl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_clang_gcc_impl.h
@@ -9,10 +9,10 @@
 #include <limits>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
 
 #if !defined(__native_client__) && (defined(__ARMEL__) || defined(__arch64__))
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_arm_impl.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_math_arm_impl.h"
 #define PA_BASE_HAS_ASSEMBLER_SAFE_MATH (1)
 #else
 #define PA_BASE_HAS_ASSEMBLER_SAFE_MATH (0)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_shared_impl.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_shared_impl.h
index 0d4846ad..ec66088 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_shared_impl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_shared_impl.h
@@ -15,8 +15,8 @@
 #include <limits>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
 
 #if BUILDFLAG(IS_ASMJS)
 // Optimized safe math instructions are incompatible with asmjs.
@@ -27,7 +27,7 @@
       ((__clang_major__ > 3) ||                            \
        (__clang_major__ == 3 && __clang_minor__ >= 4))) || \
      (defined(__GNUC__) && __GNUC__ >= 5))
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math_clang_gcc_impl.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_math_clang_gcc_impl.h"
 #define PA_BASE_HAS_OPTIMIZED_SAFE_MATH (1)
 #else
 #define PA_BASE_HAS_OPTIMIZED_SAFE_MATH (0)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.cc
index b779ff15..875a3e4 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.h"
+#include "partition_alloc/partition_alloc_base/posix/safe_strerror.h"
 
 #include <errno.h>
 #include <stdio.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.h
index 9af43a81..d6d3a02 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.h
@@ -9,7 +9,7 @@
 
 #include <string>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle.h
index f42fb158..ad90499 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle.h
@@ -8,11 +8,11 @@
 #include <stdint.h>
 #include <sys/types.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 #if BUILDFLAG(IS_WIN)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/windows_types.h"
+#include "partition_alloc/partition_alloc_base/win/windows_types.h"
 #endif
 
 #if BUILDFLAG(IS_FUCHSIA)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_posix.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_posix.cc
index f807f93e..8989883 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_posix.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_posix.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle.h"
+#include "partition_alloc/partition_alloc_base/process/process_handle.h"
 
 #include <unistd.h>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_win.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_win.cc
index 1eed450..9fcc809 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_win.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_win.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle.h"
+#include "partition_alloc/partition_alloc_base/process/process_handle.h"
 
 #include <windows.h>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.cc
index 00f1721..d98573f 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.h"
+#include "partition_alloc/partition_alloc_base/rand_util.h"
 
 #include <limits.h>
 #include <math.h>
@@ -10,7 +10,7 @@
 
 #include <limits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/check.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.h
index d4ae730..fa695be 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.h
@@ -8,8 +8,8 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc {
 class RandomGenerator;
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_fuchsia.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_fuchsia.cc
index b19fed7..e3e7773 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_fuchsia.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_fuchsia.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.h"
+#include "partition_alloc/partition_alloc_base/rand_util.h"
 
 #include <zircon/syscalls.h>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_pa_unittest.cc
index 550c00e3..757c09b 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_pa_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.h"
+#include "partition_alloc/partition_alloc_base/rand_util.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -13,9 +13,9 @@
 #include <memory>
 #include <vector>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace partition_alloc::internal::base {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_posix.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_posix.cc
index 20d4c66c..ede860c8 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_posix.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_posix.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.h"
+#include "partition_alloc/partition_alloc_base/rand_util.h"
 
 #include <errno.h>
 #include <fcntl.h>
@@ -12,12 +12,12 @@
 #include <unistd.h>
 #include <sstream>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/eintr_wrapper.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/files/file_util.h"
+#include "partition_alloc/partition_alloc_base/no_destructor.h"
+#include "partition_alloc/partition_alloc_base/posix/eintr_wrapper.h"
 
 #if BUILDFLAG(IS_MAC)
 // TODO(crbug.com/995996): Waiting for this header to appear in the iOS SDK.
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_win.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_win.cc
index 91271c5d..5c26c4c 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_win.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_win.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.h"
+#include "partition_alloc/partition_alloc_base/rand_util.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -11,7 +11,7 @@
 #include <algorithm>
 #include <limits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/check.h"
 
 // Prototype for ProcessPrng.
 // See: https://learn.microsoft.com/en-us/windows/win32/seccng/processprng
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error.h
index 7c1cef44..d1ef631 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error.h
@@ -7,8 +7,8 @@
 
 #include <errno.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_pa_unittest.cc
index 2bbfee2..1856abd1 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_pa_unittest.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error.h"
+#include "partition_alloc/partition_alloc_base/scoped_clear_last_error.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if BUILDFLAG(IS_WIN)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_win.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_win.cc
index a4c9549..e6ebe6a 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_win.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_win.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error.h"
+#include "partition_alloc/partition_alloc_base/scoped_clear_last_error.h"
 
 #include <windows.h>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.cc
index 290b77b3..4e8262d 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.h"
+#include "partition_alloc/partition_alloc_base/strings/cstring_builder.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
 
 #if !BUILDFLAG(IS_WIN)
 #include <unistd.h>
@@ -16,7 +16,7 @@
 #include <cstring>
 
 #if BUILDFLAG(PA_DCHECK_IS_ON)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/check.h"
 #define PA_RAW_DCHECK PA_RAW_CHECK
 #else
 #define PA_RAW_DCHECK(x) \
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.h
index 45cdbe4d..457596f3 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.h
@@ -5,8 +5,8 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_STRINGS_CSTRING_BUILDER_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_STRINGS_CSTRING_BUILDER_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 #include <cstddef>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder_pa_unittest.cc
index 865fbe7a..c480242 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder_pa_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.h"
+#include "partition_alloc/partition_alloc_base/strings/cstring_builder.h"
 
 #include <cmath>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.cc
index 777089c7..5a3a948 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
+#include "partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
 
 #include <errno.h>
 #include <string.h>
@@ -34,7 +34,7 @@
 //        errno = 13 (Access denied)
 //      In most of the anticipated use cases, that's probably the preferred
 //      behavior.
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/check.h"
 #define DEBUG_CHECK PA_RAW_CHECK
 #else
 #define DEBUG_CHECK(x) \
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.h
index 723a02a6..2d62f65e 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.h
@@ -5,10 +5,11 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_STRINGS_SAFE_SPRINTF_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_STRINGS_SAFE_SPRINTF_H_
 
-#include <stddef.h>
 #include <stdint.h>
 #include <stdlib.h>
 
+#include <cstddef>
+
 #include "build/build_config.h"
 
 #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
@@ -16,7 +17,7 @@
 #include <unistd.h>
 #endif
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal::base::strings {
 
@@ -178,18 +179,20 @@
     integer.width = sizeof(long long);
   }
 
-  // nullptr_t would be ambiguous between char* and const char*; to get
+  // std::nullptr_t would be ambiguous between char* and const char*; to get
   // consistent behavior with NULL, which prints with all three of %d, %p, and
   // %s, treat it as an integer zero internally.
   //
   // Warning: don't just do Arg(NULL) here because in some libcs, NULL is an
-  // alias for nullptr!
-  Arg(nullptr_t p) : type(INT) {
+  // alias for std::nullptr!
+  //
+  // NOLINTNEXTLINE(runtime/explicit)
+  Arg(std::nullptr_t p) : type(INT) {
     integer.i = 0;
     // Internally, SafeSprintf expects to represent nulls as integers whose
     // width is equal to sizeof(NULL), which is not necessarily equal to
-    // sizeof(nullptr_t) - eg, on Windows, NULL is defined to 0 (with size 4)
-    // while nullptr_t is of size 8.
+    // sizeof(std::nullptr_t) - eg, on Windows, NULL is defined to 0 (with size
+    // 4) while std::nullptr_t is of size 8.
     integer.width = sizeof(NULL);
   }
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf_pa_unittest.cc
index afef569..7fca0a6 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf_pa_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
+#include "partition_alloc/partition_alloc_base/strings/safe_sprintf.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -12,9 +12,9 @@
 #include <limits>
 #include <memory>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 // Death tests on Android are currently very flaky. No need to add more flaky
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.cc
index a4b4350..ef124f3 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.h"
+#include "partition_alloc/partition_alloc_base/strings/string_util.h"
 
 #include <cstring>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.h
index 597f74c..d3a96c9c 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.h
@@ -5,7 +5,7 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_STRINGS_STRING_UTIL_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_STRINGS_STRING_UTIL_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal::base::strings {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util_pa_unittest.cc
index d864335..5e8175f 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util_pa_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.h"
+#include "partition_alloc/partition_alloc_base/strings/string_util.h"
 
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.cc
index 3d290182..cd17864a 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.h"
+#include "partition_alloc/partition_alloc_base/strings/stringprintf.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/scoped_clear_last_error.h"
 
 #include <stdarg.h>
 #include <stdio.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.h
index 67733c6..d727a27d 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.h
@@ -9,9 +9,9 @@
 
 #include <string>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf_pa_unittest.cc
index d3f673d..45f025c 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf_pa_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.h"
+#include "partition_alloc/partition_alloc_base/strings/stringprintf.h"
 
 #include <errno.h>
 #include <stddef.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info.h
index d9e12ff..ad1fc37 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info.h
@@ -7,7 +7,7 @@
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info_ios.mm b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info_ios.mm
index 324af9d9f5..0082bcb13 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info_ios.mm
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info_ios.mm
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info.h"
+#include "partition_alloc/partition_alloc_base/system/sys_info.h"
 
 #import <Foundation/Foundation.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info_mac.mm b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info_mac.mm
index b420af9..20a4205 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info_mac.mm
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info_mac.mm
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/system/sys_info.h"
+#include "partition_alloc/partition_alloc_base/system/sys_info.h"
 
 #import <Foundation/Foundation.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h
index 61f1348b..7d805609 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h
@@ -37,8 +37,8 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_THREAD_ANNOTATIONS_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_THREAD_ANNOTATIONS_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
 
 #if defined(__clang__)
 #define PA_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations_pa_nocompile.nc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations_pa_nocompile.nc
index f056a47..22f2d48 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations_pa_nocompile.nc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations_pa_nocompile.nc
@@ -5,7 +5,7 @@
 // This is a "No Compile Test" suite.
 // https://dev.chromium.org/developers/testing/no-compile-tests
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
 
 namespace {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations_pa_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations_pa_unittest.cc
index 5384e479..798d363 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations_pa_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations_pa_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.cc
index 8f18536c..855deda 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h
index 043c4b3..3191828 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h
@@ -13,13 +13,13 @@
 
 #include <iosfwd>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_ref.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_ref.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
 
 #if BUILDFLAG(IS_WIN)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/windows_types.h"
+#include "partition_alloc/partition_alloc_base/win/windows_types.h"
 #elif BUILDFLAG(IS_FUCHSIA)
 #include <zircon/types.h>
 #elif BUILDFLAG(IS_APPLE)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_android_for_testing.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_android_for_testing.cc
index 7a846b1..427e3ca 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_android_for_testing.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_android_for_testing.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
 
 #include <pthread.h>
 #include <stddef.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_apple_for_testing.mm b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_apple_for_testing.mm
index 77374bc..875f5872 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_apple_for_testing.mm
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_apple_for_testing.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
 
 #import <Foundation/Foundation.h>
 #include <mach/mach.h>
@@ -15,8 +15,8 @@
 #include <algorithm>
 #include <atomic>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/check.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h
index b1fd67d..e5d8f93 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h
@@ -13,8 +13,8 @@
 
 #include <iosfwd>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_fuchsia_for_testing.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_fuchsia_for_testing.cc
index 8454d37..fa9bb91 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_fuchsia_for_testing.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_fuchsia_for_testing.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
 
 #include <pthread.h>
 #include <stddef.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_internal_posix.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_internal_posix.h
index 3c53be4..90b829f 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_internal_posix.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_internal_posix.h
@@ -5,8 +5,8 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_THREADING_PLATFORM_THREAD_INTERNAL_POSIX_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_THREADING_PLATFORM_THREAD_INTERNAL_POSIX_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal::base::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_linux_for_testing.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_linux_for_testing.cc
index 0f0e4b40..692c31126 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_linux_for_testing.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_linux_for_testing.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
 
 #include <pthread.h>
 #include <stddef.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix.cc
index eaa6d4a..e06cc32 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread.h"
 
 #include <errno.h>
 #include <pthread.h>
@@ -12,10 +12,10 @@
 #include <sys/types.h>
 #include <unistd.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_internal_posix.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_internal_posix.h"
 
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 #include <sys/syscall.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix_for_testing.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix_for_testing.cc
index 250de61..daac1c3 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix_for_testing.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix_for_testing.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
 
 #include <errno.h>
 #include <pthread.h>
@@ -14,11 +14,11 @@
 #include <unistd.h>
 #include <memory>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_internal_posix.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_internal_posix.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 #if BUILDFLAG(IS_FUCHSIA)
 #include <zircon/process.h>
@@ -27,8 +27,8 @@
 #endif
 
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && BUILDFLAG(USE_STARSCAN)
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.h"
+#include "partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/starscan/stack/stack.h"
 #endif
 
 namespace partition_alloc::internal::base {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_ref.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_ref.h
index 47d40a8..41dc705 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_ref.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_ref.h
@@ -12,11 +12,11 @@
 
 #include <iosfwd>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 #if BUILDFLAG(IS_WIN)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/windows_types.h"
+#include "partition_alloc/partition_alloc_base/win/windows_types.h"
 #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
 #include <pthread.h>
 #endif
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_win.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_win.cc
index c2e9028e..17caae7 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_win.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_win.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread.h"
 
 #include <stddef.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.h"
+#include "partition_alloc/partition_alloc_base/time/time_override.h"
 
 #include <windows.h>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_win_for_testing.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_win_for_testing.cc
index 466ff0e..7588139 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_win_for_testing.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_win_for_testing.cc
@@ -2,21 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
 
 #include <stddef.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/oom.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
 #include "build/build_config.h"
+#include "partition_alloc/oom.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/debug/alias.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 #include <windows.h>
 
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && BUILDFLAG(USE_STARSCAN)
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.h"
+#include "partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/starscan/stack/stack.h"
 #endif
 
 namespace partition_alloc::internal::base {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.cc
index 184c66b..8d4fc033 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
 
 #include <atomic>
 #include <cmath>
@@ -11,7 +11,7 @@
 #include <tuple>
 #include <utility>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.h"
+#include "partition_alloc/partition_alloc_base/time/time_override.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h
index 52550a0..180132e2 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h
@@ -68,14 +68,14 @@
 #include <iosfwd>
 #include <limits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/chromeos_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/clamped_math.h"
 #include "build/build_config.h"
+#include "partition_alloc/chromeos_buildflags.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/numerics/clamped_math.h"
 
 #if BUILDFLAG(IS_APPLE)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 #endif  // BUILDFLAG(IS_APPLE)
 
 #if BUILDFLAG(IS_FUCHSIA)
@@ -99,7 +99,7 @@
 #endif
 
 #if BUILDFLAG(IS_WIN)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/windows_types.h"
+#include "partition_alloc/partition_alloc_base/win/windows_types.h"
 
 namespace ABI {
 namespace Windows {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_android.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_android.cc
index 52845a5..1d36482 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_android.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_android.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_apple.mm b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_apple.mm
index 0e05d4b9..77a95d0 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_apple.mm
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_apple.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
 
 #import <Foundation/Foundation.h>
 #include <mach/mach.h>
@@ -18,11 +18,11 @@
 #include <errno.h>
 #endif
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
+#include "partition_alloc/partition_alloc_base/time/time_override.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_conversion_posix.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_conversion_posix.cc
index 0544c1d..9a734b20 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_conversion_posix.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_conversion_posix.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
 
 #include <stdint.h>
 #include <sys/time.h>
@@ -10,7 +10,7 @@
 
 #include <limits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/check.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_fuchsia.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_fuchsia.cc
index 45f5127c..475b49d 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_fuchsia.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_fuchsia.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
 
 #include <threads.h>
 #include <zircon/syscalls.h>
 #include <zircon/threads.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/time/time_override.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_now_posix.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_now_posix.cc
index 47da2d59..da9e7e3 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_now_posix.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_now_posix.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
 
 #include <stdint.h>
 #include <sys/time.h>
@@ -14,10 +14,10 @@
 #endif
 #include <unistd.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_math.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/notreached.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_math.h"
+#include "partition_alloc/partition_alloc_base/time/time_override.h"
 
 // Ensure the Fuchsia and Mac builds do not include this module. Instead,
 // non-POSIX implementation is used for sampling the system clocks.
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.cc
index f0a1d24..b1c4c925 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.h"
+#include "partition_alloc/partition_alloc_base/time/time_override.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/check.h"
 
 namespace partition_alloc::internal::base::subtle {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.h
index 1763774a..689282a 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.h
@@ -7,9 +7,9 @@
 
 #include <atomic>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_win.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_win.cc
index 8c09a3ac..0958c37 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_win.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_win.cc
@@ -30,7 +30,7 @@
 // will only increase the system-wide timer if we're not running on battery
 // power.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
 
 #include <windows.foundation.h>
 #include <windows.h>
@@ -41,12 +41,12 @@
 
 #include <atomic>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bit_cast.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/bit_cast.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/cpu.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread.h"
+#include "partition_alloc/partition_alloc_base/time/time_override.h"
 
 namespace partition_alloc::internal::base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/win_handle_types.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/win_handle_types.h
index 0783dec4..9a227c97 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/win_handle_types.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/win_handle_types.h
@@ -10,7 +10,7 @@
 #define PA_WINDOWS_HANDLE_TYPE(name) \
   struct name##__;                   \
   typedef struct name##__* name;
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/win_handle_types_list.inc"
+#include "partition_alloc/partition_alloc_base/win/win_handle_types_list.inc"
 #undef PA_WINDOWS_HANDLE_TYPE
 
 #endif  // BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_BASE_WIN_WIN_HANDLE_TYPES_H_
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h
index d9adfaf..1788a7fb 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h
@@ -7,14 +7,14 @@
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
 #include "build/build_config.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/debug/alias.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 // When PartitionAlloc is used as the default allocator, we cannot use the
 // regular (D)CHECK() macros, as they allocate internally. When an assertion is
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h
index 595c713..6a4c471 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h
@@ -5,9 +5,9 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_CONFIG_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_CONFIG_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 // PA_CONFIG() uses a similar trick as BUILDFLAG() to allow the compiler catch
 // typos or a missing #include.
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h
index 889d3c1..1f5b3db6 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h
@@ -10,21 +10,21 @@
 #include <cstddef>
 #include <limits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_types.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/flags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_pool_manager_types.h"
+#include "partition_alloc/flags.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_forward.h"
 
 #if BUILDFLAG(IS_APPLE) && defined(ARCH_CPU_64_BITS)
 #include <mach/vm_page_size.h>
 #endif
 
 #if PA_CONFIG(HAS_MEMORY_TAGGING)
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
+#include "partition_alloc/tagging.h"
 #endif
 
 namespace partition_alloc {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h
index f62db07..a1a4b0082 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h
@@ -5,7 +5,7 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_FOR_TESTING_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_ALLOC_FOR_TESTING_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc.h"
 
 namespace partition_alloc {
 namespace internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h
index 5087809..89440d4 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h
@@ -10,11 +10,11 @@
 #include <cstdint>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_config.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.cc
index 47be84c..209ac547 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.h"
+#include "partition_alloc/partition_alloc_hooks.h"
 
 #include <ostream>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_lock.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.h b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.h
index 4e74b19..64361a6 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.h
@@ -8,9 +8,9 @@
 #include <atomic>
 #include <cstddef>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_constants.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_perftest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_perftest.cc
index 2c5505f..f4918f3 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_perftest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_perftest.cc
@@ -8,20 +8,20 @@
 #include <memory>
 #include <vector>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/extended_api.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_cache.h"
 #include "base/debug/debugging_buildflags.h"
 #include "base/timer/lap_timer.h"
 #include "build/build_config.h"
+#include "partition_alloc/extended_api.h"
+#include "partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/strings/stringprintf.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_for_testing.h"
+#include "partition_alloc/partition_root.h"
+#include "partition_alloc/thread_cache.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/perf/perf_result_reporter.h"
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc
index 139ef0f0..ce78d35 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h"
+#include "partition_alloc/partition_alloc_for_testing.h"
 
 #include <algorithm>
 #include <cstddef>
@@ -17,40 +17,40 @@
 #include <tuple>
 #include <vector>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/chromecast_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_cookie.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_stats.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h"
 #include "base/system/sys_info.h"
 #include "base/test/gtest_util.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_space_randomization.h"
+#include "partition_alloc/chromecast_buildflags.h"
+#include "partition_alloc/dangling_raw_ptr_checks.h"
+#include "partition_alloc/freeslot_bitmap.h"
+#include "partition_alloc/lightweight_quarantine.h"
+#include "partition_alloc/memory_reclaimer.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/cpu.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/numerics/checked_math.h"
+#include "partition_alloc/partition_alloc_base/rand_util.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_bucket.h"
+#include "partition_alloc/partition_cookie.h"
+#include "partition_alloc/partition_freelist_entry.h"
+#include "partition_alloc/partition_page.h"
+#include "partition_alloc/partition_ref_count.h"
+#include "partition_alloc/partition_root.h"
+#include "partition_alloc/partition_stats.h"
+#include "partition_alloc/reservation_offset_table.h"
+#include "partition_alloc/tagging.h"
+#include "partition_alloc/thread_isolation/thread_isolation.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if defined(__ARM_FEATURE_MEMORY_TAGGING)
@@ -74,7 +74,7 @@
 #endif
 
 #if BUILDFLAG(IS_MAC)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.h"
+#include "partition_alloc/partition_alloc_base/mac/mac_util.h"
 #endif
 
 #if BUILDFLAG(ENABLE_PKEYS)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.cc
index 51f2c9b..bec02a01 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.cc
@@ -2,41 +2,41 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h"
+#include "partition_alloc/partition_bucket.h"
 
 #include <algorithm>
 #include <cstdint>
 #include <tuple>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/oom.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_direct_map_extent.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_oom.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_pool_manager.h"
+#include "partition_alloc/freeslot_bitmap.h"
+#include "partition_alloc/freeslot_bitmap_constants.h"
+#include "partition_alloc/oom.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/alias.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_direct_map_extent.h"
+#include "partition_alloc/partition_oom.h"
+#include "partition_alloc/partition_page.h"
+#include "partition_alloc/reservation_offset_table.h"
+#include "partition_alloc/tagging.h"
 
 #if BUILDFLAG(USE_STARSCAN)
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/starscan/pcscan.h"
 #endif
 
 namespace partition_alloc::internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h b/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h
index ff8fca4..5a32154 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h
@@ -8,13 +8,13 @@
 #include <cstddef>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_page_constants.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_bucket_lookup.h b/base/allocator/partition_allocator/src/partition_alloc/partition_bucket_lookup.h
index 0c08630..2c0b74d 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_bucket_lookup.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_bucket_lookup.h
@@ -7,11 +7,11 @@
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_constants.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_cookie.h b/base/allocator/partition_allocator/src/partition_alloc/partition_cookie.h
index d031e287..c8205b1 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_cookie.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_cookie.h
@@ -5,9 +5,9 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_COOKIE_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_COOKIE_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.cc
index 4ba50c7..b68461a 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.h"
+#include "partition_alloc/partition_dcheck_helper.h"
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
+#include "partition_alloc/partition_bucket.h"
+#include "partition_alloc/partition_page.h"
+#include "partition_alloc/partition_root.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.h b/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.h
index 2170a67..e1f368a 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.h
@@ -5,10 +5,10 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_DCHECK_HELPER_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_DCHECK_HELPER_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_lock.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_direct_map_extent.h b/base/allocator/partition_allocator/src/partition_alloc/partition_direct_map_extent.h
index 23bac08..fd2f1eb 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_direct_map_extent.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_direct_map_extent.h
@@ -5,10 +5,10 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_DIRECT_MAP_EXTENT_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_DIRECT_MAP_EXTENT_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_bucket.h"
+#include "partition_alloc/partition_page.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.cc
index ed292d7..10ab7c6 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.h"
+#include "partition_alloc/partition_freelist_entry.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
+#include "partition_alloc/partition_alloc_check.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.h b/base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.h
index 5a43defa..3b3ad56 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.h
@@ -7,11 +7,11 @@
 
 #include <cstddef>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_constants.h"
 
 namespace partition_alloc::internal {
 
@@ -21,9 +21,9 @@
 }  // namespace partition_alloc::internal
 
 #if BUILDFLAG(USE_FREELIST_POOL_OFFSETS)
-#include "base/allocator/partition_allocator/src/partition_alloc/pool_offset_freelist.h"  // IWYU pragma: export
+#include "partition_alloc/pool_offset_freelist.h"  // IWYU pragma: export
 #else
-#include "base/allocator/partition_allocator/src/partition_alloc/encoded_next_freelist.h"  // IWYU pragma: export
+#include "partition_alloc/encoded_next_freelist.h"  // IWYU pragma: export
 #endif  // BUILDFLAG(USE_FREELIST_POOL_OFFSETS)
 
 namespace partition_alloc::internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_lock.h b/base/allocator/partition_allocator/src/partition_alloc/partition_lock.h
index b3b28db..ff08e2b 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_lock.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_lock.h
@@ -8,15 +8,15 @@
 #include <atomic>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/spinning_mutex.h"
+#include "partition_alloc/thread_isolation/thread_isolation.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_lock_perftest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_lock_perftest.cc
index 27503b5..1bf5c01 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_lock_perftest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_lock_perftest.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_lock.h"
 
 #include <vector>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
 #include "base/timer/lap_timer.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/perf/perf_result_reporter.h"
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_lock_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_lock_unittest.cc
index 2a3b01a..f60da826 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_lock_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_lock_unittest.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_lock.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace partition_alloc::internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_oom.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_oom.cc
index 1027801..17f1d61b 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_oom.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_oom.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_oom.h"
+#include "partition_alloc/partition_oom.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/oom.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h"
 #include "build/build_config.h"
+#include "partition_alloc/oom.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/debug/alias.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_oom.h b/base/allocator/partition_allocator/src/partition_alloc/partition_oom.h
index 640b1ca5..908d811 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_oom.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_oom.h
@@ -10,9 +10,9 @@
 
 #include <stddef.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_page.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_page.cc
index 920dc131d..babdb591 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_page.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_page.cc
@@ -2,27 +2,27 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
+#include "partition_alloc/partition_page.h"
 
 #include <algorithm>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_direct_map_extent.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
+#include "partition_alloc/address_pool_manager.h"
+#include "partition_alloc/freeslot_bitmap.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_direct_map_extent.h"
+#include "partition_alloc/partition_root.h"
+#include "partition_alloc/reservation_offset_table.h"
+#include "partition_alloc/tagging.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_page.h b/base/allocator/partition_allocator/src/partition_alloc/partition_page.h
index c2864322..03d8a22 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_page.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_page.h
@@ -7,37 +7,37 @@
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_types.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_superpage_extent_entry.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_pool_manager.h"
+#include "partition_alloc/address_pool_manager_types.h"
+#include "partition_alloc/freeslot_bitmap_constants.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_bucket.h"
+#include "partition_alloc/partition_dcheck_helper.h"
+#include "partition_alloc/partition_freelist_entry.h"
+#include "partition_alloc/partition_page_constants.h"
+#include "partition_alloc/partition_superpage_extent_entry.h"
+#include "partition_alloc/reservation_offset_table.h"
 
 #if BUILDFLAG(USE_STARSCAN)
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/state_bitmap.h"
+#include "partition_alloc/starscan/state_bitmap.h"
 #endif
 
 #if BUILDFLAG(PUT_REF_COUNT_IN_PREVIOUS_SLOT)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h"
+#include "partition_alloc/partition_ref_count.h"
 #endif
 
 #if BUILDFLAG(PA_DCHECK_IS_ON)
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
+#include "partition_alloc/tagging.h"
 #endif
 
 namespace partition_alloc::internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h b/base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h
index b7b1a81c..b0707c7 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h
@@ -5,9 +5,9 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_PAGE_CONSTANTS_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_PAGE_CONSTANTS_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_constants.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h b/base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h
index 0db9a26..eef678da2 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h
@@ -8,22 +8,22 @@
 #include <atomic>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
 #include "build/build_config.h"
+#include "partition_alloc/dangling_raw_ptr_checks.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/tagging.h"
 
 #if BUILDFLAG(IS_MAC)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/mac/mac_util.h"
 #endif  // BUILDFLAG(IS_MAC)
 
 namespace partition_alloc::internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
index d7ab6b3..25160d8 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
@@ -2,44 +2,44 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
+#include "partition_alloc/partition_root.h"
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/oom.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc-inl.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_cookie.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_oom.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h"
 #include "build/build_config.h"
+#include "partition_alloc/freeslot_bitmap.h"
+#include "partition_alloc/oom.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc-inl.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_bucket.h"
+#include "partition_alloc/partition_cookie.h"
+#include "partition_alloc/partition_oom.h"
+#include "partition_alloc/partition_page.h"
+#include "partition_alloc/partition_ref_count.h"
+#include "partition_alloc/reservation_offset_table.h"
+#include "partition_alloc/tagging.h"
+#include "partition_alloc/thread_isolation/thread_isolation.h"
 
 #if BUILDFLAG(IS_MAC)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.h"
+#include "partition_alloc/partition_alloc_base/mac/mac_util.h"
 #endif
 
 #if BUILDFLAG(USE_STARSCAN)
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/starscan/pcscan.h"
 #endif
 
 #if !BUILDFLAG(HAS_64_BIT_POINTERS)
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.h"
+#include "partition_alloc/address_pool_manager_bitmap.h"
 #endif
 
 #if BUILDFLAG(IS_WIN)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_root.h b/base/allocator/partition_allocator/src/partition_alloc/partition_root.h
index 275dab17..f5b8ef3 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_root.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_root.h
@@ -36,47 +36,47 @@
 #include <cstdint>
 #include <limits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_types.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/allocation_guard.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/chromecast_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc-inl.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_allocation_data.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/export_template.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_bucket_lookup.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_cookie.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_direct_map_extent.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_oom.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_cache.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_pool_manager_types.h"
+#include "partition_alloc/allocation_guard.h"
+#include "partition_alloc/chromecast_buildflags.h"
+#include "partition_alloc/freeslot_bitmap.h"
+#include "partition_alloc/lightweight_quarantine.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc-inl.h"
+#include "partition_alloc/partition_alloc_allocation_data.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/export_template.h"
+#include "partition_alloc/partition_alloc_base/no_destructor.h"
+#include "partition_alloc/partition_alloc_base/notreached.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_alloc_hooks.h"
+#include "partition_alloc/partition_bucket.h"
+#include "partition_alloc/partition_bucket_lookup.h"
+#include "partition_alloc/partition_cookie.h"
+#include "partition_alloc/partition_direct_map_extent.h"
+#include "partition_alloc/partition_freelist_entry.h"
+#include "partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_oom.h"
+#include "partition_alloc/partition_page.h"
+#include "partition_alloc/partition_ref_count.h"
+#include "partition_alloc/reservation_offset_table.h"
+#include "partition_alloc/tagging.h"
+#include "partition_alloc/thread_cache.h"
+#include "partition_alloc/thread_isolation/thread_isolation.h"
 
 #if BUILDFLAG(USE_STARSCAN)
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/starscan/pcscan.h"
 #endif
 
 namespace partition_alloc::internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_stats.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_stats.cc
index 19775e08..93a314a 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_stats.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_stats.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_stats.h"
+#include "partition_alloc/partition_stats.h"
 
 #include <cstring>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_stats.h b/base/allocator/partition_allocator/src/partition_alloc/partition_stats.h
index 76b8e8c..591fc84f 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_stats.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_stats.h
@@ -8,10 +8,10 @@
 #include <cstddef>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_superpage_extent_entry.h b/base/allocator/partition_allocator/src/partition_alloc/partition_superpage_extent_entry.h
index 8a9989f..a0cda4c 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_superpage_extent_entry.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_superpage_extent_entry.h
@@ -7,12 +7,12 @@
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_types.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h"
+#include "partition_alloc/address_pool_manager.h"
+#include "partition_alloc/address_pool_manager_types.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_dcheck_helper.h"
+#include "partition_alloc/reservation_offset_table.h"
 
 // Should not include partition_root.h, partition_bucket.h, partition_page.h.
 // For IsQuarantineAllowed(), use partition_dcheck_helper.h instead of
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_tls.h b/base/allocator/partition_allocator/src/partition_alloc/partition_tls.h
index 44ceba2..df8a95c2 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_tls.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_tls.h
@@ -5,18 +5,18 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_TLS_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_PARTITION_TLS_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
+#include "partition_alloc/partition_alloc_check.h"
 
 #if BUILDFLAG(IS_POSIX)
 #include <pthread.h>
 #endif
 
 #if BUILDFLAG(IS_WIN)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/windows_types.h"
+#include "partition_alloc/partition_alloc_base/win/windows_types.h"
 #endif
 
 // Barebones TLS implementation for use in PartitionAlloc. This doesn't use the
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_tls_win.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_tls_win.cc
index 5caf32e..e28ffe8 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_tls_win.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_tls_win.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_tls.h"
+#include "partition_alloc/partition_tls.h"
 
 #include <windows.h>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h
index a70a181..fc4ac9b 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h
@@ -13,25 +13,25 @@
 #include <type_traits>
 #include <utility>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/flags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_exclusion.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/raw_ptr_buildflags.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
+#include "partition_alloc/flags.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/pointers/raw_ptr_exclusion.h"
+#include "partition_alloc/raw_ptr_buildflags.h"
 
 #if BUILDFLAG(IS_WIN)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/win_handle_types.h"
+#include "partition_alloc/partition_alloc_base/win/win_handle_types.h"
 #endif
 
 #if BUILDFLAG(USE_PARTITION_ALLOC)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_base/check.h"
 // Live implementation of MiraclePtr being built.
 #if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) || \
     BUILDFLAG(USE_ASAN_BACKUP_REF_PTR)
@@ -50,13 +50,13 @@
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC)
 
 #if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT)
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h"
+#include "partition_alloc/pointers/raw_ptr_backup_ref_impl.h"
 #elif BUILDFLAG(USE_ASAN_UNOWNED_PTR)
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.h"
+#include "partition_alloc/pointers/raw_ptr_asan_unowned_impl.h"
 #elif BUILDFLAG(USE_HOOKABLE_RAW_PTR)
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h"
+#include "partition_alloc/pointers/raw_ptr_hookable_impl.h"
 #else
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_noop_impl.h"
+#include "partition_alloc/pointers/raw_ptr_noop_impl.h"
 #endif
 
 namespace cc {
@@ -213,7 +213,7 @@
   struct IsSupportedType<name##__, void> { \
     static constexpr bool value = false;   \
   };
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/win_handle_types_list.inc"
+#include "partition_alloc/partition_alloc_base/win/win_handle_types_list.inc"
 #undef PA_WINDOWS_HANDLE_TYPE
 #endif
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.cc b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.cc
index 3a43be20..2ecddf5 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.h"
+#include "partition_alloc/pointers/raw_ptr_asan_unowned_impl.h"
 
 #include <sanitizer/asan_interface.h>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
 
 namespace base::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.h
index 536d7ec3..bb63e34 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.h
@@ -9,10 +9,10 @@
 
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_forward.h"
 
 #if !BUILDFLAG(USE_ASAN_UNOWNED_PTR)
 #error "Included under wrong build option"
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.cc b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.cc
index 09ba441..ea52bc2 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.cc
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h"
+#include "partition_alloc/pointers/raw_ptr_backup_ref_impl.h"
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_ref_count.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h"
+#include "partition_alloc/dangling_raw_ptr_checks.h"
+#include "partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_ref_count.h"
+#include "partition_alloc/partition_root.h"
+#include "partition_alloc/reservation_offset_table.h"
 
 namespace base::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h
index 34fffbfa..3f08aa7 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.h
@@ -9,20 +9,20 @@
 
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/chromeos_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
 #include "build/build_config.h"
+#include "partition_alloc/chromeos_buildflags.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/tagging.h"
 
 #if !BUILDFLAG(HAS_64_BIT_POINTERS)
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.h"
+#include "partition_alloc/address_pool_manager_bitmap.h"
 #endif
 
 #if !BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_counting_impl_for_test.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_counting_impl_for_test.h
index fa000f4..4724c959 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_counting_impl_for_test.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_counting_impl_for_test.h
@@ -7,8 +7,8 @@
 
 #include <climits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_noop_impl.h"
+#include "partition_alloc/pointers/raw_ptr.h"
+#include "partition_alloc/pointers/raw_ptr_noop_impl.h"
 
 namespace base::test {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_exclusion.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_exclusion.h
index 4b8eb7b..38a4146 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_exclusion.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_exclusion.h
@@ -7,9 +7,9 @@
 
 // This header will be leakily included even when
 // `!use_partition_alloc`, which is okay because it's a leaf header.
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"  // nogncheck
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"  // nogncheck
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 #if PA_HAS_ATTRIBUTE(annotate)
 #if defined(OFFICIAL_BUILD) && !BUILDFLAG(FORCE_ENABLE_RAW_PTR_EXCLUSION)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.cc b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.cc
index 9b71004..e23ee52 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h"
+#include "partition_alloc/pointers/raw_ptr_hookable_impl.h"
 
 #include <atomic>
 #include <cstdint>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h
index 2a1430c..336ef18 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.h
@@ -9,11 +9,11 @@
 
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/cxx20_is_constant_evaluated.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_forward.h"
 
 #if !BUILDFLAG(USE_HOOKABLE_RAW_PTR)
 #error "Included under wrong build option"
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_nocompile.nc b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_nocompile.nc
index 1b589d1..41e91f0e 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_nocompile.nc
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_nocompile.nc
@@ -11,8 +11,8 @@
 
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/pointers/raw_ptr.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 namespace {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_noop_impl.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_noop_impl.h
index 2fc12c6..5280577 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_noop_impl.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_noop_impl.h
@@ -7,8 +7,8 @@
 
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_forward.h"
 
 namespace base::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc
index fdf92412f..a7fd36f 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h"
+#include "partition_alloc/pointers/raw_ptr.h"
 
 #include <climits>
 #include <cstddef>
@@ -15,20 +15,6 @@
 
 #include "base/allocator/partition_alloc_features.h"
 #include "base/allocator/partition_alloc_support.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/chromeos_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc-inl.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_counting_impl_for_test.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_test_support.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
 #include "base/cpu.h"
 #include "base/cxx20_to_address.h"
 #include "base/logging.h"
@@ -41,6 +27,20 @@
 #include "base/test/task_environment.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
+#include "partition_alloc/chromeos_buildflags.h"
+#include "partition_alloc/dangling_raw_ptr_checks.h"
+#include "partition_alloc/partition_alloc-inl.h"
+#include "partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc_base/numerics/checked_math.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_hooks.h"
+#include "partition_alloc/partition_root.h"
+#include "partition_alloc/pointers/raw_ptr_counting_impl_for_test.h"
+#include "partition_alloc/pointers/raw_ptr_test_support.h"
+#include "partition_alloc/pointers/raw_ref.h"
+#include "partition_alloc/tagging.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref.h b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref.h
index 7a548fc..f389761 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref.h
@@ -9,11 +9,11 @@
 #include <type_traits>
 #include <utility>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/augmentations/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr.h"
+#include "partition_alloc/partition_alloc_base/augmentations/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/pointers/raw_ptr.h"
 
 namespace base {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_nocompile.nc b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_nocompile.nc
index 8f596d5..8c59a7e4 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_nocompile.nc
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_nocompile.nc
@@ -5,7 +5,7 @@
 // This is a "No Compile Test" suite.
 // http://dev.chromium.org/developers/testing/no-compile-tests
 
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref.h"
+#include "partition_alloc/pointers/raw_ref.h"
 
 namespace {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_unittest.cc
index 5249ea1..6daaab64 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_unittest.cc
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref.h"
+#include "partition_alloc/pointers/raw_ref.h"
 
 #include <functional>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_counting_impl_for_test.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_test_support.h"
 #include "base/memory/raw_ptr.h"
 #include "base/test/gtest_util.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/pointers/raw_ptr_counting_impl_for_test.h"
+#include "partition_alloc/pointers/raw_ptr_test_support.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #if BUILDFLAG(USE_ASAN_BACKUP_REF_PTR)
 #include "base/debug/asan_service.h"
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pool_offset_freelist.h b/base/allocator/partition_allocator/src/partition_alloc/pool_offset_freelist.h
index c721b91..c5402c7 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pool_offset_freelist.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/pool_offset_freelist.h
@@ -8,9 +8,9 @@
 #include <cstddef>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc-inl.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc-inl.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/random.cc b/base/allocator/partition_allocator/src/partition_alloc/random.cc
index db5fa4c..6e7a97d 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/random.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/random.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/random.h"
+#include "partition_alloc/random.h"
 
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_alloc_base/rand_util.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_lock.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/random.h b/base/allocator/partition_allocator/src/partition_alloc/random.h
index 27faccd9..617c2a0 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/random.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/random.h
@@ -7,7 +7,7 @@
 
 #include <stdint.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.cc b/base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.cc
index 5fff5d6..656f3a1 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h"
+#include "partition_alloc/reservation_offset_table.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h b/base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h
index 5fdd81b..cfad867 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h
@@ -10,17 +10,17 @@
 #include <limits>
 #include <tuple>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/alignment.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_pool_manager.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/tagging.h"
+#include "partition_alloc/thread_isolation/alignment.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/reverse_bytes.h b/base/allocator/partition_allocator/src/partition_alloc/reverse_bytes.h
index b236ac7..a444651 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/reverse_bytes.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/reverse_bytes.h
@@ -12,8 +12,8 @@
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_config.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/reverse_bytes_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/reverse_bytes_unittest.cc
index 32042cd..975cef23 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/reverse_bytes_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/reverse_bytes_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/reverse_bytes.h"
+#include "partition_alloc/reverse_bytes.h"
 
 #include <cstdint>
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.h b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.h
index ed6f98b..23791ee5 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.h
@@ -7,8 +7,8 @@
 
 #include <stddef.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/third_party/apple_apsl/malloc.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/third_party/apple_apsl/malloc.h"
 
 namespace allocator_shim {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.mm b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.mm
index fde5be38..10964071 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.mm
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.mm
@@ -15,7 +15,7 @@
 // only reason to intercept these calls is to re-label OOM crashes with slightly
 // more details.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.h"
+#include "partition_alloc/shim/allocator_interception_apple.h"
 
 #include <CoreFoundation/CoreFoundation.h>
 #import <Foundation/Foundation.h>
@@ -27,20 +27,20 @@
 #include <algorithm>
 #include <new>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/oom.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/third_party/apple_apsl/CFBase.h"
 #include "build/build_config.h"
+#include "partition_alloc/oom.h"
+#include "partition_alloc/partition_alloc_base/apple/mach_logging.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/shim/malloc_zone_functions_apple.h"
+#include "partition_alloc/third_party/apple_apsl/CFBase.h"
 
 #if BUILDFLAG(IS_IOS)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ios/ios_util.h"
+#include "partition_alloc/partition_alloc_base/ios/ios_util.h"
 #else
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/mac/mac_util.h"
+#include "partition_alloc/partition_alloc_base/mac/mac_util.h"
 #endif
 
 // The patching of Objective-C runtime bits must be done without any
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple_unittest.mm b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple_unittest.mm
index 44d36a6e..925b7a6 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple_unittest.mm
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple_unittest.mm
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.h"
+#include "partition_alloc/shim/allocator_interception_apple.h"
 
 #include <mach/mach.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.h"
+#include "partition_alloc/shim/allocator_shim.h"
+#include "partition_alloc/shim/malloc_zone_functions_apple.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace allocator_shim {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.cc
index b44a85ea..6b8914d 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.cc
@@ -2,36 +2,36 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h"
+#include "partition_alloc/shim/allocator_shim.h"
 
 #include <errno.h>
 
 #include <atomic>
 #include <new>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/notreached.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/memory/page_size.h"
+#include "partition_alloc/partition_alloc_base/notreached.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
 
 #if !BUILDFLAG(IS_WIN)
 #include <unistd.h>
 #else
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win.h"
+#include "partition_alloc/shim/winheap_stubs_win.h"
 #endif
 
 #if BUILDFLAG(IS_APPLE)
 #include <malloc/malloc.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.h"
+#include "partition_alloc/partition_alloc_base/apple/mach_logging.h"
+#include "partition_alloc/shim/allocator_interception_apple.h"
 #endif
 
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h"
+#include "partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h"
 #endif
 
 // No calls to malloc / new in this file. They would would cause re-entrancy of
@@ -393,24 +393,24 @@
 // avoid crashes in case of operator new() noexcept.  Thus, operator new()
 // noexcept needs to be routed to
 // allocator_shim::internal::PartitionMallocUnchecked through the shim layer.
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_cpp_symbols.h"
+#include "partition_alloc/shim/allocator_shim_override_cpp_symbols.h"
 #endif
 
 #if BUILDFLAG(IS_ANDROID)
 // Android does not support symbol interposition. The way malloc symbols are
 // intercepted on Android is by using link-time -wrap flags.
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_linker_wrapped_symbols.h"
+#include "partition_alloc/shim/allocator_shim_override_linker_wrapped_symbols.h"
 #elif BUILDFLAG(IS_WIN)
 // On Windows we use plain link-time overriding of the CRT symbols.
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_ucrt_symbols_win.h"
+#include "partition_alloc/shim/allocator_shim_override_ucrt_symbols_win.h"
 #elif BUILDFLAG(IS_APPLE)
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_apple_default_zone.h"
+#include "partition_alloc/shim/allocator_shim_override_apple_default_zone.h"
 #else  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_apple_symbols.h"
+#include "partition_alloc/shim/allocator_shim_override_apple_symbols.h"
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
 #else
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_libc_symbols.h"
+#include "partition_alloc/shim/allocator_shim_override_libc_symbols.h"
 #endif
 
 // Some glibc versions (until commit 6c444ad6e953dbdf9c7be065308a0a777)
@@ -428,7 +428,7 @@
 // this mechanism.
 
 #if defined(LIBC_GLIBC) && BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_glibc_weak_symbols.h"
+#include "partition_alloc/shim/allocator_shim_override_glibc_weak_symbols.h"
 #endif
 
 #if BUILDFLAG(IS_APPLE)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h
index 838aa34..bcb630ec 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h
@@ -8,14 +8,14 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/types/strong_alias.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/types/strong_alias.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/tagging.h"
 
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && BUILDFLAG(USE_STARSCAN)
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/starscan/pcscan.h"
 #endif
 
 namespace allocator_shim {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_apple_zoned_malloc.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_apple_zoned_malloc.cc
index 27cf53ec..817f3e9 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_apple_zoned_malloc.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_apple_zoned_malloc.cc
@@ -4,9 +4,9 @@
 
 #include <utility>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.h"
+#include "partition_alloc/shim/allocator_interception_apple.h"
+#include "partition_alloc/shim/allocator_shim.h"
+#include "partition_alloc/shim/malloc_zone_functions_apple.h"
 
 namespace allocator_shim {
 namespace {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_glibc.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_glibc.cc
index 9a7501d7..e76cca68 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_glibc.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_glibc.cc
@@ -4,10 +4,10 @@
 
 #include <limits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/oom.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h"
+#include "partition_alloc/oom.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/numerics/checked_math.h"
+#include "partition_alloc/shim/allocator_shim.h"
 
 #include <dlfcn.h>
 #include <malloc.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc
index 950b932a..03009a44 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc
@@ -4,8 +4,8 @@
 
 #include <malloc.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h"
 #include "build/build_config.h"
+#include "partition_alloc/shim/allocator_shim.h"
 
 // This translation unit defines a default dispatch for the allocator shim which
 // routes allocations to the original libc functions when using the link-time
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc
index a41096c..7ab0ec5 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h"
+#include "partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h"
 
 #include <atomic>
 #include <cstddef>
@@ -10,23 +10,23 @@
 #include <string>
 #include <tuple>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/allocation_guard.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/chromecast_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_stats.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/nonscannable_allocator.h"
 #include "build/build_config.h"
+#include "partition_alloc/allocation_guard.h"
+#include "partition_alloc/chromecast_buildflags.h"
+#include "partition_alloc/memory_reclaimer.h"
+#include "partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/no_destructor.h"
+#include "partition_alloc/partition_alloc_base/numerics/checked_math.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_root.h"
+#include "partition_alloc/partition_stats.h"
+#include "partition_alloc/shim/allocator_shim_internals.h"
+#include "partition_alloc/shim/nonscannable_allocator.h"
 
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 #include <malloc.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h
index 99b88fd9..0a84f8e 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h
@@ -5,9 +5,9 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_SHIM_ALLOCATOR_SHIM_DEFAULT_DISPATCH_TO_PARTITION_ALLOC_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_SHIM_ALLOCATOR_SHIM_DEFAULT_DISPATCH_TO_PARTITION_ALLOC_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h"
+#include "partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/shim/allocator_shim.h"
 
 namespace allocator_shim::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc
index 0e75848..23a3946 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h"
+#include "partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h"
 
 #include <cstdlib>
 #include <cstring>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/memory/page_size.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_constants.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_winheap.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_winheap.cc
index 8c923cc..5a43df5 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_winheap.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_winheap.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h"
+#include "partition_alloc/shim/allocator_shim.h"
 
 #include <ostream>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/shim/winheap_stubs_win.h"
 
 namespace {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_apple_default_zone.h b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_apple_default_zone.h
index f0676a44..d0d3b0c 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_apple_default_zone.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_apple_default_zone.h
@@ -18,18 +18,18 @@
 #include <atomic>
 #include <tuple>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/early_zone_registration_constants.h"
+#include "partition_alloc/partition_alloc_base/apple/mach_logging.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/shim/early_zone_registration_constants.h"
 
 namespace partition_alloc {
 
 // Defined in
-// base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
+// partition_alloc/partition_root.cc
 void PartitionAllocMallocHookOnBeforeForkInParent();
 void PartitionAllocMallocHookOnAfterForkInParent();
 void PartitionAllocMallocHookOnAfterForkInChild();
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_apple_symbols.h b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_apple_symbols.h
index 42ad8be..d288fe10 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_apple_symbols.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_apple_symbols.h
@@ -9,8 +9,8 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_SHIM_ALLOCATOR_SHIM_OVERRIDE_APPLE_SYMBOLS_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_SHIM_ALLOCATOR_SHIM_OVERRIDE_APPLE_SYMBOLS_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/third_party/apple_apsl/malloc.h"
+#include "partition_alloc/shim/malloc_zone_functions_apple.h"
+#include "partition_alloc/third_party/apple_apsl/malloc.h"
 
 namespace allocator_shim {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_cpp_symbols.h b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_cpp_symbols.h
index 5ec1625..f10cce46 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_cpp_symbols.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_cpp_symbols.h
@@ -15,9 +15,9 @@
 
 #include <new>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/shim/allocator_shim_internals.h"
 
 #if !BUILDFLAG(IS_APPLE)
 #define SHIM_CPP_SYMBOLS_EXPORT SHIM_ALWAYS_EXPORT
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_glibc_weak_symbols.h b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_glibc_weak_symbols.h
index b1564c7..a46464f 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_glibc_weak_symbols.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_glibc_weak_symbols.h
@@ -26,7 +26,7 @@
 
 #include <new>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h"
+#include "partition_alloc/shim/allocator_shim_internals.h"
 
 // __MALLOC_HOOK_VOLATILE not defined in all Glibc headers.
 #if !defined(__MALLOC_HOOK_VOLATILE)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_libc_symbols.h b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_libc_symbols.h
index 624a4461..3e8059d 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_libc_symbols.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_libc_symbols.h
@@ -20,7 +20,7 @@
 #include <malloc.h>
 #endif
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h"
+#include "partition_alloc/shim/allocator_shim_internals.h"
 
 extern "C" {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_linker_wrapped_symbols.h b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_linker_wrapped_symbols.h
index a2413f8..9a5df03a 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_linker_wrapped_symbols.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_linker_wrapped_symbols.h
@@ -18,7 +18,7 @@
 #include <algorithm>
 #include <cstring>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h"
+#include "partition_alloc/shim/allocator_shim_internals.h"
 
 extern "C" {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_ucrt_symbols_win.h b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_ucrt_symbols_win.h
index 677899f4..d688893 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_ucrt_symbols_win.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_ucrt_symbols_win.h
@@ -16,9 +16,9 @@
 
 #include <windows.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/checked_math.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h"
+#include "partition_alloc/partition_alloc_base/numerics/checked_math.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/shim/allocator_shim_internals.h"
 
 // Even though most C++ allocation operators can be left alone since the
 // interception works at a lower level, these ones should be
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_unittest.cc
index 9bc4056..530b0a8 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.h"
+#include "partition_alloc/shim/allocator_shim.h"
 
 #include <stdlib.h>
 #include <string.h>
@@ -14,12 +14,12 @@
 #include <sstream>
 #include <vector>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/platform_thread.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc_base/memory/page_size.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -29,8 +29,8 @@
 #elif BUILDFLAG(IS_APPLE)
 #include <malloc/malloc.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_interception_apple.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/third_party/apple_apsl/malloc.h"
+#include "partition_alloc/shim/allocator_interception_apple.h"
+#include "partition_alloc/third_party/apple_apsl/malloc.h"
 #else
 #include <malloc.h>
 #endif
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.cc
index 1c786b1..5d42dbe 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.h"
+#include "partition_alloc/shim/malloc_zone_functions_apple.h"
 
 #include <atomic>
 #include <type_traits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_alloc_base/check.h"
+#include "partition_alloc/partition_lock.h"
 
 namespace allocator_shim {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.h b/base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.h
index 92325543..f964aac0 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.h
@@ -8,9 +8,9 @@
 #include <malloc/malloc.h>
 #include <stddef.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/third_party/apple_apsl/malloc.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
+#include "partition_alloc/third_party/apple_apsl/malloc.h"
 
 namespace allocator_shim {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple_unittest.cc
index 365639373..49e1013 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.h"
+#include "partition_alloc/shim/malloc_zone_functions_apple.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/nonscannable_allocator.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/nonscannable_allocator.cc
index 1374476..06046c4 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/nonscannable_allocator.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/nonscannable_allocator.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/nonscannable_allocator.h"
+#include "partition_alloc/shim/nonscannable_allocator.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
+#include "partition_alloc/partition_root.h"
 
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h"
+#include "partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.h"
 
 #if BUILDFLAG(USE_STARSCAN)
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/starscan/metadata_allocator.h"
+#include "partition_alloc/starscan/pcscan.h"
 #endif
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/nonscannable_allocator.h b/base/allocator/partition_allocator/src/partition_alloc/shim/nonscannable_allocator.h
index 665143ca..6b1cd219 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/nonscannable_allocator.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/nonscannable_allocator.h
@@ -9,15 +9,15 @@
 #include <cstddef>
 #include <memory>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/no_destructor.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc.h"
 
 #if BUILDFLAG(USE_STARSCAN)
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.h"
+#include "partition_alloc/starscan/metadata_allocator.h"
 #endif
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win.cc
index d4a36d4..ce16f15 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win.cc
@@ -15,9 +15,9 @@
 #include <algorithm>
 #include <limits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/numerics/safe_conversions.h"
+#include "partition_alloc/partition_alloc_check.h"
 
 namespace allocator_shim {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win.h b/base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win.h
index dba03a36..a91c9b9 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win.h
@@ -11,7 +11,7 @@
 
 #include <stdint.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace allocator_shim {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win_unittest.cc
index bb37798..25bd2d01 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win_unittest.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win.h"
+#include "partition_alloc/shim/winheap_stubs_win.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_check.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace allocator_shim {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc b/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc
index 7780111a..c5a87f98 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.h"
+#include "partition_alloc/spinning_mutex.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_check.h"
 
 #if BUILDFLAG(IS_WIN)
 #include <windows.h>
@@ -24,7 +24,7 @@
 #endif  // PA_CONFIG(HAS_LINUX_KERNEL)
 
 #if !PA_CONFIG(HAS_FAST_MUTEX)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread.h"
 
 #if BUILDFLAG(IS_POSIX)
 #include <sched.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.h b/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.h
index 63d8bbe..70351ebf 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.h
@@ -8,16 +8,16 @@
 #include <algorithm>
 #include <atomic>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/yield_processor.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/yield_processor.h"
 
 #if BUILDFLAG(IS_WIN)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/win/windows_types.h"
+#include "partition_alloc/partition_alloc_base/win/windows_types.h"
 #endif
 
 #if BUILDFLAG(IS_POSIX)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/logging.h b/base/allocator/partition_allocator/src/partition_alloc/starscan/logging.h
index 5c8169d..3b46a81 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/logging.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/logging.h
@@ -5,8 +5,8 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_STARSCAN_LOGGING_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_STARSCAN_LOGGING_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/allocation_guard.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/allocation_guard.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.cc
index 6e2d6cf..e271159 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
+#include "partition_alloc/partition_root.h"
 
 #include <cstring>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/no_destructor.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.h b/base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.h
index 93b04b48..09d14a79 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.h
@@ -7,9 +7,9 @@
 
 #include <utility>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_root.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.cc
index 504658f..2227eef 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/starscan/pcscan.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_internal.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/starscan/pcscan_internal.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h
index 0bb7ad3..e43070b 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h
@@ -7,15 +7,15 @@
 
 #include <atomic>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_direct_map_extent.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_direct_map_extent.h"
+#include "partition_alloc/partition_page.h"
+#include "partition_alloc/starscan/pcscan_scheduling.h"
+#include "partition_alloc/tagging.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_internal.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_internal.cc
index 8b25637..8b6f478 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_internal.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_internal.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_internal.h"
+#include "partition_alloc/starscan/pcscan_internal.h"
 
 #include <algorithm>
 #include <array>
@@ -17,42 +17,42 @@
 #include <unordered_map>
 #include <vector>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/allocation_guard.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/ref_counted.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/scoped_refptr.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_page.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/raceful_worklist.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/scan_loop.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/snapshot.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/stats_collector.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/stats_reporter.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_cache.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_pool_manager.h"
+#include "partition_alloc/allocation_guard.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/cpu.h"
+#include "partition_alloc/partition_alloc_base/debug/alias.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
+#include "partition_alloc/partition_alloc_base/memory/ref_counted.h"
+#include "partition_alloc/partition_alloc_base/memory/scoped_refptr.h"
+#include "partition_alloc/partition_alloc_base/no_destructor.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_page.h"
+#include "partition_alloc/reservation_offset_table.h"
+#include "partition_alloc/starscan/metadata_allocator.h"
+#include "partition_alloc/starscan/pcscan_scheduling.h"
+#include "partition_alloc/starscan/raceful_worklist.h"
+#include "partition_alloc/starscan/scan_loop.h"
+#include "partition_alloc/starscan/snapshot.h"
+#include "partition_alloc/starscan/stack/stack.h"
+#include "partition_alloc/starscan/stats_collector.h"
+#include "partition_alloc/starscan/stats_reporter.h"
+#include "partition_alloc/tagging.h"
+#include "partition_alloc/thread_cache.h"
 
 #if !BUILDFLAG(HAS_64_BIT_POINTERS)
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.h"
+#include "partition_alloc/address_pool_manager_bitmap.h"
 #endif
 
 #if PA_CONFIG(STARSCAN_NOINLINE_SCAN_FUNCTIONS)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_internal.h b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_internal.h
index fd7f16b..00c8ac7 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_internal.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_internal.h
@@ -13,12 +13,12 @@
 #include <utility>
 #include <vector>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/scoped_refptr.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/starscan_fwd.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/write_protector.h"
+#include "partition_alloc/partition_alloc_base/memory/scoped_refptr.h"
+#include "partition_alloc/partition_alloc_base/no_destructor.h"
+#include "partition_alloc/starscan/metadata_allocator.h"
+#include "partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/starscan/starscan_fwd.h"
+#include "partition_alloc/starscan/write_protector.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling.cc
index 319e016b..1cbc71e 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling.cc
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling.h"
+#include "partition_alloc/starscan/pcscan_scheduling.h"
 
 #include <algorithm>
 #include <atomic>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_hooks.h"
+#include "partition_alloc/partition_lock.h"
+#include "partition_alloc/starscan/logging.h"
+#include "partition_alloc/starscan/pcscan.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling.h b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling.h
index f795535f..c1cfce2 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling.h
@@ -8,11 +8,11 @@
 #include <atomic>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_lock.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling_unittest.cc
index 768080e..d5ee5cd 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling_unittest.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_scheduling.h"
+#include "partition_alloc/starscan/pcscan_scheduling.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_base/time/time_override.h"
+#include "partition_alloc/partition_lock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace partition_alloc::internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_unittest.cc
index 5e8ad61..133dc315 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_unittest.cc
@@ -6,21 +6,21 @@
 
 #if !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/starscan/pcscan.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc-inl.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc-inl.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/cpu.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_alloc_for_testing.h"
+#include "partition_alloc/partition_root.h"
+#include "partition_alloc/starscan/stack/stack.h"
+#include "partition_alloc/tagging.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if BUILDFLAG(USE_STARSCAN)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/raceful_worklist.h b/base/allocator/partition_allocator/src/partition_alloc/starscan/raceful_worklist.h
index baa3e05..4927a2dc 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/raceful_worklist.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/raceful_worklist.h
@@ -9,10 +9,10 @@
 #include <atomic>
 #include <vector>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/rand_util.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/starscan/metadata_allocator.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/scan_loop.h b/base/allocator/partition_allocator/src/partition_alloc/starscan/scan_loop.h
index ff11624..470a22e 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/scan_loop.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/scan_loop.h
@@ -8,13 +8,13 @@
 #include <cstddef>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/starscan_fwd.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/starscan/starscan_fwd.h"
+#include "partition_alloc/tagging.h"
 
 #if defined(ARCH_CPU_X86_64)
 // Include order is important, so we disable formatting.
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/scan_loop_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/scan_loop_unittest.cc
index dd24490b..914be57 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/scan_loop_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/scan_loop_unittest.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/scan_loop.h"
+#include "partition_alloc/starscan/scan_loop.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/cpu.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/snapshot.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/snapshot.cc
index 311aee4..27945360 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/snapshot.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/snapshot.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/snapshot.h"
+#include "partition_alloc/starscan/snapshot.h"
 
 #include <memory>
 #include <mutex>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_internal.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/starscan/pcscan_internal.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/snapshot.h b/base/allocator/partition_allocator/src/partition_alloc/starscan/snapshot.h
index de9bcdc..695e66c3 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/snapshot.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/snapshot.h
@@ -8,8 +8,8 @@
 #include <memory>
 #include <utility>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan_internal.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/raceful_worklist.h"
+#include "partition_alloc/starscan/pcscan_internal.h"
+#include "partition_alloc/starscan/raceful_worklist.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.cc
index ec6ecbb..86ce054a 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.cc
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.h"
+#include "partition_alloc/starscan/stack/stack.h"
 
 #include <cstdint>
 #include <limits>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
 
 #if BUILDFLAG(IS_WIN)
 #include <windows.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.h b/base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.h
index 74c195e1..9f8fea7 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.h
@@ -7,8 +7,8 @@
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack_unittest.cc
index ecbcd66..b50e9125 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack_unittest.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/stack/stack.h"
+#include "partition_alloc/starscan/stack/stack.h"
 
 #include <memory>
 #include <ostream>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/state_bitmap.h b/base/allocator/partition_allocator/src/partition_alloc/starscan/state_bitmap.h
index bdefe3f..9c4c3be 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/state_bitmap.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/state_bitmap.h
@@ -15,9 +15,9 @@
 #include <tuple>
 #include <utility>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_base/bits.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_check.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/state_bitmap_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/state_bitmap_unittest.cc
index 3878944..ea081d535c 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/state_bitmap_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/state_bitmap_unittest.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/state_bitmap.h"
+#include "partition_alloc/starscan/state_bitmap.h"
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/partition_alloc_constants.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace partition_alloc::internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/stats_collector.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/stats_collector.cc
index af622d1..36ecf94 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/stats_collector.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/stats_collector.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/stats_collector.h"
+#include "partition_alloc/starscan/stats_collector.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/stats_reporter.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/starscan/logging.h"
+#include "partition_alloc/starscan/stats_reporter.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/stats_collector.h b/base/allocator/partition_allocator/src/partition_alloc/starscan/stats_collector.h
index af060ad..6de21e92 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/stats_collector.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/stats_collector.h
@@ -14,10 +14,10 @@
 #include <unordered_map>
 #include <utility>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/starscan_fwd.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/starscan/metadata_allocator.h"
+#include "partition_alloc/starscan/starscan_fwd.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/stats_reporter.h b/base/allocator/partition_allocator/src/partition_alloc/starscan/stats_reporter.h
index 8f0f910..b2c471f57 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/stats_reporter.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/stats_reporter.h
@@ -5,8 +5,8 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_STARSCAN_STATS_REPORTER_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_STARSCAN_STATS_REPORTER_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/stats_collector.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread.h"
+#include "partition_alloc/starscan/stats_collector.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/write_protector.cc b/base/allocator/partition_allocator/src/partition_alloc/starscan/write_protector.cc
index cc00c745..d86e15df 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/write_protector.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/write_protector.cc
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/write_protector.h"
+#include "partition_alloc/starscan/write_protector.h"
 
 #include <mutex>
 #include <thread>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/eintr_wrapper.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
 #include "build/build_config.h"
+#include "partition_alloc/address_pool_manager.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc_base/logging.h"
+#include "partition_alloc/partition_alloc_base/posix/eintr_wrapper.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread.h"
+#include "partition_alloc/partition_alloc_check.h"
 
 #if PA_CONFIG(STARSCAN_UFFD_WRITE_PROTECTOR_SUPPORTED)
 #include <fcntl.h>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/starscan/write_protector.h b/base/allocator/partition_allocator/src/partition_alloc/starscan/write_protector.h
index 55a095a6..6b03e1c 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/starscan/write_protector.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/starscan/write_protector.h
@@ -9,10 +9,10 @@
 #include <cstdint>
 #include <mutex>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/metadata_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/pcscan.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/starscan/raceful_worklist.h"
 #include "build/build_config.h"
+#include "partition_alloc/starscan/metadata_allocator.h"
+#include "partition_alloc/starscan/pcscan.h"
+#include "partition_alloc/starscan/raceful_worklist.h"
 
 namespace partition_alloc::internal {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/tagging.cc b/base/allocator/partition_allocator/src/partition_alloc/tagging.cc
index 9b44119..7590ba05 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/tagging.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/tagging.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
+#include "partition_alloc/tagging.h"
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/cpu.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_config.h"
 
 #if PA_CONFIG(HAS_MEMORY_TAGGING)
 #include <arm_acle.h>
@@ -42,8 +42,8 @@
 #endif
 
 #if BUILDFLAG(IS_ANDROID)
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.h"
+#include "partition_alloc/partition_alloc_base/files/file_path.h"
+#include "partition_alloc/partition_alloc_base/native_library.h"
 #endif  // BUILDFLAG(IS_ANDROID)
 
 namespace partition_alloc {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/tagging.h b/base/allocator/partition_allocator/src/partition_alloc/tagging.h
index 12ad5e9f..2d3e9e0 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/tagging.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/tagging.h
@@ -11,10 +11,10 @@
 #include <cstddef>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_config.h"
 
 #if PA_CONFIG(HAS_MEMORY_TAGGING) && BUILDFLAG(IS_ANDROID)
 #include <csignal>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/tagging_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/tagging_unittest.cc
index c0d0f84..7aa5b9b7 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/tagging_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/tagging_unittest.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
+#include "partition_alloc/tagging.h"
 
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
 #include "build/build_config.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/partition_alloc_base/cpu.h"
+#include "partition_alloc/partition_alloc_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace partition_alloc::internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/thread_cache.cc b/base/allocator/partition_allocator/src/partition_alloc/thread_cache.cc
index 130a7abb..fdffd97 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/thread_cache.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/thread_cache.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_cache.h"
+#include "partition_alloc/thread_cache.h"
 
 #include <sys/types.h>
 
@@ -10,17 +10,17 @@
 #include <atomic>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc-inl.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/immediate_crash.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc-inl.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/immediate_crash.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_root.h"
 
 namespace partition_alloc {
 
diff --git a/base/allocator/partition_allocator/src/partition_alloc/thread_cache.h b/base/allocator/partition_allocator/src/partition_alloc/thread_cache.h
index d3a8bea..381245c3 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/thread_cache.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/thread_cache.h
@@ -10,21 +10,21 @@
 #include <limits>
 #include <memory>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc-inl.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/compiler_specific.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_bucket_lookup.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_stats.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_tls.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc-inl.h"
+#include "partition_alloc/partition_alloc_base/compiler_specific.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_base/time/time.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/partition_bucket_lookup.h"
+#include "partition_alloc/partition_freelist_entry.h"
+#include "partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_stats.h"
+#include "partition_alloc/partition_tls.h"
 
 #if defined(ARCH_CPU_X86_64) && BUILDFLAG(HAS_64_BIT_POINTERS)
 #include <algorithm>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/thread_cache_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/thread_cache_unittest.cc
index 084da9f..83cdaa77 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/thread_cache_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/thread_cache_unittest.cc
@@ -2,23 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_cache.h"
+#include "partition_alloc/thread_cache.h"
 
 #include <algorithm>
 #include <atomic>
 #include <vector>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/extended_api.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_for_testing.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_lock.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/tagging.h"
 #include "build/build_config.h"
+#include "partition_alloc/extended_api.h"
+#include "partition_alloc/partition_address_space.h"
+#include "partition_alloc/partition_alloc_base/thread_annotations.h"
+#include "partition_alloc/partition_alloc_base/threading/platform_thread_for_testing.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_config.h"
+#include "partition_alloc/partition_alloc_for_testing.h"
+#include "partition_alloc/partition_lock.h"
+#include "partition_alloc/partition_root.h"
+#include "partition_alloc/tagging.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 // With *SAN, PartitionAlloc is replaced in partition_alloc.h by ASAN, so we
diff --git a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/alignment.h b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/alignment.h
index 0d72d456..d74dcfc 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/alignment.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/alignment.h
@@ -5,11 +5,11 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_THREAD_ISOLATION_ALIGNMENT_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_THREAD_ISOLATION_ALIGNMENT_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 #if BUILDFLAG(ENABLE_THREAD_ISOLATION)
 
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/page_allocator_constants.h"
 
 #define PA_THREAD_ISOLATED_ALIGN_SZ partition_alloc::internal::SystemPageSize()
 #define PA_THREAD_ISOLATED_ALIGN_OFFSET_MASK (PA_THREAD_ISOLATED_ALIGN_SZ - 1)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.cc b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.cc
index ad0b8ad..c4c46ed 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.h"
+#include "partition_alloc/thread_isolation/pkey.h"
 
 #if BUILDFLAG(ENABLE_PKEYS)
 
@@ -11,9 +11,9 @@
 #include <sys/syscall.h>
 #include <unistd.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h"
+#include "partition_alloc/partition_alloc_base/cpu.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/thread_isolation/thread_isolation.h"
 
 #if !BUILDFLAG(IS_LINUX)
 #error "This pkey code is currently only supported on Linux"
diff --git a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.h b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.h
index 697779f..125b200 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.h
@@ -5,13 +5,13 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_THREAD_ISOLATION_PKEY_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_THREAD_ISOLATION_PKEY_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 #if BUILDFLAG(ENABLE_PKEYS)
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/alignment.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/thread_isolation/alignment.h"
 
 #include <cstddef>
 #include <cstdint>
diff --git a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey_unittest.cc
index d0b1b9f..78695965 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey_unittest.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_root.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h"
+#include "partition_alloc/address_pool_manager.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/partition_root.h"
+#include "partition_alloc/thread_isolation/thread_isolation.h"
 
 #if BUILDFLAG(ENABLE_PKEYS)
 
@@ -14,13 +14,13 @@
 #include <sys/mman.h>
 #include <sys/syscall.h>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_space_stats.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.h"
+#include "partition_alloc/address_space_stats.h"
+#include "partition_alloc/page_allocator.h"
+#include "partition_alloc/page_allocator_constants.h"
+#include "partition_alloc/partition_alloc.h"
+#include "partition_alloc/partition_alloc_base/no_destructor.h"
+#include "partition_alloc/partition_alloc_forward.h"
+#include "partition_alloc/thread_isolation/pkey.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #define ISOLATED_FUNCTION extern "C" __attribute__((used))
diff --git a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.cc b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.cc
index 713d55a6..55491f7 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.cc
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h"
+#include "partition_alloc/thread_isolation/thread_isolation.h"
 
 #if BUILDFLAG(ENABLE_THREAD_ISOLATION)
 
-#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_check.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.h"
+#include "partition_alloc/address_pool_manager.h"
+#include "partition_alloc/partition_alloc_check.h"
+#include "partition_alloc/partition_alloc_constants.h"
+#include "partition_alloc/reservation_offset_table.h"
 
 #if BUILDFLAG(ENABLE_PKEYS)
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.h"
+#include "partition_alloc/thread_isolation/pkey.h"
 #endif
 
 namespace partition_alloc::internal {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h
index a734af9..bf88c39 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.h
@@ -5,18 +5,18 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_THREAD_ISOLATION_THREAD_ISOLATION_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_THREAD_ISOLATION_THREAD_ISOLATION_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h"
+#include "partition_alloc/partition_alloc_buildflags.h"
 
 #if BUILDFLAG(ENABLE_THREAD_ISOLATION)
 
 #include <cstddef>
 #include <cstdint>
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export.h"
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
+#include "partition_alloc/partition_alloc_base/component_export.h"
+#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
 
 #if BUILDFLAG(ENABLE_PKEYS)
-#include "base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.h"
+#include "partition_alloc/thread_isolation/pkey.h"
 #endif
 
 #if !BUILDFLAG(HAS_64_BIT_POINTERS)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/yield_processor.h b/base/allocator/partition_allocator/src/partition_alloc/yield_processor.h
index c61ada7..5748cfb 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/yield_processor.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/yield_processor.h
@@ -5,8 +5,8 @@
 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_YIELD_PROCESSOR_H_
 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SRC_PARTITION_ALLOC_YIELD_PROCESSOR_H_
 
-#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_config.h"
 #include "build/build_config.h"
+#include "partition_alloc/partition_alloc_config.h"
 
 // The PA_YIELD_PROCESSOR macro wraps an architecture specific-instruction that
 // informs the processor we're in a busy wait, so it can handle the branch more
diff --git a/base/tracing/stdlib/chrome/perfetto_sql_files.gni b/base/tracing/stdlib/chrome/perfetto_sql_files.gni
index 23c8329..5edf42c 100644
--- a/base/tracing/stdlib/chrome/perfetto_sql_files.gni
+++ b/base/tracing/stdlib/chrome/perfetto_sql_files.gni
@@ -6,6 +6,7 @@
 chrome_stdlib_sql_files = [
   "chrome_scrolls.sql",
   "cpu_powerups.sql",
+  "event_latency_description.sql",
   "histograms.sql",
   "interactions.sql",
   "metadata.sql",
@@ -13,6 +14,8 @@
   "speedometer.sql",
   "tasks.sql",
   "vsync_intervals.sql",
+  "scroll_jank/scroll_jank_cause_map.sql",
+  "scroll_jank/scroll_jank_cause_utils.sql",
   "scroll_jank/scroll_jank_intervals.sql",
   "scroll_jank/scroll_jank_v3_cause.sql",
   "scroll_jank/scroll_jank_v3.sql",
diff --git a/base/tracing/test/data/chrome_fcp_lcp_navigations.pftrace.sha256 b/base/tracing/test/data/chrome_fcp_lcp_navigations.pftrace.sha256
new file mode 100644
index 0000000..e4274e2
--- /dev/null
+++ b/base/tracing/test/data/chrome_fcp_lcp_navigations.pftrace.sha256
@@ -0,0 +1 @@
+ae01d849fbd75a98be1b7ddd5a8873217c377b393a1d5bbd788ed3364f7fefc3
\ No newline at end of file
diff --git a/base/tracing/test/trace_processor/diff_tests/chrome/tests_chrome_interactions.py b/base/tracing/test/trace_processor/diff_tests/chrome/tests_chrome_interactions.py
index d7e7f31..5845dbb 100755
--- a/base/tracing/test/trace_processor/diff_tests/chrome/tests_chrome_interactions.py
+++ b/base/tracing/test/trace_processor/diff_tests/chrome/tests_chrome_interactions.py
@@ -36,5 +36,5 @@
         10,687434796215243,475000000,687435271215243,475000000,687435271215243,1
         11,687435970742243,763000000,687436733742243,852000000,687436822742243,1
         13,687438343638243,1005000000,687439348638243,1005000000,687439348638243,1
-        14,687440258111243,900000000,687441158111243,"[NULL]",0,1
+        14,687440258111243,900000000,687441158111243,"[NULL]","[NULL]",1
         """))
diff --git a/base/tracing/test/trace_processor/diff_tests/include_index.py b/base/tracing/test/trace_processor/diff_tests/include_index.py
index 20ab1c6..84f6f571 100755
--- a/base/tracing/test/trace_processor/diff_tests/include_index.py
+++ b/base/tracing/test/trace_processor/diff_tests/include_index.py
@@ -12,7 +12,7 @@
 
 def fetch_all_diff_tests(index_path: str) -> List['testing.TestCase']:
   return [
-      *ChromeScrollJankStdlib(index_path, 'chrome', 'ChromeScrollJank').fetch(),
+      *ChromeScrollJankStdlib(index_path, 'chrome', 'ChromeScrollJankStdlib').fetch(),
       *ChromeStdlib(index_path, 'chrome', 'Chrome').fetch(),
       *ChromeInteractions(index_path, 'chrome', 'ChromeInteractions').fetch(),
       ]
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index bf3042f..de1cd6e 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -1067,6 +1067,8 @@
     } else {
       defines += [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE" ]
     }
+  } else {
+    defines += [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE" ]
   }
 }
 
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni
index 1f801c6..d15c6f8 100644
--- a/buildtools/deps_revisions.gni
+++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@
 declare_args() {
   # Used to cause full rebuilds on libc++ rolls. This should be kept in sync
   # with the libcxx_revision vars in //DEPS.
-  libcxx_revision = "cec6ffaa620122c200e742b7b0d034ce4e5c40bd"
+  libcxx_revision = "2a2315e69ab61cb488c18fbbb1cd502be049c122"
 }
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 31144d12..bd7e8f8 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -690,7 +690,10 @@
 if (is_ios) {
   bundle_data("unit_tests_bundle_data") {
     testonly = true
-    sources = [ "test/data/lottie/animation_with_2_text_nodes.json" ]
+    sources = [
+      "//testing/buildbot/filters/ios.cc_unittests.filter",
+      "test/data/lottie/animation_with_2_text_nodes.json",
+    ]
     outputs = [ "{{bundle_resources_dir}}/" +
                 "{{source_root_relative_dir}}/{{source_file_part}}" ]
   }
diff --git a/cc/animation/animation.cc b/cc/animation/animation.cc
index 5904101..4e56002 100644
--- a/cc/animation/animation.cc
+++ b/cc/animation/animation.cc
@@ -139,7 +139,7 @@
 }
 
 void Animation::PushPropertiesTo(Animation* animation_impl) {
-  absl::optional<base::TimeTicks> impl_start_time;
+  std::optional<base::TimeTicks> impl_start_time;
   if (use_start_time_from_impl_ && !GetStartTime()) {
     // If this animation is replacing an existing one before having received a
     // start time, try to get the start from the animation being replaced.
@@ -246,11 +246,11 @@
   animation_host()->SetNeedsCommit();
 }
 
-absl::optional<base::TimeTicks> Animation::GetStartTime() const {
+std::optional<base::TimeTicks> Animation::GetStartTime() const {
   CHECK(keyframe_effect());
 
   if (!keyframe_effect()->keyframe_models().size()) {
-    return absl::nullopt;
+    return std::nullopt;
   }
 
   // KeyframeModels should all share the same start time so just use the first
@@ -258,7 +258,7 @@
   gfx::KeyframeModel& km = *keyframe_effect()->keyframe_models().front();
 
   if (!km.has_set_start_time()) {
-    return absl::nullopt;
+    return std::nullopt;
   }
 
   return km.start_time();
diff --git a/cc/animation/animation.h b/cc/animation/animation.h
index 96f631d..3a53f803 100644
--- a/cc/animation/animation.h
+++ b/cc/animation/animation.h
@@ -150,7 +150,7 @@
 
   void set_use_start_time_from_impl() { use_start_time_from_impl_ = true; }
 
-  absl::optional<base::TimeTicks> GetStartTime() const;
+  std::optional<base::TimeTicks> GetStartTime() const;
 
   virtual bool IsWorkletAnimation() const;
 
diff --git a/cc/animation/animation_delegate.h b/cc/animation/animation_delegate.h
index a566f33a..6400635a 100644
--- a/cc/animation/animation_delegate.h
+++ b/cc/animation/animation_delegate.h
@@ -7,9 +7,9 @@
 
 #include <memory>
 
+#include <optional>
 #include "base/time/time.h"
 #include "cc/animation/animation_export.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/animation/keyframe/animation_curve.h"
 
 namespace cc {
@@ -33,7 +33,7 @@
       base::TimeTicks animation_start_time,
       std::unique_ptr<gfx::AnimationCurve> curve) = 0;
   virtual void NotifyLocalTimeUpdated(
-      absl::optional<base::TimeDelta> local_time) = 0;
+      std::optional<base::TimeDelta> local_time) = 0;
 
  protected:
   virtual ~AnimationDelegate() {}
diff --git a/cc/animation/animation_events.cc b/cc/animation/animation_events.cc
index 00038a4..0334f0922 100644
--- a/cc/animation/animation_events.cc
+++ b/cc/animation/animation_events.cc
@@ -21,7 +21,7 @@
 
 AnimationEvent::AnimationEvent(int timeline_id,
                                int animation_id,
-                               absl::optional<base::TimeDelta> local_time)
+                               std::optional<base::TimeDelta> local_time)
     : type(Type::kTimeUpdated),
       // Initializing model_id with an invalid value (0).
       // Also initializing keyframe_id with 0 which in its case is a valid
diff --git a/cc/animation/animation_events.h b/cc/animation/animation_events.h
index 8d29e98..db688df5 100644
--- a/cc/animation/animation_events.h
+++ b/cc/animation/animation_events.h
@@ -34,7 +34,7 @@
   // Constructs AnimationEvent of TIME_UPDATED type.
   AnimationEvent(int timeline_id,
                  int animation_id,
-                 absl::optional<base::TimeDelta> local_time);
+                 std::optional<base::TimeDelta> local_time);
 
   AnimationEvent(const AnimationEvent& other);
   AnimationEvent& operator=(const AnimationEvent& other);
@@ -55,7 +55,7 @@
   std::unique_ptr<gfx::AnimationCurve> curve;
 
   // Set for TIME_UPDATED events.
-  absl::optional<base::TimeDelta> local_time;
+  std::optional<base::TimeDelta> local_time;
 };
 
 class CC_ANIMATION_EXPORT AnimationEvents : public MutatorEvents {
diff --git a/cc/animation/animation_host_unittest.cc b/cc/animation/animation_host_unittest.cc
index 369791d..096144a 100644
--- a/cc/animation/animation_host_unittest.cc
+++ b/cc/animation/animation_host_unittest.cc
@@ -34,7 +34,7 @@
 // Helper method to convert base::TimeTicks to double.
 // Returns double milliseconds if the input value is resolved or
 // std::numeric_limits<double>::quiet_NaN() otherwise.
-double ToMilliseconds(absl::optional<base::TimeTicks> time_ticks) {
+double ToMilliseconds(std::optional<base::TimeTicks> time_ticks) {
   if (!time_ticks) {
     return std::numeric_limits<double>::quiet_NaN();
   }
diff --git a/cc/animation/element_animations.cc b/cc/animation/element_animations.cc
index 249d1ad..49ba144 100644
--- a/cc/animation/element_animations.cc
+++ b/cc/animation/element_animations.cc
@@ -540,11 +540,10 @@
       target_element_id, list_type, scroll_offset);
 }
 
-absl::optional<gfx::PointF> ElementAnimations::ScrollOffsetForAnimation()
-    const {
+std::optional<gfx::PointF> ElementAnimations::ScrollOffsetForAnimation() const {
   if (animation_host_)
     return animation_host_->GetScrollOffsetForAnimation(element_id());
-  return absl::nullopt;
+  return std::nullopt;
 }
 
 PropertyToElementIdMap ElementAnimations::GetPropertyToElementIdMap() const {
diff --git a/cc/animation/element_animations.h b/cc/animation/element_animations.h
index d74d363..38d43982 100644
--- a/cc/animation/element_animations.h
+++ b/cc/animation/element_animations.h
@@ -136,7 +136,7 @@
                               int target_property_id,
                               gfx::KeyframeModel* keyframe_model) override;
 
-  absl::optional<gfx::PointF> ScrollOffsetForAnimation() const;
+  std::optional<gfx::PointF> ScrollOffsetForAnimation() const;
 
   // Returns a map of target property to the ElementId for that property, for
   // KeyframeEffects associated with this ElementAnimations.
diff --git a/cc/animation/keyframe_effect.cc b/cc/animation/keyframe_effect.cc
index 29920e2b..1526bf40 100644
--- a/cc/animation/keyframe_effect.cc
+++ b/cc/animation/keyframe_effect.cc
@@ -141,7 +141,7 @@
   is_ticking_ = false;
   // Resetting last_tick_time_ here ensures that calling ::UpdateState
   // before ::Animate doesn't start a keyframe model.
-  last_tick_time_ = absl::nullopt;
+  last_tick_time_ = std::nullopt;
   animation_->RemoveFromTicking();
 }
 
@@ -151,7 +151,7 @@
 
   // Animate hasn't been called, this happens if an element has been added
   // between the Commit and Draw phases.
-  if (last_tick_time_ == absl::nullopt || awaiting_deletion_) {
+  if (last_tick_time_ == std::nullopt || awaiting_deletion_) {
     start_ready_keyframe_models = false;
   }
 
@@ -655,7 +655,7 @@
         !ScrollOffsetAnimationCurve::ToScrollOffsetAnimationCurve(
              keyframe_model->curve())
              ->HasSetInitialValue()) {
-      absl::optional<gfx::PointF> current_scroll_offset;
+      std::optional<gfx::PointF> current_scroll_offset;
       // If the scroller was already composited, prefer using its current scroll
       // offset.
       current_scroll_offset = keyframe_effect_impl->ScrollOffsetForAnimation();
@@ -719,7 +719,7 @@
 
 void KeyframeEffect::PushPropertiesTo(
     KeyframeEffect* keyframe_effect_impl,
-    absl::optional<base::TimeTicks> replaced_start_time) {
+    std::optional<base::TimeTicks> replaced_start_time) {
   if (!needs_push_properties_)
     return;
   needs_push_properties_ = false;
@@ -1088,7 +1088,7 @@
     element_animations_->UpdateClientAnimationState();
 }
 
-absl::optional<gfx::PointF> KeyframeEffect::ScrollOffsetForAnimation() const {
+std::optional<gfx::PointF> KeyframeEffect::ScrollOffsetForAnimation() const {
   return element_animations_->ScrollOffsetForAnimation();
 }
 
diff --git a/cc/animation/keyframe_effect.h b/cc/animation/keyframe_effect.h
index 705e01c..0021165 100644
--- a/cc/animation/keyframe_effect.h
+++ b/cc/animation/keyframe_effect.h
@@ -154,7 +154,7 @@
   // If `replaced_start_time` is provided, it will be set as the start time on
   // this' keyframe models prior to being pushed.
   void PushPropertiesTo(KeyframeEffect* keyframe_effect_impl,
-                        absl::optional<base::TimeTicks> replaced_start_time);
+                        std::optional<base::TimeTicks> replaced_start_time);
 
   std::string KeyframeModelsToString() const;
 
@@ -182,7 +182,7 @@
   void MarkKeyframeModelsForDeletion(base::TimeTicks, AnimationEvents* events);
   void MarkFinishedKeyframeModels(base::TimeTicks monotonic_time);
 
-  absl::optional<gfx::PointF> ScrollOffsetForAnimation() const;
+  std::optional<gfx::PointF> ScrollOffsetForAnimation() const;
   void GenerateEvent(AnimationEvents* events,
                      const KeyframeModel& keyframe_model,
                      AnimationEvent::Type type,
@@ -208,7 +208,7 @@
 
   bool is_ticking_;
   bool awaiting_deletion_;
-  absl::optional<base::TimeTicks> last_tick_time_;
+  std::optional<base::TimeTicks> last_tick_time_;
 
   bool needs_push_properties_;
 };
diff --git a/cc/animation/scroll_offset_animation_curve.cc b/cc/animation/scroll_offset_animation_curve.cc
index 9709308..ebb3ed7 100644
--- a/cc/animation/scroll_offset_animation_curve.cc
+++ b/cc/animation/scroll_offset_animation_curve.cc
@@ -128,13 +128,13 @@
 
 }  // namespace
 
-absl::optional<double>
+std::optional<double>
     ScrollOffsetAnimationCurve::animation_duration_for_testing_;
 
 ScrollOffsetAnimationCurve::ScrollOffsetAnimationCurve(
     const gfx::PointF& target_value,
     AnimationType animation_type,
-    absl::optional<DurationBehavior> duration_behavior)
+    std::optional<DurationBehavior> duration_behavior)
     : target_value_(target_value),
       animation_type_(animation_type),
       duration_behavior_(duration_behavior),
@@ -159,7 +159,7 @@
     const gfx::PointF& target_value,
     std::unique_ptr<TimingFunction> timing_function,
     AnimationType animation_type,
-    absl::optional<DurationBehavior> duration_behavior)
+    std::optional<DurationBehavior> duration_behavior)
     : target_value_(target_value),
       timing_function_(std::move(timing_function)),
       animation_type_(animation_type),
@@ -224,7 +224,7 @@
 base::TimeDelta ScrollOffsetAnimationCurve::SegmentDuration(
     const gfx::Vector2dF& delta,
     base::TimeDelta delayed_by,
-    absl::optional<double> velocity) {
+    std::optional<double> velocity) {
   switch (animation_type_) {
     case AnimationType::kEaseInOut:
       DCHECK(duration_behavior_.has_value());
diff --git a/cc/animation/scroll_offset_animation_curve.h b/cc/animation/scroll_offset_animation_curve.h
index e0401e4..753aa449 100644
--- a/cc/animation/scroll_offset_animation_curve.h
+++ b/cc/animation/scroll_offset_animation_curve.h
@@ -7,11 +7,11 @@
 
 #include <memory>
 
+#include <optional>
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/time/time.h"
 #include "cc/animation/animation_export.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/animation/keyframe/animation_curve.h"
 #include "ui/gfx/geometry/point_f.h"
 #include "ui/gfx/geometry/vector2d_f.h"
@@ -125,17 +125,17 @@
   ScrollOffsetAnimationCurve(
       const gfx::PointF& target_value,
       AnimationType animation_type,
-      absl::optional<DurationBehavior> duration_behavior = absl::nullopt);
+      std::optional<DurationBehavior> duration_behavior = std::nullopt);
   ScrollOffsetAnimationCurve(
       const gfx::PointF& target_value,
       std::unique_ptr<gfx::TimingFunction> timing_function,
       AnimationType animation_type,
-      absl::optional<DurationBehavior> duration_behavior);
+      std::optional<DurationBehavior> duration_behavior);
 
   base::TimeDelta SegmentDuration(
       const gfx::Vector2dF& delta,
       base::TimeDelta delayed_by,
-      absl::optional<double> velocity = absl::nullopt);
+      std::optional<double> velocity = std::nullopt);
 
   base::TimeDelta EaseInOutBoundedSegmentDuration(
       const gfx::Vector2dF& new_delta,
@@ -156,11 +156,11 @@
   AnimationType animation_type_;
 
   // Only valid when |animation_type_| is EASE_IN_OUT.
-  absl::optional<DurationBehavior> duration_behavior_;
+  std::optional<DurationBehavior> duration_behavior_;
 
   bool has_set_initial_value_;
 
-  static absl::optional<double> animation_duration_for_testing_;
+  static std::optional<double> animation_duration_for_testing_;
 
   raw_ptr<Target, DanglingUntriaged> target_ = nullptr;
 };
diff --git a/cc/animation/scroll_offset_animations_impl.h b/cc/animation/scroll_offset_animations_impl.h
index 60ca91c..d5f14b2 100644
--- a/cc/animation/scroll_offset_animations_impl.h
+++ b/cc/animation/scroll_offset_animations_impl.h
@@ -79,7 +79,7 @@
       base::TimeTicks animation_start_time,
       std::unique_ptr<gfx::AnimationCurve> curve) override {}
   void NotifyLocalTimeUpdated(
-      absl::optional<base::TimeDelta> local_time) override {}
+      std::optional<base::TimeDelta> local_time) override {}
 
   bool IsAnimating() const;
   bool IsAutoScrolling() const;
diff --git a/cc/animation/scroll_timeline.cc b/cc/animation/scroll_timeline.cc
index d936a7d..5a66dac 100644
--- a/cc/animation/scroll_timeline.cc
+++ b/cc/animation/scroll_timeline.cc
@@ -29,9 +29,9 @@
 
 }  // namespace
 
-ScrollTimeline::ScrollTimeline(absl::optional<ElementId> scroller_id,
+ScrollTimeline::ScrollTimeline(std::optional<ElementId> scroller_id,
                                ScrollDirection direction,
-                               absl::optional<ScrollOffsets> scroll_offsets,
+                               std::optional<ScrollOffsets> scroll_offsets,
                                int animation_timeline_id)
     : AnimationTimeline(animation_timeline_id, /* is_impl_only */ false),
       pending_id_(scroller_id),
@@ -41,9 +41,9 @@
 ScrollTimeline::~ScrollTimeline() = default;
 
 scoped_refptr<ScrollTimeline> ScrollTimeline::Create(
-    absl::optional<ElementId> scroller_id,
+    std::optional<ElementId> scroller_id,
     ScrollTimeline::ScrollDirection direction,
-    absl::optional<ScrollOffsets> scroll_offsets) {
+    std::optional<ScrollOffsets> scroll_offsets) {
   return base::WrapRefCounted(
       new ScrollTimeline(scroller_id, direction, scroll_offsets,
                          AnimationIdProvider::NextTimelineId()));
@@ -76,14 +76,14 @@
 }
 
 // https://drafts.csswg.org/scroll-animations-1/#current-time-algorithm
-absl::optional<base::TimeTicks> ScrollTimeline::CurrentTime(
+std::optional<base::TimeTicks> ScrollTimeline::CurrentTime(
     const ScrollTree& scroll_tree,
     bool is_active_tree) const {
   // If the timeline is not active return unresolved value by the spec.
   // https://github.com/WICG/scroll-animations/issues/31
   // https://wicg.github.io/scroll-animations/#current-time-algorithm
   if (!IsActive(scroll_tree, is_active_tree)) {
-    return absl::nullopt;
+    return std::nullopt;
   }
 
   ElementId scroller_id =
@@ -122,7 +122,7 @@
   return base::TimeTicks() + base::Microseconds(progress_us);
 }
 
-absl::optional<base::TimeTicks> ScrollTimeline::Duration(
+std::optional<base::TimeTicks> ScrollTimeline::Duration(
     const ScrollTree& scroll_tree,
     bool is_active_tree) const {
   double start_offset = 0;
@@ -163,7 +163,7 @@
     const std::vector<scoped_refptr<Animation>>& ticking_animations,
     const ScrollTree& scroll_tree,
     bool is_active_tree) {
-  absl::optional<base::TimeTicks> tick_time =
+  std::optional<base::TimeTicks> tick_time =
       CurrentTime(scroll_tree, is_active_tree);
   if (!tick_time)
     return false;
@@ -192,8 +192,8 @@
 }
 
 void ScrollTimeline::UpdateScrollerIdAndScrollOffsets(
-    absl::optional<ElementId> pending_id,
-    absl::optional<ScrollOffsets> pending_offsets) {
+    std::optional<ElementId> pending_id,
+    std::optional<ScrollOffsets> pending_offsets) {
   if (pending_id_.Read(*this) == pending_id &&
       pending_offsets_.Read(*this) == pending_offsets) {
     return;
diff --git a/cc/animation/scroll_timeline.h b/cc/animation/scroll_timeline.h
index 2499cf7..7df893f 100644
--- a/cc/animation/scroll_timeline.h
+++ b/cc/animation/scroll_timeline.h
@@ -5,13 +5,13 @@
 #ifndef CC_ANIMATION_SCROLL_TIMELINE_H_
 #define CC_ANIMATION_SCROLL_TIMELINE_H_
 
+#include <optional>
 #include <vector>
 #include "base/time/time.h"
 #include "cc/animation/animation_export.h"
 #include "cc/animation/animation_timeline.h"
 #include "cc/animation/keyframe_model.h"
 #include "cc/paint/element_id.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -82,15 +82,15 @@
   //          = 16 range
   static constexpr double kScrollTimelineMicrosecondsPerPixel = 16;
 
-  ScrollTimeline(absl::optional<ElementId> scroller_id,
+  ScrollTimeline(std::optional<ElementId> scroller_id,
                  ScrollDirection direction,
-                 absl::optional<ScrollOffsets> scroll_offsets,
+                 std::optional<ScrollOffsets> scroll_offsets,
                  int animation_timeline_id);
 
   static scoped_refptr<ScrollTimeline> Create(
-      absl::optional<ElementId> scroller_id,
+      std::optional<ElementId> scroller_id,
       ScrollDirection direction,
-      absl::optional<ScrollOffsets> scroll_offsets);
+      std::optional<ScrollOffsets> scroll_offsets);
 
   // Create a copy of this ScrollTimeline intended for the impl thread in the
   // compositor.
@@ -102,20 +102,19 @@
                         bool is_active_tree) const;
 
   // Calculate the current time of the ScrollTimeline. This is either a
-  // base::TimeTicks value or absl::nullopt if the current time is unresolved.
+  // base::TimeTicks value or std::nullopt if the current time is unresolved.
   // The internal calculations are performed using doubles and the result is
   // converted to base::TimeTicks. This limits the precision to 1us.
-  virtual absl::optional<base::TimeTicks> CurrentTime(
+  virtual std::optional<base::TimeTicks> CurrentTime(
       const ScrollTree& scroll_tree,
       bool is_active_tree) const;
 
-  virtual absl::optional<base::TimeTicks> Duration(
-      const ScrollTree& scroll_tree,
-      bool is_active_tree) const;
+  virtual std::optional<base::TimeTicks> Duration(const ScrollTree& scroll_tree,
+                                                  bool is_active_tree) const;
 
   void UpdateScrollerIdAndScrollOffsets(
-      absl::optional<ElementId> scroller_id,
-      absl::optional<ScrollOffsets> scroll_offsets);
+      std::optional<ElementId> scroller_id,
+      std::optional<ScrollOffsets> scroll_offsets);
 
   void PushPropertiesTo(AnimationTimeline* impl_timeline) override;
   void ActivateTimeline() override;
@@ -125,22 +124,22 @@
       const ScrollTree& scroll_tree,
       bool is_active_tree) override;
 
-  absl::optional<ElementId> GetActiveIdForTest() const { return active_id(); }
-  absl::optional<ElementId> GetPendingIdForTest() const { return pending_id(); }
+  std::optional<ElementId> GetActiveIdForTest() const { return active_id(); }
+  std::optional<ElementId> GetPendingIdForTest() const { return pending_id(); }
   ScrollDirection GetDirectionForTest() const { return direction(); }
-  absl::optional<double> GetStartScrollOffsetForTest() const {
-    absl::optional<ScrollOffsets> offsets = pending_offsets();
+  std::optional<double> GetStartScrollOffsetForTest() const {
+    std::optional<ScrollOffsets> offsets = pending_offsets();
     if (offsets) {
       return offsets->start;
     }
-    return absl::nullopt;
+    return std::nullopt;
   }
-  absl::optional<double> GetEndScrollOffsetForTest() const {
-    absl::optional<ScrollOffsets> offsets = pending_offsets();
+  std::optional<double> GetEndScrollOffsetForTest() const {
+    std::optional<ScrollOffsets> offsets = pending_offsets();
     if (offsets) {
       return offsets->end;
     }
-    return absl::nullopt;
+    return std::nullopt;
   }
 
   bool IsScrollTimeline() const override;
@@ -150,21 +149,21 @@
   ~ScrollTimeline() override;
 
  private:
-  const absl::optional<ElementId>& active_id() const {
+  const std::optional<ElementId>& active_id() const {
     return active_id_.Read(*this);
   }
 
-  const absl::optional<ElementId>& pending_id() const {
+  const std::optional<ElementId>& pending_id() const {
     return pending_id_.Read(*this);
   }
 
   const ScrollDirection& direction() const { return direction_.Read(*this); }
 
-  const absl::optional<ScrollOffsets>& active_offsets() const {
+  const std::optional<ScrollOffsets>& active_offsets() const {
     return active_offsets_.Read(*this);
   }
 
-  const absl::optional<ScrollOffsets>& pending_offsets() const {
+  const std::optional<ScrollOffsets>& pending_offsets() const {
     return pending_offsets_.Read(*this);
   }
 
@@ -173,15 +172,15 @@
   // http://crbug.com/847588).
 
   // Only the impl thread can set active properties.
-  ProtectedSequenceForbidden<absl::optional<ElementId>> active_id_;
-  ProtectedSequenceWritable<absl::optional<ElementId>> pending_id_;
+  ProtectedSequenceForbidden<std::optional<ElementId>> active_id_;
+  ProtectedSequenceWritable<std::optional<ElementId>> pending_id_;
 
   // The direction of the ScrollTimeline indicates which axis of the scroller
   // it should base its current time on, and where the origin point is.
   ProtectedSequenceReadable<ScrollDirection> direction_;
 
-  ProtectedSequenceForbidden<absl::optional<ScrollOffsets>> active_offsets_;
-  ProtectedSequenceWritable<absl::optional<ScrollOffsets>> pending_offsets_;
+  ProtectedSequenceForbidden<std::optional<ScrollOffsets>> active_offsets_;
+  ProtectedSequenceWritable<std::optional<ScrollOffsets>> pending_offsets_;
 };
 
 inline ScrollTimeline* ToScrollTimeline(AnimationTimeline* timeline) {
diff --git a/cc/animation/scroll_timeline_unittest.cc b/cc/animation/scroll_timeline_unittest.cc
index a14904b..271c70f 100644
--- a/cc/animation/scroll_timeline_unittest.cc
+++ b/cc/animation/scroll_timeline_unittest.cc
@@ -82,7 +82,7 @@
 // Helper method to convert base::TimeTicks to double.
 // Returns double milliseconds if the input value is resolved or
 // std::numeric_limits<double>::quiet_NaN() otherwise.
-double ToDouble(absl::optional<base::TimeTicks> time_ticks) {
+double ToDouble(std::optional<base::TimeTicks> time_ticks) {
   if (time_ticks)
     return (time_ticks.value() - base::TimeTicks()).InMillisecondsF();
   return std::numeric_limits<double>::quiet_NaN();
@@ -393,7 +393,7 @@
   double scroll_size = content_size().height() - container_size().height();
   ScrollTimeline::ScrollOffsets scroll_offsets(0, scroll_size);
   scoped_refptr<ScrollTimeline> inactive_timeline1 = ScrollTimeline::Create(
-      absl::nullopt, ScrollTimeline::ScrollDown, scroll_offsets);
+      std::nullopt, ScrollTimeline::ScrollDown, scroll_offsets);
   EXPECT_FALSE(
       inactive_timeline1->IsActive(scroll_tree(), false /*is_active_tree*/));
   EXPECT_FALSE(
@@ -413,7 +413,7 @@
   // ScrollTimeline with empty scroll offsets is inactive.
   scoped_refptr<ScrollTimeline> inactive_timeline3 =
       ScrollTimeline::Create(scroller_id(), ScrollTimeline::ScrollDown,
-                             /* scroll_offsets */ absl::nullopt);
+                             /* scroll_offsets */ std::nullopt);
   EXPECT_FALSE(
       inactive_timeline3->IsActive(scroll_tree(), false /*is_active_tree*/));
   EXPECT_FALSE(
diff --git a/cc/animation/worklet_animation.cc b/cc/animation/worklet_animation.cc
index 7f952d9..bdca282 100644
--- a/cc/animation/worklet_animation.cc
+++ b/cc/animation/worklet_animation.cc
@@ -122,7 +122,7 @@
   // TODO(https://crbug.com/1011138): Initialize current_time to null if the
   // timeline is inactive. It might be inactive here when state is
   // State::REMOVED.
-  absl::optional<base::TimeDelta> current_time =
+  std::optional<base::TimeDelta> current_time =
       CurrentTime(monotonic_time, scroll_tree, is_active_tree);
 
   // When the timeline is inactive (only the case with scroll timelines), the
@@ -199,18 +199,18 @@
   has_pending_tree_lock_.Write(*this) = false;
 }
 
-absl::optional<base::TimeDelta> WorkletAnimation::CurrentTime(
+std::optional<base::TimeDelta> WorkletAnimation::CurrentTime(
     base::TimeTicks monotonic_time,
     const ScrollTree& scroll_tree,
     bool is_active_tree) {
   DCHECK(IsTimelineActive(scroll_tree, is_active_tree));
   base::TimeTicks timeline_time;
   if (animation_timeline()->IsScrollTimeline()) {
-    absl::optional<base::TimeTicks> scroll_monotonic_time =
+    std::optional<base::TimeTicks> scroll_monotonic_time =
         ToScrollTimeline(animation_timeline())
             ->CurrentTime(scroll_tree, is_active_tree);
     if (!scroll_monotonic_time)
-      return absl::nullopt;
+      return std::nullopt;
     timeline_time = scroll_monotonic_time.value();
   } else {
     timeline_time = monotonic_time;
@@ -230,7 +230,7 @@
   if (!IsTimelineActive(scroll_tree, is_active_tree))
     return false;
 
-  absl::optional<base::TimeDelta> current_time =
+  std::optional<base::TimeDelta> current_time =
       CurrentTime(monotonic_time, scroll_tree, is_active_tree);
   bool needs_update = last_current_time_.Read(*this) != current_time;
   return needs_update;
diff --git a/cc/animation/worklet_animation.h b/cc/animation/worklet_animation.h
index b9cd272..5ce3b1ed 100644
--- a/cc/animation/worklet_animation.h
+++ b/cc/animation/worklet_animation.h
@@ -8,13 +8,13 @@
 #include <memory>
 #include <string>
 
+#include <optional>
 #include "base/gtest_prod_util.h"
 #include "base/time/time.h"
 #include "cc/animation/animation.h"
 #include "cc/animation/animation_export.h"
 #include "cc/animation/animation_host.h"
 #include "cc/trees/property_tree.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -86,9 +86,9 @@
   // The current time is based on the timeline associated with the animation and
   // in case of scroll timeline it may be nullopt when the associated scrolling
   // node is not available in the particular ScrollTree.
-  absl::optional<base::TimeDelta> CurrentTime(base::TimeTicks monotonic_time,
-                                              const ScrollTree& scroll_tree,
-                                              bool is_active_tree);
+  std::optional<base::TimeDelta> CurrentTime(base::TimeTicks monotonic_time,
+                                             const ScrollTree& scroll_tree,
+                                             bool is_active_tree);
 
   // Returns true if the worklet animation needs to be updated which happens iff
   // its current time is going to be different from last time given these input.
@@ -130,19 +130,19 @@
   // Local time is used as an input to the keyframe effect of this animation.
   // The value comes from the user script that runs inside the animation worklet
   // global scope.
-  ProtectedSequenceReadable<absl::optional<base::TimeDelta>> local_time_;
+  ProtectedSequenceReadable<std::optional<base::TimeDelta>> local_time_;
   // Local time passed to the main thread worklet animation to update its
   // keyframe effect. We only set the most recent local time, meaning that if
   // there are multiple compositor frames without a single main frame only
   // the local time associated with the latest frame is sent to the main thread.
-  ProtectedSequenceReadable<absl::optional<base::TimeDelta>>
+  ProtectedSequenceReadable<std::optional<base::TimeDelta>>
       last_synced_local_time_;
 
-  ProtectedSequenceReadable<absl::optional<base::TimeTicks>> start_time_;
+  ProtectedSequenceReadable<std::optional<base::TimeTicks>> start_time_;
 
   // Last current time used for updating. We use this to skip updating if
   // current time has not changed since last update.
-  ProtectedSequenceReadable<absl::optional<base::TimeDelta>> last_current_time_;
+  ProtectedSequenceReadable<std::optional<base::TimeDelta>> last_current_time_;
 
   // To ensure that 'time' progresses forward for scroll animations, we guard
   // against allowing active tree mutations while the pending tree has a
diff --git a/cc/animation/worklet_animation_unittest.cc b/cc/animation/worklet_animation_unittest.cc
index 6674c716..6125317 100644
--- a/cc/animation/worklet_animation_unittest.cc
+++ b/cc/animation/worklet_animation_unittest.cc
@@ -60,10 +60,10 @@
   MockScrollTimeline()
       : ScrollTimeline(ElementId(),
                        ScrollTimeline::ScrollDown,
-                       /* scroll_offsets */ absl::nullopt,
+                       /* scroll_offsets */ std::nullopt,
                        AnimationIdProvider::NextTimelineId()) {}
   MOCK_CONST_METHOD2(CurrentTime,
-                     absl::optional<base::TimeTicks>(const ScrollTree&, bool));
+                     std::optional<base::TimeTicks>(const ScrollTree&, bool));
   MOCK_CONST_METHOD2(IsActive, bool(const ScrollTree&, bool));
 
  protected:
@@ -122,7 +122,7 @@
 TEST_F(WorkletAnimationTest, AnimationEventLocalTimeUpdate) {
   AttachWorkletAnimation();
 
-  absl::optional<base::TimeDelta> local_time = base::Seconds(1);
+  std::optional<base::TimeDelta> local_time = base::Seconds(1);
   MutatorOutputState::AnimationState state(worklet_animation_id_);
   state.local_times.push_back(local_time);
   worklet_animation_->SetOutputState(state);
@@ -156,7 +156,7 @@
   // If local time is set to null value, an animation event with null local
   // time is generated.
   state.local_times.clear();
-  local_time = absl::nullopt;
+  local_time = std::nullopt;
   state.local_times.push_back(local_time);
   worklet_animation_->SetOutputState(state);
   mutator_events = host_->CreateEvents();
@@ -489,8 +489,8 @@
   EXPECT_EQ(input->removed_animations.size(), 1u);
 }
 
-absl::optional<base::TimeTicks> FakeIncreasingScrollTimelineTime(Unused,
-                                                                 Unused) {
+std::optional<base::TimeTicks> FakeIncreasingScrollTimelineTime(Unused,
+                                                                Unused) {
   static base::TimeTicks current_time;
   current_time += base::Seconds(0.1);
   return current_time;
diff --git a/cc/base/list_container.h b/cc/base/list_container.h
index b8210f5..fdeae1b 100644
--- a/cc/base/list_container.h
+++ b/cc/base/list_container.h
@@ -11,9 +11,9 @@
 #include <memory>
 #include <utility>
 
+#include <optional>
 #include "base/check.h"
 #include "cc/base/list_container_helper.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -138,7 +138,7 @@
   Iterator InsertBeforeAndInvalidateAllPointers(
       Iterator at,
       size_t count,
-      const absl::optional<DerivedElementType> source = absl::nullopt) {
+      const std::optional<DerivedElementType> source = std::nullopt) {
     helper_.InsertBeforeAndInvalidateAllPointers(&at, count);
     Iterator result = at;
     for (size_t i = 0; i < count; ++i) {
diff --git a/cc/base/list_container_unittest.cc b/cc/base/list_container_unittest.cc
index 703a62d..00c0701 100644
--- a/cc/base/list_container_unittest.cc
+++ b/cc/base/list_container_unittest.cc
@@ -152,9 +152,9 @@
         << "element destructor called the wrong number of times";
   }
 
-  // Not using absl::optional<size_t> here in order to get a precise destructor
+  // Not using std::optional<size_t> here in order to get a precise destructor
   // behavior. The tests below need the ability to catch multiple destructor
-  // calls, and absl::optional's destructor might make has_value() return false.
+  // calls, and std::optional's destructor might make has_value() return false.
   size_t expected_destructor_calls_;
   bool has_expected_destructor_calls_ = false;
   size_t destructor_calls_ = 0;
diff --git a/cc/benchmarks/invalidation_benchmark.cc b/cc/benchmarks/invalidation_benchmark.cc
index e71c946..e08232b 100644
--- a/cc/benchmarks/invalidation_benchmark.cc
+++ b/cc/benchmarks/invalidation_benchmark.cc
@@ -11,6 +11,7 @@
 #include <string>
 #include <utility>
 
+#include <optional>
 #include "base/rand_util.h"
 #include "base/values.h"
 #include "cc/base/math_util.h"
@@ -18,7 +19,6 @@
 #include "cc/layers/picture_layer.h"
 #include "cc/trees/draw_property_utils.h"
 #include "cc/trees/layer_tree_host.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/rect.h"
 
 namespace cc {
diff --git a/cc/benchmarks/rasterize_and_record_benchmark.cc b/cc/benchmarks/rasterize_and_record_benchmark.cc
index e837a8c..dc3421c 100644
--- a/cc/benchmarks/rasterize_and_record_benchmark.cc
+++ b/cc/benchmarks/rasterize_and_record_benchmark.cc
@@ -10,6 +10,7 @@
 #include <limits>
 #include <string>
 
+#include <optional>
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/task/single_thread_task_runner.h"
@@ -20,7 +21,6 @@
 #include "cc/layers/recording_source.h"
 #include "cc/paint/display_item_list.h"
 #include "cc/trees/layer_tree_host.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/rect.h"
 
 namespace cc {
diff --git a/cc/benchmarks/rasterize_and_record_benchmark_impl.cc b/cc/benchmarks/rasterize_and_record_benchmark_impl.cc
index 2d3efd2..5e62bbb 100644
--- a/cc/benchmarks/rasterize_and_record_benchmark_impl.cc
+++ b/cc/benchmarks/rasterize_and_record_benchmark_impl.cc
@@ -63,7 +63,7 @@
 
       // Pass an empty settings to make sure that the decode cache is used to
       // replace all images.
-      absl::optional<PlaybackImageProvider::Settings> image_settings;
+      std::optional<PlaybackImageProvider::Settings> image_settings;
       image_settings.emplace();
       image_settings->images_to_skip = {};
       image_settings->image_to_current_frame_index = {};
diff --git a/cc/benchmarks/unittest_only_benchmark.cc b/cc/benchmarks/unittest_only_benchmark.cc
index 8096876..2bb40d8 100644
--- a/cc/benchmarks/unittest_only_benchmark.cc
+++ b/cc/benchmarks/unittest_only_benchmark.cc
@@ -6,12 +6,12 @@
 
 #include <utility>
 
+#include <optional>
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/values.h"
 #include "cc/benchmarks/unittest_only_benchmark_impl.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
diff --git a/cc/input/browser_controls_offset_manager.cc b/cc/input/browser_controls_offset_manager.cc
index 7ee3f4a..4c6bc64 100644
--- a/cc/input/browser_controls_offset_manager.cc
+++ b/cc/input/browser_controls_offset_manager.cc
@@ -522,11 +522,11 @@
 
   float old_top_offset = ContentTopOffset();
   float old_bottom_offset = ContentBottomOffset();
-  absl::optional<float> new_top_ratio =
+  std::optional<float> new_top_ratio =
       top_controls_animation_.Tick(monotonic_time);
   if (!new_top_ratio.has_value())
     new_top_ratio = TopControlsShownRatio();
-  absl::optional<float> new_bottom_ratio =
+  std::optional<float> new_bottom_ratio =
       bottom_controls_animation_.Tick(monotonic_time);
   if (!new_bottom_ratio.has_value())
     new_bottom_ratio = BottomControlsShownRatio();
@@ -573,9 +573,9 @@
 
 void BrowserControlsOffsetManager::ResetAnimations() {
   // If the animation doesn't need to jump to the end, Animation::Reset() will
-  // return |absl::nullopt|.
-  absl::optional<float> top_ratio = top_controls_animation_.Reset();
-  absl::optional<float> bottom_ratio = bottom_controls_animation_.Reset();
+  // return |std::nullopt|.
+  std::optional<float> top_ratio = top_controls_animation_.Reset();
+  std::optional<float> bottom_ratio = bottom_controls_animation_.Reset();
 
   if (top_ratio.has_value() || bottom_ratio.has_value()) {
     client_->SetCurrentBrowserControlsShownRatio(
@@ -740,10 +740,10 @@
             std::max(start_value_, stop_value_));
 }
 
-absl::optional<float> BrowserControlsOffsetManager::Animation::Tick(
+std::optional<float> BrowserControlsOffsetManager::Animation::Tick(
     base::TimeTicks monotonic_time) {
   if (!IsInitialized())
-    return absl::nullopt;
+    return std::nullopt;
 
   if (!started_) {
     start_time_ = monotonic_time;
@@ -767,11 +767,11 @@
   max_value_ = max;
 }
 
-absl::optional<float> BrowserControlsOffsetManager::Animation::Reset() {
+std::optional<float> BrowserControlsOffsetManager::Animation::Reset() {
   auto ret =
       jump_to_end_on_reset_
-          ? absl::make_optional(std::clamp(stop_value_, min_value_, max_value_))
-          : absl::nullopt;
+          ? std::make_optional(std::clamp(stop_value_, min_value_, max_value_))
+          : std::nullopt;
 
   started_ = false;
   initialized_ = false;
diff --git a/cc/input/browser_controls_offset_manager.h b/cc/input/browser_controls_offset_manager.h
index 9a468fe..501082f 100644
--- a/cc/input/browser_controls_offset_manager.h
+++ b/cc/input/browser_controls_offset_manager.h
@@ -8,12 +8,12 @@
 #include <memory>
 #include <utility>
 
+#include <optional>
 #include "base/memory/raw_ptr.h"
 #include "base/time/time.h"
 #include "cc/input/browser_controls_state.h"
 #include "cc/layers/layer_impl.h"
 #include "cc/trees/browser_controls_params.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/geometry/vector2d_f.h"
 
@@ -175,11 +175,10 @@
 
   // Minimum and maximum values |top_controls_min_height_offset_| can take
   // during the current min-height change animation.
-  absl::optional<std::pair<float, float>>
-      top_min_height_offset_animation_range_;
+  std::optional<std::pair<float, float>> top_min_height_offset_animation_range_;
   // Minimum and maximum values |bottom_controls_min_height_offset_| can take
   // during the current min-height change animation.
-  absl::optional<std::pair<float, float>>
+  std::optional<std::pair<float, float>>
       bottom_min_height_offset_animation_range_;
 
   // Should ScrollEnd() animate the controls into view?  This is used if there's
@@ -206,14 +205,14 @@
                     int64_t duration,
                     bool jump_to_end_on_reset);
     // Returns the animated value for the given monotonic time tick if the
-    // animation is initialized. Otherwise, returns |absl::nullopt|.
-    absl::optional<float> Tick(base::TimeTicks monotonic_time);
+    // animation is initialized. Otherwise, returns |std::nullopt|.
+    std::optional<float> Tick(base::TimeTicks monotonic_time);
     // Set the minimum and maximum values the animation can have.
     void SetBounds(float min, float max);
     // Reset the properties. If |skip_to_end_on_reset_| is false, this function
-    // will return |absl::nullopt|. Otherwise, it will return the end value
+    // will return |std::nullopt|. Otherwise, it will return the end value
     // (clamped to min-max).
-    absl::optional<float> Reset();
+    std::optional<float> Reset();
 
     // Returns the value the animation will end on. This will be the stop_value
     // passed to the constructor clamped by the currently configured bounds.
diff --git a/cc/input/input_handler.cc b/cc/input/input_handler.cc
index 1bd808cc..9966414 100644
--- a/cc/input/input_handler.cc
+++ b/cc/input/input_handler.cc
@@ -821,7 +821,7 @@
   return true;
 }
 
-absl::optional<gfx::PointF> InputHandler::ConstrainFling(gfx::PointF original) {
+std::optional<gfx::PointF> InputHandler::ConstrainFling(gfx::PointF original) {
   gfx::PointF fling = original;
   if (fling_snap_constrain_x_) {
     fling.set_x(std::clamp(fling.x(), fling_snap_constrain_x_->GetMin(),
@@ -831,7 +831,7 @@
     fling.set_y(std::clamp(fling.y(), fling_snap_constrain_y_->GetMin(),
                            fling_snap_constrain_y_->GetMax()));
   }
-  return original == fling ? absl::nullopt : absl::make_optional(fling);
+  return original == fling ? std::nullopt : std::make_optional(fling);
 }
 
 bool InputHandler::GetSnapFlingInfoAndSetAnimatingSnapTarget(
@@ -856,7 +856,7 @@
   gfx::PointF new_offset = current_offset + current_delta_in_content;
 
   if (snap_fling_state_ == kConstrainedNativeFling) {
-    if (absl::optional<gfx::PointF> constrained = ConstrainFling(new_offset)) {
+    if (std::optional<gfx::PointF> constrained = ConstrainFling(new_offset)) {
       snap_displacement = *constrained - current_offset;
     } else {
       return false;
diff --git a/cc/input/input_handler.h b/cc/input/input_handler.h
index 22b1cda..29d96c936 100644
--- a/cc/input/input_handler.h
+++ b/cc/input/input_handler.h
@@ -634,7 +634,7 @@
     return scrollbar_controller_.get();
   }
 
-  absl::optional<gfx::PointF> ConstrainFling(gfx::PointF original);
+  std::optional<gfx::PointF> ConstrainFling(gfx::PointF original);
 
   // The input handler is owned by the delegate so their lifetimes are tied
   // together.
@@ -659,12 +659,12 @@
 
   // The source device type that started the scroll gesture. Only set between a
   // ScrollBegin and ScrollEnd.
-  absl::optional<ui::ScrollInputType> latched_scroll_type_;
+  std::optional<ui::ScrollInputType> latched_scroll_type_;
 
   // Tracks the last scroll update/begin state received. Used to infer the most
   // recent scroll type and direction.
-  absl::optional<ScrollState> last_scroll_begin_state_;
-  absl::optional<ScrollState> last_scroll_update_state_;
+  std::optional<ScrollState> last_scroll_begin_state_;
+  std::optional<ScrollState> last_scroll_update_state_;
 
   // If a scroll snap is being animated, then the value of this will be the
   // element id(s) of the target(s). Otherwise, the ids will be invalid.
@@ -679,8 +679,8 @@
     kSnapFling
   };
   SnapFlingState snap_fling_state_ = kNoFling;
-  absl::optional<gfx::RangeF> fling_snap_constrain_x_;
-  absl::optional<gfx::RangeF> fling_snap_constrain_y_;
+  std::optional<gfx::RangeF> fling_snap_constrain_x_;
+  std::optional<gfx::RangeF> fling_snap_constrain_y_;
 
   // A set of elements that scroll-snapped to a new target since the last
   // begin main frame. The snap target ids of these elements will be sent to
diff --git a/cc/input/scroll_snap_data.cc b/cc/input/scroll_snap_data.cc
index 8ab1da7..5a828307 100644
--- a/cc/input/scroll_snap_data.cc
+++ b/cc/input/scroll_snap_data.cc
@@ -46,7 +46,7 @@
 }
 
 void SetOrUpdateResult(const SnapSearchResult& candidate,
-                       absl::optional<SnapSearchResult>* result,
+                       std::optional<SnapSearchResult>* result,
                        const ElementId& active_element_id) {
   if (result->has_value()) {
     result->value().Union(candidate);
@@ -57,11 +57,11 @@
   }
 }
 
-const absl::optional<SnapSearchResult>& ClosestSearchResult(
+const std::optional<SnapSearchResult>& ClosestSearchResult(
     const gfx::PointF reference_point,
     SearchAxis axis,
-    const absl::optional<SnapSearchResult>& a,
-    const absl::optional<SnapSearchResult>& b) {
+    const std::optional<SnapSearchResult>& a,
+    const std::optional<SnapSearchResult>& b) {
   if (!a.has_value())
     return b;
   if (!b.has_value())
@@ -81,7 +81,7 @@
   return distance_a < distance_b ? a : b;
 }
 
-absl::optional<SnapSearchResult> SearchResultForDodgingRange(
+std::optional<SnapSearchResult> SearchResultForDodgingRange(
     const gfx::RangeF& area_range,
     const gfx::RangeF& dodging_range,
     const SnapSearchResult& aligned_candidate,
@@ -90,7 +90,7 @@
     float snapport_size,
     SnapAlignment alignment) {
   if (dodging_range.is_empty() || dodging_range.is_reversed()) {
-    return absl::nullopt;
+    return std::nullopt;
   }
 
   // Use aligned_candidate as a template (we will override snap_offset and
@@ -129,7 +129,7 @@
   min_offset = area_range.start() - scroll_padding;
   max_offset = area_range.end() - scroll_padding - snapport_size;
   if (max_offset < min_offset) {
-    return absl::nullopt;
+    return std::nullopt;
   }
 
   result.set_snap_offset(std::clamp(offset, min_offset, max_offset));
@@ -229,7 +229,7 @@
       strategy.ShouldPrioritizeSnapTargets() &&
       target_snap_area_element_ids_.y != ElementId();
 
-  absl::optional<SnapSearchResult> selected_x, selected_y;
+  std::optional<SnapSearchResult> selected_x, selected_y;
   if (should_snap_on_x) {
     // Start from current position in the cross axis. The search algorithm
     // expects the cross axis position to be inside scroller bounds. But since
@@ -387,7 +387,7 @@
   return snapped_target_ids;
 }
 
-absl::optional<SnapSearchResult>
+std::optional<SnapSearchResult>
 SnapContainerData::GetTargetSnapAreaSearchResult(
     const SnapSelectionStrategy& strategy,
     SearchAxis axis,
@@ -396,7 +396,7 @@
                             ? target_snap_area_element_ids_.x
                             : target_snap_area_element_ids_.y;
   if (target_id == ElementId())
-    return absl::nullopt;
+    return std::nullopt;
   for (const SnapAreaData& area : snap_area_list_) {
     if (area.element_id == target_id && strategy.IsValidSnapArea(axis, area)) {
       auto aligned_result = GetSnapSearchResult(axis, area);
@@ -420,7 +420,7 @@
       return aligned_result;
     }
   }
-  return absl::nullopt;
+  return std::nullopt;
 }
 
 void SnapContainerData::UpdateSnapAreaForTesting(ElementId element_id,
@@ -446,12 +446,12 @@
   return true;
 }
 
-absl::optional<SnapSearchResult> SnapContainerData::FindClosestValidArea(
+std::optional<SnapSearchResult> SnapContainerData::FindClosestValidArea(
     SearchAxis axis,
     const SnapSelectionStrategy& strategy,
     const SnapSearchResult& cross_axis_snap_result,
     const ElementId& active_element_id) const {
-  absl::optional<SnapSearchResult> result = FindClosestValidAreaInternal(
+  std::optional<SnapSearchResult> result = FindClosestValidAreaInternal(
       axis, strategy, cross_axis_snap_result, active_element_id);
 
   // For EndAndDirectionStrategy, if there is a snap area with snap-stop:always,
@@ -467,7 +467,7 @@
             strategy.current_position(),
             strategy.intended_position() - strategy.current_position(),
             strategy.UsingFractionalOffsets(), SnapStopAlwaysFilter::kRequire);
-    absl::optional<SnapSearchResult> must_only_result =
+    std::optional<SnapSearchResult> must_only_result =
         FindClosestValidAreaInternal(axis, *must_only_strategy,
                                      cross_axis_snap_result, active_element_id,
                                      false);
@@ -493,14 +493,13 @@
       axis, *relaxed_strategy, cross_axis_snap_result, active_element_id);
 }
 
-absl::optional<SnapSearchResult>
-SnapContainerData::FindClosestValidAreaInternal(
+std::optional<SnapSearchResult> SnapContainerData::FindClosestValidAreaInternal(
     SearchAxis axis,
     const SnapSelectionStrategy& strategy,
     const SnapSearchResult& cross_axis_snap_result,
     const ElementId& active_element_id,
     bool should_consider_covering,
-    absl::optional<gfx::RangeF> active_element_range) const {
+    std::optional<gfx::RangeF> active_element_range) const {
   bool horiz = axis == SearchAxis::kX;
   // The cross axis result is expected to be within bounds otherwise no snap
   // area will meet the mutual visibility requirement.
@@ -509,10 +508,10 @@
              (horiz ? max_position_.y() : max_position_.x()));
 
   // The search result from the snap area that's closest to the search origin.
-  absl::optional<SnapSearchResult> closest;
+  std::optional<SnapSearchResult> closest;
   // The search result with the intended position if it makes a snap area cover
   // the snapport.
-  absl::optional<SnapSearchResult> covering_intended;
+  std::optional<SnapSearchResult> covering_intended;
 
   // The intended position of the scroll operation if there's no snap. This
   // scroll position becomes the covering candidate if there is a snap area that
@@ -562,7 +561,7 @@
         (base::FeatureList::IsEnabled(features::kScrollSnapPreferCloserCovering)
              ? CanCoverSnapportOnAxis(axis, rect_, area.rect)
              : IsSnapportCoveredOnAxis(axis, intended_position, area.rect))) {
-      if (absl::optional<SnapSearchResult> covering =
+      if (std::optional<SnapSearchResult> covering =
               FindCoveringCandidate(area, axis, candidate, intended_position)) {
         if (covering->snap_offset() == intended_position) {
           SetOrUpdateResult(*covering, &covering_intended, active_element_id);
@@ -584,7 +583,7 @@
     // generates a snap position rejecting the current inplace candidate.
   }
 
-  const absl::optional<SnapSearchResult>& picked =
+  const std::optional<SnapSearchResult>& picked =
       strategy.PickBestResult(closest, covering_intended);
   return picked;
 }
@@ -637,7 +636,7 @@
   return result;
 }
 
-absl::optional<SnapSearchResult> SnapContainerData::FindCoveringCandidate(
+std::optional<SnapSearchResult> SnapContainerData::FindCoveringCandidate(
     const SnapAreaData& area,
     SearchAxis axis,
     const SnapSearchResult& aligned_candidate,
@@ -721,7 +720,7 @@
     }
   }
 
-  absl::optional<SnapSearchResult> middle_candidate =
+  std::optional<SnapSearchResult> middle_candidate =
       SearchResultForDodgingRange(area_range, middle_dodging_range,
                                   aligned_candidate, intended_position,
                                   scroll_padding, snapport_size, alignment);
@@ -729,11 +728,11 @@
     return middle_candidate;
   }
 
-  absl::optional<SnapSearchResult> backward_candidate =
+  std::optional<SnapSearchResult> backward_candidate =
       SearchResultForDodgingRange(area_range, backward_dodging_range,
                                   aligned_candidate, intended_position,
                                   scroll_padding, snapport_size, alignment);
-  absl::optional<SnapSearchResult> forward_candidate =
+  std::optional<SnapSearchResult> forward_candidate =
       SearchResultForDodgingRange(area_range, forward_dodging_range,
                                   aligned_candidate, intended_position,
                                   scroll_padding, snapport_size, alignment);
@@ -783,7 +782,10 @@
   }
 }
 
-constexpr float kSnappedToTolerance = 0.5;
+// TODO(crbug.com/1501103): Use tolerance value less than 1.
+// It is currently set to 1 because of differences in the way Blink and cc
+// currently handle fractional offsets when snapping.
+constexpr float kSnappedToTolerance = 1.0;
 bool SnapContainerData::IsSnappedToArea(
     const SnapAreaData& area,
     const gfx::PointF& scroll_offset) const {
@@ -802,7 +804,7 @@
   if (snaps_on_y &&
       area.scroll_snap_align.alignment_block != SnapAlignment::kNone) {
     SnapSearchResult snap_result_y = GetSnapSearchResult(SearchAxis::kY, area);
-    if (((std::abs(snap_result_y.snap_offset() - scroll_offset.y()) <
+    if (((std::abs(snap_result_y.snap_offset() - scroll_offset.y()) <=
           kSnappedToTolerance) ||
          covered_on_y) &&
         gfx::RangeF(scroll_offset.x())
@@ -813,7 +815,7 @@
   if (snaps_on_x &&
       area.scroll_snap_align.alignment_inline != SnapAlignment::kNone) {
     SnapSearchResult snap_result_x = GetSnapSearchResult(SearchAxis::kX, area);
-    if (((std::abs(snap_result_x.snap_offset() - scroll_offset.x()) <
+    if (((std::abs(snap_result_x.snap_offset() - scroll_offset.x()) <=
           kSnappedToTolerance) ||
          covered_on_x) &&
         gfx::RangeF(scroll_offset.y())
diff --git a/cc/input/scroll_snap_data.h b/cc/input/scroll_snap_data.h
index 5f1cbde..1d8844f 100644
--- a/cc/input/scroll_snap_data.h
+++ b/cc/input/scroll_snap_data.h
@@ -9,10 +9,10 @@
 #include <utility>
 #include <vector>
 
+#include <optional>
 #include "base/gtest_prod_util.h"
 #include "cc/cc_export.h"
 #include "cc/paint/element_id.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/rect_f.h"
 #include "ui/gfx/geometry/vector2d_f.h"
 #include "ui/gfx/range/range_f.h"
@@ -114,7 +114,7 @@
   ElementId element_id() const { return element_id_; }
   void set_element_id(ElementId id) { element_id_ = id; }
 
-  absl::optional<gfx::RangeF> covered_range() const { return covered_range_; }
+  std::optional<gfx::RangeF> covered_range() const { return covered_range_; }
   void set_covered_range(const gfx::RangeF& range) { covered_range_ = range; }
 
  private:
@@ -141,7 +141,7 @@
   //
   // If set, indicates the range of scroll offsets for which the snap area
   // covers the viewport. The snap_offset_ will be a point within this range.
-  absl::optional<gfx::RangeF> covered_range_;
+  std::optional<gfx::RangeF> covered_range_;
 };
 
 // Snap area is a bounding box that could be snapped to when a scroll happens in
@@ -217,8 +217,8 @@
   // The elements generating the snap areas on both axes.
   TargetSnapAreaElementIds target_element_ids;
 
-  absl::optional<gfx::RangeF> covered_range_x;
-  absl::optional<gfx::RangeF> covered_range_y;
+  std::optional<gfx::RangeF> covered_range_x;
+  std::optional<gfx::RangeF> covered_range_y;
 };
 
 class CC_EXPORT SnappedTargetData {
@@ -325,19 +325,19 @@
   // it makes a snap area cover the snapport.
   // When |active_element_range| is provided, only snap areas that overlap
   // the active element are considered.
-  absl::optional<SnapSearchResult> FindClosestValidAreaInternal(
+  std::optional<SnapSearchResult> FindClosestValidAreaInternal(
       SearchAxis axis,
       const SnapSelectionStrategy& strategy,
       const SnapSearchResult& cross_axis_snap_result,
       const ElementId& active_element_id,
       bool should_consider_covering = true,
-      absl::optional<gfx::RangeF> active_element_range = absl::nullopt) const;
+      std::optional<gfx::RangeF> active_element_range = std::nullopt) const;
 
   // A wrapper of FindClosestValidAreaInternal(). If
   // FindClosestValidAreaInternal() doesn't return a valid result when the snap
   // type is mandatory and the strategy has an intended direction, we relax the
   // strategy to ignore the direction and find again.
-  absl::optional<SnapSearchResult> FindClosestValidArea(
+  std::optional<SnapSearchResult> FindClosestValidArea(
       SearchAxis axis,
       const SnapSelectionStrategy& strategy,
       const SnapSearchResult& cross_axis_snap_result,
@@ -348,7 +348,7 @@
 
   // Finds the snap area associated with the target snap area element id for the
   // given axis.
-  absl::optional<SnapSearchResult> GetTargetSnapAreaSearchResult(
+  std::optional<SnapSearchResult> GetTargetSnapAreaSearchResult(
       const SnapSelectionStrategy& strategy,
       SearchAxis axis,
       SnapSearchResult cross_axis_snap_result) const;
@@ -369,7 +369,7 @@
   void UpdateSnapAreaForTesting(ElementId element_id,
                                 SnapAreaData snap_area_data);
 
-  absl::optional<SnapSearchResult> FindCoveringCandidate(
+  std::optional<SnapSearchResult> FindCoveringCandidate(
       const SnapAreaData& area,
       SearchAxis axis,
       const SnapSearchResult& aligned_candidate,
diff --git a/cc/input/scrollbar_controller.cc b/cc/input/scrollbar_controller.cc
index e548164..a6f6c83d 100644
--- a/cc/input/scrollbar_controller.cc
+++ b/cc/input/scrollbar_controller.cc
@@ -467,9 +467,9 @@
 
 void ScrollbarController::ResetState() {
   drag_processed_for_current_frame_ = false;
-  drag_state_ = absl::nullopt;
-  autoscroll_state_ = absl::nullopt;
-  captured_scrollbar_metadata_ = absl::nullopt;
+  drag_state_ = std::nullopt;
+  autoscroll_state_ = std::nullopt;
+  captured_scrollbar_metadata_ = std::nullopt;
   if (cancelable_autoscroll_task_) {
     cancelable_autoscroll_task_->Cancel();
     cancelable_autoscroll_task_.reset();
diff --git a/cc/input/scrollbar_controller.h b/cc/input/scrollbar_controller.h
index 30bb658..4d41ff33 100644
--- a/cc/input/scrollbar_controller.h
+++ b/cc/input/scrollbar_controller.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include <optional>
 #include "base/cancelable_callback.h"
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
@@ -16,7 +17,6 @@
 #include "cc/input/scrollbar.h"
 #include "cc/layers/layer_impl.h"
 #include "cc/layers/painted_scrollbar_layer_impl.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 // High level documentation:
 // https://source.chromium.org/chromium/chromium/src/+/main:cc/input/README.md
@@ -322,15 +322,15 @@
   gfx::PointF last_known_pointer_position_;
 
   // Set only while interacting with the scrollbar (eg: drag, click etc).
-  absl::optional<CapturedScrollbarMetadata> captured_scrollbar_metadata_;
+  std::optional<CapturedScrollbarMetadata> captured_scrollbar_metadata_;
 
   // Holds information pertaining to autoscrolling. This member is empty if and
   // only if an autoscroll is *not* in progress or scheduled
-  absl::optional<AutoScrollState> autoscroll_state_;
+  std::optional<AutoScrollState> autoscroll_state_;
 
   // Holds information pertaining to thumb drags. Useful while making decisions
   // about thumb anchoring/snapping.
-  absl::optional<DragState> drag_state_;
+  std::optional<DragState> drag_state_;
 
   // Used to track if a GSU was processed for the current frame or not. Without
   // this, thumb drag will appear jittery. The reason this happens is because
diff --git a/cc/input/snap_selection_strategy.cc b/cc/input/snap_selection_strategy.cc
index a2444095..b69f8e6 100644
--- a/cc/input/snap_selection_strategy.cc
+++ b/cc/input/snap_selection_strategy.cc
@@ -94,9 +94,9 @@
   return snap_targets_prioritization_ == SnapTargetsPrioritization::kRequire;
 }
 
-const absl::optional<SnapSearchResult>& EndPositionStrategy::PickBestResult(
-    const absl::optional<SnapSearchResult>& closest,
-    const absl::optional<SnapSearchResult>& covering) const {
+const std::optional<SnapSearchResult>& EndPositionStrategy::PickBestResult(
+    const std::optional<SnapSearchResult>& closest,
+    const std::optional<SnapSearchResult>& covering) const {
   return covering.has_value() ? covering : closest;
 }
 
@@ -144,9 +144,9 @@
           area.must_snap);
 }
 
-const absl::optional<SnapSearchResult>& DirectionStrategy::PickBestResult(
-    const absl::optional<SnapSearchResult>& closest,
-    const absl::optional<SnapSearchResult>& covering) const {
+const std::optional<SnapSearchResult>& DirectionStrategy::PickBestResult(
+    const std::optional<SnapSearchResult>& closest,
+    const std::optional<SnapSearchResult>& covering) const {
   // We choose the |closest| result only if the default landing position (using
   // the default step) is not a valid snap position (not making a snap area
   // covering the snapport), or the |closest| is closer than the default landing
@@ -215,9 +215,9 @@
   return true;
 }
 
-const absl::optional<SnapSearchResult>& EndAndDirectionStrategy::PickBestResult(
-    const absl::optional<SnapSearchResult>& closest,
-    const absl::optional<SnapSearchResult>& covering) const {
+const std::optional<SnapSearchResult>& EndAndDirectionStrategy::PickBestResult(
+    const std::optional<SnapSearchResult>& closest,
+    const std::optional<SnapSearchResult>& covering) const {
   return covering.has_value() ? covering : closest;
 }
 
diff --git a/cc/input/snap_selection_strategy.h b/cc/input/snap_selection_strategy.h
index 08fa7a41..e9c360f4 100644
--- a/cc/input/snap_selection_strategy.h
+++ b/cc/input/snap_selection_strategy.h
@@ -78,9 +78,9 @@
   // -closest: snap search result representing closest match.
   // -covering: snap search result representing the original target if it makes
   //            a snaparea covering the snapport.
-  virtual const absl::optional<SnapSearchResult>& PickBestResult(
-      const absl::optional<SnapSearchResult>& closest,
-      const absl::optional<SnapSearchResult>& covering) const = 0;
+  virtual const std::optional<SnapSearchResult>& PickBestResult(
+      const std::optional<SnapSearchResult>& closest,
+      const std::optional<SnapSearchResult>& covering) const = 0;
 
   // Returns true when the current scroll offset is provided in fractional
   // pixels.
@@ -125,9 +125,9 @@
   bool HasIntendedDirection() const override;
   bool ShouldPrioritizeSnapTargets() const override;
 
-  const absl::optional<SnapSearchResult>& PickBestResult(
-      const absl::optional<SnapSearchResult>& closest,
-      const absl::optional<SnapSearchResult>& covering) const override;
+  const std::optional<SnapSearchResult>& PickBestResult(
+      const std::optional<SnapSearchResult>& closest,
+      const std::optional<SnapSearchResult>& covering) const override;
 
  private:
   // Whether the x axis and y axis have been scrolled in this scroll gesture.
@@ -168,9 +168,9 @@
   bool IsValidSnapArea(SearchAxis axis,
                        const SnapAreaData& area) const override;
 
-  const absl::optional<SnapSearchResult>& PickBestResult(
-      const absl::optional<SnapSearchResult>& closest,
-      const absl::optional<SnapSearchResult>& covering) const override;
+  const std::optional<SnapSearchResult>& PickBestResult(
+      const std::optional<SnapSearchResult>& closest,
+      const std::optional<SnapSearchResult>& covering) const override;
 
   bool UsingFractionalOffsets() const override;
 
@@ -211,9 +211,9 @@
 
   bool ShouldRespectSnapStop() const override;
 
-  const absl::optional<SnapSearchResult>& PickBestResult(
-      const absl::optional<SnapSearchResult>& closest,
-      const absl::optional<SnapSearchResult>& covering) const override;
+  const std::optional<SnapSearchResult>& PickBestResult(
+      const std::optional<SnapSearchResult>& closest,
+      const std::optional<SnapSearchResult>& covering) const override;
 
   bool UsingFractionalOffsets() const override;
 
diff --git a/cc/layers/append_quads_data.h b/cc/layers/append_quads_data.h
index 939a92d..397d806fc 100644
--- a/cc/layers/append_quads_data.h
+++ b/cc/layers/append_quads_data.h
@@ -8,9 +8,9 @@
 #include <stdint.h>
 #include <vector>
 
+#include <optional>
 #include "cc/cc_export.h"
 #include "components/viz/common/surfaces/surface_id.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -34,7 +34,7 @@
 
   // The non-default number of BeginFrames to wait before forcibly activating
   // this CompositorFrame.
-  absl::optional<uint32_t> deadline_in_frames;
+  std::optional<uint32_t> deadline_in_frames;
 
   // Indicates whether or not one of the layers wants to use the default
   // activation deadline.
diff --git a/cc/layers/deadline_policy.cc b/cc/layers/deadline_policy.cc
index 83f3439..be333d70 100644
--- a/cc/layers/deadline_policy.cc
+++ b/cc/layers/deadline_policy.cc
@@ -52,7 +52,7 @@
 }
 
 DeadlinePolicy::DeadlinePolicy(Type policy_type,
-                               absl::optional<uint32_t> deadline_in_frames)
+                               std::optional<uint32_t> deadline_in_frames)
     : policy_type_(policy_type), deadline_in_frames_(deadline_in_frames) {}
 
 DeadlinePolicy::DeadlinePolicy(const DeadlinePolicy& other) = default;
diff --git a/cc/layers/deadline_policy.h b/cc/layers/deadline_policy.h
index a18f048..4e11c32 100644
--- a/cc/layers/deadline_policy.h
+++ b/cc/layers/deadline_policy.h
@@ -8,9 +8,9 @@
 #include <cstdint>
 #include <string>
 
+#include <optional>
 #include "base/check.h"
 #include "cc/cc_export.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -41,7 +41,7 @@
     return policy_type_ == DeadlinePolicy::kUseExistingDeadline;
   }
 
-  absl::optional<uint32_t> deadline_in_frames() const {
+  std::optional<uint32_t> deadline_in_frames() const {
     DCHECK(policy_type_ == Type::kUseDefaultDeadline ||
            policy_type_ == Type::kUseSpecifiedDeadline ||
            policy_type_ == Type::kUseInfiniteDeadline);
@@ -64,10 +64,10 @@
  private:
   explicit DeadlinePolicy(
       Type policy_type,
-      absl::optional<uint32_t> deadline_in_frames = absl::nullopt);
+      std::optional<uint32_t> deadline_in_frames = std::nullopt);
 
   Type policy_type_;
-  absl::optional<uint32_t> deadline_in_frames_;
+  std::optional<uint32_t> deadline_in_frames_;
 };
 
 }  // namespace cc
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc
index 15ff9a5..14baffe 100644
--- a/cc/layers/heads_up_display_layer_impl.cc
+++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -12,6 +12,7 @@
 #include <utility>
 #include <vector>
 
+#include <optional>
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/shared_memory_mapping.h"
@@ -53,7 +54,6 @@
 #include "gpu/command_buffer/common/shared_image_usage.h"
 #include "gpu/config/gpu_feature_info.h"
 #include "skia/ext/legacy_display_globals.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkFont.h"
 #include "third_party/skia/include/core/SkPaint.h"
 #include "third_party/skia/include/core/SkPath.h"
@@ -252,7 +252,7 @@
   UpdateHudContents();
 
   viz::RasterContextProvider* raster_context_provider = nullptr;
-  absl::optional<viz::RasterContextProvider::ScopedRasterContextLock> lock;
+  std::optional<viz::RasterContextProvider::ScopedRasterContextLock> lock;
   if (draw_mode == DRAW_MODE_HARDWARE) {
     // TODO(penghuang): It would be better to use context_provider() instead of
     // worker_context_provider() if/when it's switched to RasterContextProvider.
diff --git a/cc/layers/heads_up_display_layer_impl.h b/cc/layers/heads_up_display_layer_impl.h
index 768c355..a53b593 100644
--- a/cc/layers/heads_up_display_layer_impl.h
+++ b/cc/layers/heads_up_display_layer_impl.h
@@ -191,7 +191,7 @@
 
   uint32_t throughput_value_ = 0.0f;
   // Obtained from the current BeginFrameArgs.
-  absl::optional<base::TimeDelta> frame_interval_;
+  std::optional<base::TimeDelta> frame_interval_;
   MemoryHistory::Entry memory_entry_;
   int paint_rects_fade_step_ = 0;
   int layout_shift_rects_fade_step_ = 0;
diff --git a/cc/layers/layer.h b/cc/layers/layer.h
index 3b8cae6..efa74a4 100644
--- a/cc/layers/layer.h
+++ b/cc/layers/layer.h
@@ -371,9 +371,9 @@
   // For layer tree mode only.
   void SetBackdropFilterBounds(const gfx::RRectF& backdrop_filter_bounds);
   void ClearBackdropFilterBounds();
-  absl::optional<gfx::RRectF> backdrop_filter_bounds() const {
+  std::optional<gfx::RRectF> backdrop_filter_bounds() const {
     return layer_tree_inputs() ? layer_tree_inputs()->backdrop_filter_bounds
-                               : absl::nullopt;
+                               : std::nullopt;
   }
 
   // For layer tree mode only.
@@ -1070,7 +1070,7 @@
 
     FilterOperations filters;
     FilterOperations backdrop_filters;
-    absl::optional<gfx::RRectF> backdrop_filter_bounds;
+    std::optional<gfx::RRectF> backdrop_filter_bounds;
     float backdrop_filter_quality = 1.0f;
 
     int mirror_count = 0;
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
index afc7759b..0729eae 100644
--- a/cc/layers/layer_impl.cc
+++ b/cc/layers/layer_impl.cc
@@ -146,7 +146,7 @@
 void LayerImpl::PopulateSharedQuadState(viz::SharedQuadState* state,
                                         bool contents_opaque) const {
   EffectNode* effect_node = GetEffectTree().Node(effect_tree_index_);
-  absl::optional<gfx::Rect> clip_rect;
+  std::optional<gfx::Rect> clip_rect;
   if (draw_properties_.is_clipped) {
     clip_rect = draw_properties_.clip_rect;
   }
@@ -184,7 +184,7 @@
       GetScaledDrawTransform(layer_to_content_scale);
 
   EffectNode* effect_node = GetEffectTree().Node(effect_tree_index_);
-  absl::optional<gfx::Rect> clip_rect;
+  std::optional<gfx::Rect> clip_rect;
   if (draw_properties().is_clipped) {
     clip_rect = draw_properties().clip_rect;
   }
@@ -840,7 +840,7 @@
 
 gfx::Vector2dF LayerImpl::GetIdealContentsScale() const {
   const auto& transform = ScreenSpaceTransform();
-  absl::optional<gfx::Vector2dF> transform_scales =
+  std::optional<gfx::Vector2dF> transform_scales =
       gfx::TryComputeTransform2dScaleComponents(transform);
   if (transform_scales) {
     // TODO(crbug.com/1196414): Remove this scale cap.
diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc
index 6254839..933a5c27 100644
--- a/cc/layers/picture_layer.cc
+++ b/cc/layers/picture_layer.cc
@@ -173,7 +173,7 @@
     picture_layer_inputs_.directly_composited_image_default_raster_scale =
         gfx::Vector2dF();
     picture_layer_inputs_.nearest_neighbor = false;
-    absl::optional<DisplayItemList::DirectlyCompositedImageResult> result =
+    std::optional<DisplayItemList::DirectlyCompositedImageResult> result =
         picture_layer_inputs_.display_list->GetDirectlyCompositedImageResult();
     if (result) {
       // Directly composited images are not guaranteed to fully cover every
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index 5e7ae4b..dd5409b 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -2126,9 +2126,9 @@
     // Attempt to re-use an existing PaintRecord if possible.
     new_records[input] = std::make_pair(
         paint_image_id, std::move(paint_worklet_records_[input].second));
-    // The move constructor of absl::optional does not clear the source to
+    // The move constructor of std::optional does not clear the source to
     // nullopt.
-    paint_worklet_records_[input].second = absl::nullopt;
+    paint_worklet_records_[input].second = std::nullopt;
   }
   paint_worklet_records_.swap(new_records);
 
@@ -2158,7 +2158,7 @@
     // the animation system, then invalidate its associated PaintRecord so that
     // we can repaint the PaintWorklet during impl side invalidation.
     if (base::Contains(prop_ids, key))
-      entry.second.second = absl::nullopt;
+      entry.second.second = std::nullopt;
   }
 }
 
diff --git a/cc/layers/render_surface_impl.cc b/cc/layers/render_surface_impl.cc
index ff2bff7f..f667c9d 100644
--- a/cc/layers/render_surface_impl.cc
+++ b/cc/layers/render_surface_impl.cc
@@ -146,7 +146,7 @@
   return OwningEffectNode()->backdrop_filters;
 }
 
-absl::optional<gfx::RRectF> RenderSurfaceImpl::BackdropFilterBounds() const {
+std::optional<gfx::RRectF> RenderSurfaceImpl::BackdropFilterBounds() const {
   return OwningEffectNode()->backdrop_filter_bounds;
 }
 
@@ -454,7 +454,7 @@
   bool contents_opaque = false;
   viz::SharedQuadState* shared_quad_state =
       render_pass->CreateAndAppendSharedQuadState();
-  absl::optional<gfx::Rect> clip_rect;
+  std::optional<gfx::Rect> clip_rect;
   if (draw_properties_.is_clipped) {
     clip_rect = draw_properties_.clip_rect;
   }
diff --git a/cc/layers/render_surface_impl.h b/cc/layers/render_surface_impl.h
index f8d9c3ca..2dfe1f35 100644
--- a/cc/layers/render_surface_impl.h
+++ b/cc/layers/render_surface_impl.h
@@ -12,6 +12,7 @@
 #include <utility>
 #include <vector>
 
+#include <optional>
 #include "base/memory/raw_ptr.h"
 #include "cc/cc_export.h"
 #include "cc/layers/draw_mode.h"
@@ -22,7 +23,6 @@
 #include "components/viz/common/quads/compositor_render_pass.h"
 #include "components/viz/common/quads/shared_quad_state.h"
 #include "components/viz/common/surfaces/subtree_capture_id.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/mask_filter_info.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/rect_f.h"
@@ -213,7 +213,7 @@
 
   const FilterOperations& Filters() const;
   const FilterOperations& BackdropFilters() const;
-  absl::optional<gfx::RRectF> BackdropFilterBounds() const;
+  std::optional<gfx::RRectF> BackdropFilterBounds() const;
   LayerImpl* BackdropMaskLayer() const;
   gfx::Transform SurfaceScale() const;
 
diff --git a/cc/layers/surface_layer.cc b/cc/layers/surface_layer.cc
index a1314dd..29f76dd 100644
--- a/cc/layers/surface_layer.cc
+++ b/cc/layers/surface_layer.cc
@@ -97,8 +97,8 @@
     layer_tree_host()->RemoveSurfaceRange(surface_range);
 
   surface_range = viz::SurfaceRange(
-      surface_id.is_valid() ? absl::optional<viz::SurfaceId>(surface_id)
-                            : absl::nullopt,
+      surface_id.is_valid() ? std::optional<viz::SurfaceId>(surface_id)
+                            : std::nullopt,
       surface_range.end());
 
   if (layer_tree_host() && surface_range.IsValid())
diff --git a/cc/layers/surface_layer.h b/cc/layers/surface_layer.h
index 29c1840..e3b0283 100644
--- a/cc/layers/surface_layer.h
+++ b/cc/layers/surface_layer.h
@@ -73,11 +73,11 @@
     return surface_range_.Read(*this).end();
   }
 
-  const absl::optional<viz::SurfaceId>& oldest_acceptable_fallback() const {
+  const std::optional<viz::SurfaceId>& oldest_acceptable_fallback() const {
     return surface_range_.Read(*this).start();
   }
 
-  absl::optional<uint32_t> deadline_in_frames() const {
+  std::optional<uint32_t> deadline_in_frames() const {
     return deadline_in_frames_.Read(*this);
   }
 
@@ -94,7 +94,7 @@
 
   ProtectedSequenceReadable<bool> may_contain_video_;
   ProtectedSequenceReadable<viz::SurfaceRange> surface_range_;
-  ProtectedSequenceWritable<absl::optional<uint32_t>> deadline_in_frames_;
+  ProtectedSequenceWritable<std::optional<uint32_t>> deadline_in_frames_;
 
   ProtectedSequenceReadable<bool> stretch_content_to_fill_bounds_;
 
diff --git a/cc/layers/surface_layer_impl.cc b/cc/layers/surface_layer_impl.cc
index 48efa6c1..070d8fe 100644
--- a/cc/layers/surface_layer_impl.cc
+++ b/cc/layers/surface_layer_impl.cc
@@ -66,7 +66,7 @@
 }
 
 void SurfaceLayerImpl::SetRange(const viz::SurfaceRange& surface_range,
-                                absl::optional<uint32_t> deadline_in_frames) {
+                                std::optional<uint32_t> deadline_in_frames) {
   if (surface_range_ == surface_range &&
       deadline_in_frames_ == deadline_in_frames) {
     return;
diff --git a/cc/layers/surface_layer_impl.h b/cc/layers/surface_layer_impl.h
index 777b32af..cd1695cf 100644
--- a/cc/layers/surface_layer_impl.h
+++ b/cc/layers/surface_layer_impl.h
@@ -39,10 +39,10 @@
   SurfaceLayerImpl& operator=(const SurfaceLayerImpl&) = delete;
 
   void SetRange(const viz::SurfaceRange& surface_range,
-                absl::optional<uint32_t> deadline_in_frames);
+                std::optional<uint32_t> deadline_in_frames);
   const viz::SurfaceRange& range() const { return surface_range_; }
 
-  absl::optional<uint32_t> deadline_in_frames() const {
+  std::optional<uint32_t> deadline_in_frames() const {
     return deadline_in_frames_;
   }
 
@@ -84,7 +84,7 @@
 
   UpdateSubmissionStateCB update_submission_state_callback_;
   viz::SurfaceRange surface_range_;
-  absl::optional<uint32_t> deadline_in_frames_;
+  std::optional<uint32_t> deadline_in_frames_;
 
   bool stretch_content_to_fill_bounds_ = false;
   bool surface_hit_testable_ = false;
diff --git a/cc/layers/surface_layer_impl_unittest.cc b/cc/layers/surface_layer_impl_unittest.cc
index a00a460..60e68f7 100644
--- a/cc/layers/surface_layer_impl_unittest.cc
+++ b/cc/layers/surface_layer_impl_unittest.cc
@@ -33,8 +33,8 @@
   surface_layer_impl->SetBounds(layer_size);
   surface_layer_impl->SetDrawsContent(true);
   viz::SurfaceId surface_id(kArbitraryFrameSinkId, kArbitraryLocalSurfaceId);
-  surface_layer_impl->SetRange(viz::SurfaceRange(absl::nullopt, surface_id),
-                               absl::nullopt);
+  surface_layer_impl->SetRange(viz::SurfaceRange(std::nullopt, surface_id),
+                               std::nullopt);
   CopyProperties(impl.root_layer(), surface_layer_impl);
 
   impl.CalcDrawProps(viewport_size);
@@ -120,7 +120,7 @@
   // viz::SurfaceInfo.
   {
     AppendQuadsData data;
-    surface_layer_impl->SetRange(viz::SurfaceRange(absl::nullopt, surface_id1),
+    surface_layer_impl->SetRange(viz::SurfaceRange(std::nullopt, surface_id1),
                                  0u);
     surface_layer_impl->AppendQuads(render_pass.get(), &data);
     // The primary viz::SurfaceInfo should be added to activation_dependencies.
@@ -164,7 +164,7 @@
 
   EXPECT_EQ(surface_id1, surface_draw_quad2->surface_range.end());
   EXPECT_EQ(SkColors::kBlue, surface_draw_quad2->default_background_color);
-  EXPECT_EQ(absl::nullopt, surface_draw_quad2->surface_range.start());
+  EXPECT_EQ(std::nullopt, surface_draw_quad2->surface_range.start());
 
   EXPECT_EQ(surface_id1, surface_draw_quad3->surface_range.end());
   EXPECT_EQ(SkColors::kBlue, surface_draw_quad3->default_background_color);
@@ -202,7 +202,7 @@
   surface_layer_impl2->SetBounds(layer_size);
   surface_layer_impl2->SetDrawsContent(true);
   surface_layer_impl2->SetRange(viz::SurfaceRange(surface_id1, surface_id2),
-                                absl::nullopt);
+                                std::nullopt);
 
   auto render_pass = viz::CompositorRenderPass::Create();
   AppendQuadsData data;
diff --git a/cc/layers/texture_layer.h b/cc/layers/texture_layer.h
index 1d2d410..3db36325e 100644
--- a/cc/layers/texture_layer.h
+++ b/cc/layers/texture_layer.h
@@ -9,6 +9,7 @@
 #include <string>
 #include <vector>
 
+#include <optional>
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
@@ -21,7 +22,6 @@
 #include "cc/resources/shared_bitmap_id_registrar.h"
 #include "components/viz/common/resources/release_callback.h"
 #include "components/viz/common/resources/transferable_resource.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/hdr_metadata.h"
 
 namespace gpu {
diff --git a/cc/layers/texture_layer_impl.h b/cc/layers/texture_layer_impl.h
index 0e661349..9e65dd1c 100644
--- a/cc/layers/texture_layer_impl.h
+++ b/cc/layers/texture_layer_impl.h
@@ -9,6 +9,7 @@
 #include <string>
 #include <vector>
 
+#include <optional>
 #include "base/containers/flat_map.h"
 #include "base/functional/callback.h"
 #include "base/memory/ptr_util.h"
@@ -17,7 +18,6 @@
 #include "cc/resources/cross_thread_shared_bitmap.h"
 #include "components/viz/common/resources/release_callback.h"
 #include "components/viz/common/resources/transferable_resource.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/hdr_metadata.h"
 
 namespace cc {
diff --git a/cc/layers/video_layer_impl.cc b/cc/layers/video_layer_impl.cc
index 9ae6d4c..6f52189 100644
--- a/cc/layers/video_layer_impl.cc
+++ b/cc/layers/video_layer_impl.cc
@@ -168,7 +168,7 @@
   if (visible_quad_rect.IsEmpty())
     return;
 
-  absl::optional<gfx::Rect> clip_rect_opt;
+  std::optional<gfx::Rect> clip_rect_opt;
   if (is_clipped()) {
     clip_rect_opt = clip_rect();
   }
diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
index 129461b..da8d652 100644
--- a/cc/metrics/compositor_frame_reporter.cc
+++ b/cc/metrics/compositor_frame_reporter.cc
@@ -133,8 +133,8 @@
     FrameReportType report_type,
     FrameSequenceTrackerType frame_sequence_tracker_type,
     StageType stage_type,
-    absl::optional<VizBreakdown> viz_breakdown,
-    absl::optional<BlinkBreakdown> blink_breakdown) {
+    std::optional<VizBreakdown> viz_breakdown,
+    std::optional<BlinkBreakdown> blink_breakdown) {
   DCHECK_LE(frame_sequence_tracker_type, FrameSequenceTrackerType::kMaxType);
   const char* tracker_type_name =
       FrameSequenceTracker::GetFrameSequenceTrackerTypeName(
@@ -155,7 +155,7 @@
     const std::string& name,
     int index,
     base::TimeDelta latency,
-    const absl::optional<EventMetrics::HistogramBucketing>& bucketing) {
+    const std::optional<EventMetrics::HistogramBucketing>& bucketing) {
   STATIC_HISTOGRAM_POINTER_GROUP(
       name, index, kMaxEventLatencyHistogramIndex,
       AddTimeMicrosecondsGranularity(latency),
@@ -541,8 +541,8 @@
 // static
 const char* CompositorFrameReporter::GetStageName(
     StageType stage_type,
-    absl::optional<VizBreakdown> viz_breakdown,
-    absl::optional<BlinkBreakdown> blink_breakdown,
+    std::optional<VizBreakdown> viz_breakdown,
+    std::optional<BlinkBreakdown> blink_breakdown,
     bool impl_only) {
   DCHECK(!viz_breakdown ||
          stage_type ==
@@ -1069,8 +1069,8 @@
   base::TimeDelta stage_delta = stage.end_time - stage.start_time;
   ReportCompositorLatencyHistogram(
       frame_sequence_tracker_type, stage.stage_type,
-      /*viz_breakdown=*/absl::nullopt,
-      /*blink_breakdown=*/absl::nullopt, stage_delta);
+      /*viz_breakdown=*/std::nullopt,
+      /*blink_breakdown=*/std::nullopt, stage_delta);
   switch (stage.stage_type) {
     case StageType::kSendBeginMainFrameToCommit:
       ReportCompositorLatencyBlinkBreakdowns(frame_sequence_tracker_type);
@@ -1090,7 +1090,7 @@
        it.Advance()) {
     ReportCompositorLatencyHistogram(
         frame_sequence_tracker_type, StageType::kSendBeginMainFrameToCommit,
-        /*viz_breakdown=*/absl::nullopt, it.GetBreakdown(), it.GetLatency());
+        /*viz_breakdown=*/std::nullopt, it.GetBreakdown(), it.GetLatency());
   }
 }
 
@@ -1102,15 +1102,15 @@
     ReportCompositorLatencyHistogram(
         frame_sequence_tracker_type,
         StageType::kSubmitCompositorFrameToPresentationCompositorFrame,
-        it.GetBreakdown(), /*blink_breakdown=*/absl::nullopt, it.GetDuration());
+        it.GetBreakdown(), /*blink_breakdown=*/std::nullopt, it.GetDuration());
   }
 }
 
 void CompositorFrameReporter::ReportCompositorLatencyHistogram(
     FrameSequenceTrackerType frame_sequence_tracker_type,
     StageType stage_type,
-    absl::optional<VizBreakdown> viz_breakdown,
-    absl::optional<BlinkBreakdown> blink_breakdown,
+    std::optional<VizBreakdown> viz_breakdown,
+    std::optional<BlinkBreakdown> blink_breakdown,
     base::TimeDelta time_delta) const {
   DCHECK(!viz_breakdown ||
          stage_type ==
@@ -1240,7 +1240,7 @@
               {histogram_base_name, kGenerationToBrowserMainName}, ".");
           const base::TimeDelta browser_main_delay =
               browser_main_timestamp - generated_timestamp;
-          const absl::optional<EventMetrics::HistogramBucketing>& bucketing =
+          const std::optional<EventMetrics::HistogramBucketing>& bucketing =
               event_metrics->GetHistogramBucketing();
           if (bucketing) {
             STATIC_HISTOGRAM_POINTER_GROUP(
@@ -2077,7 +2077,7 @@
   }
   for (auto index : highest_blink_contribution_change_index) {
     high_latency_substages_.push_back(
-        GetStageName(StageType::kSendBeginMainFrameToCommit, absl::nullopt,
+        GetStageName(StageType::kSendBeginMainFrameToCommit, std::nullopt,
                      static_cast<BlinkBreakdown>(index)));
   }
   for (auto index : highest_viz_contribution_change_index) {
diff --git a/cc/metrics/compositor_frame_reporter.h b/cc/metrics/compositor_frame_reporter.h
index 8908632b..ea3a12c 100644
--- a/cc/metrics/compositor_frame_reporter.h
+++ b/cc/metrics/compositor_frame_reporter.h
@@ -13,6 +13,7 @@
 #include <utility>
 #include <vector>
 
+#include <optional>
 #include "base/memory/raw_ptr.h"
 #include "base/rand_util.h"
 #include "base/time/default_tick_clock.h"
@@ -28,7 +29,6 @@
 #include "cc/scheduler/scheduler.h"
 #include "components/viz/common/frame_sinks/begin_frame_args.h"
 #include "components/viz/common/frame_timing_details.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace viz {
 struct FrameTimingDetails;
@@ -254,7 +254,7 @@
     base::TimeTicks swap_start() const { return swap_start_; }
 
    private:
-    absl::optional<std::pair<base::TimeTicks, base::TimeTicks>>
+    std::optional<std::pair<base::TimeTicks, base::TimeTicks>>
         list_[static_cast<int>(VizBreakdown::kBreakdownCount)];
 
     bool buffer_ready_available_ = false;
@@ -293,8 +293,8 @@
   // name of the appropriate breakdown.
   static const char* GetStageName(
       StageType stage_type,
-      absl::optional<VizBreakdown> viz_breakdown = absl::nullopt,
-      absl::optional<BlinkBreakdown> blink_breakdown = absl::nullopt,
+      std::optional<VizBreakdown> viz_breakdown = std::nullopt,
+      std::optional<BlinkBreakdown> blink_breakdown = std::nullopt,
       bool impl_only = false);
 
   // Name for the viz breakdowns which are shown in traces as substages under
@@ -456,8 +456,8 @@
   void ReportCompositorLatencyHistogram(
       FrameSequenceTrackerType intraction_type,
       StageType stage_type,
-      absl::optional<VizBreakdown> viz_breakdown,
-      absl::optional<BlinkBreakdown> blink_breakdown,
+      std::optional<VizBreakdown> viz_breakdown,
+      std::optional<BlinkBreakdown> blink_breakdown,
       base::TimeDelta time_delta) const;
 
   void ReportEventLatencyMetrics() const;
@@ -534,9 +534,9 @@
 
   // The timestamp of when the frame was marked as not having produced a frame
   // (through a call to DidNotProduceFrame()).
-  absl::optional<base::TimeTicks> did_not_produce_frame_time_;
-  absl::optional<FrameSkippedReason> frame_skip_reason_;
-  absl::optional<base::TimeTicks> main_frame_abort_time_;
+  std::optional<base::TimeTicks> did_not_produce_frame_time_;
+  std::optional<FrameSkippedReason> frame_skip_reason_;
+  std::optional<base::TimeTicks> main_frame_abort_time_;
 
   raw_ptr<const base::TickClock> tick_clock_ =
       base::DefaultTickClock::GetInstance();
diff --git a/cc/metrics/compositor_frame_reporter_unittest.cc b/cc/metrics/compositor_frame_reporter_unittest.cc
index e7b87b0..8a5e70b 100644
--- a/cc/metrics/compositor_frame_reporter_unittest.cc
+++ b/cc/metrics/compositor_frame_reporter_unittest.cc
@@ -117,7 +117,7 @@
     AdvanceNowByUs(3);
     return SetupEventMetrics(EventMetrics::CreateForTesting(
         type, event_time, arrived_in_browser_main_timestamp, &test_tick_clock_,
-        absl::nullopt));
+        std::nullopt));
   }
 
   // Creates EventMetrics with elements in stage_durations representing each
@@ -146,8 +146,7 @@
         ScrollUpdateEventMetrics::CreateForTesting(
             ui::ET_GESTURE_SCROLL_UPDATE, ui::ScrollInputType::kWheel,
             is_inertial, scroll_update_type, /*delta=*/10.0f, event_time,
-            arrived_in_browser_main_timestamp, &test_tick_clock_,
-            absl::nullopt),
+            arrived_in_browser_main_timestamp, &test_tick_clock_, std::nullopt),
         stage_durations);
   }
 
@@ -172,7 +171,7 @@
     return SetupEventMetrics(ScrollUpdateEventMetrics::CreateForTesting(
         ui::ET_GESTURE_SCROLL_UPDATE, input_type, is_inertial,
         scroll_update_type, /*delta=*/10.0f, event_time,
-        arrived_in_browser_main_timestamp, &test_tick_clock_, absl::nullopt));
+        arrived_in_browser_main_timestamp, &test_tick_clock_, std::nullopt));
   }
 
   std::unique_ptr<EventMetrics> CreatePinchEventMetrics(
diff --git a/cc/metrics/compositor_frame_reporting_controller_unittest.cc b/cc/metrics/compositor_frame_reporting_controller_unittest.cc
index 167defaa..e3de853e 100644
--- a/cc/metrics/compositor_frame_reporting_controller_unittest.cc
+++ b/cc/metrics/compositor_frame_reporting_controller_unittest.cc
@@ -256,7 +256,7 @@
 
   std::unique_ptr<EventMetrics> CreateEventMetrics(
       ui::EventType type,
-      absl::optional<EventMetrics::TraceId> trace_id) {
+      std::optional<EventMetrics::TraceId> trace_id) {
     const base::TimeTicks event_time = AdvanceNowByMs(10);
     const base::TimeTicks arrived_in_browser_main_timestamp = AdvanceNowByMs(3);
     AdvanceNowByMs(10);
@@ -280,7 +280,7 @@
       ui::ScrollInputType input_type,
       bool is_inertial,
       ScrollUpdateEventMetrics::ScrollUpdateType scroll_update_type,
-      absl::optional<EventMetrics::TraceId> trace_id) {
+      std::optional<EventMetrics::TraceId> trace_id) {
     const base::TimeTicks event_time = AdvanceNowByMs(10);
     const base::TimeTicks arrived_in_browser_main_timestamp = AdvanceNowByMs(3);
     AdvanceNowByMs(10);
@@ -1220,9 +1220,9 @@
   base::HistogramTester histogram_tester;
 
   std::unique_ptr<EventMetrics> event_metrics_ptrs[] = {
-      CreateEventMetrics(ui::ET_TOUCH_PRESSED, absl::nullopt),
-      CreateEventMetrics(ui::ET_TOUCH_MOVED, absl::nullopt),
-      CreateEventMetrics(ui::ET_TOUCH_MOVED, absl::nullopt),
+      CreateEventMetrics(ui::ET_TOUCH_PRESSED, std::nullopt),
+      CreateEventMetrics(ui::ET_TOUCH_MOVED, std::nullopt),
+      CreateEventMetrics(ui::ET_TOUCH_MOVED, std::nullopt),
   };
   EXPECT_THAT(event_metrics_ptrs, Each(NotNull()));
   EventMetrics::List events_metrics(
@@ -1295,27 +1295,23 @@
       CreateScrollBeginEventMetrics(ui::ScrollInputType::kWheel),
       CreateScrollUpdateEventMetrics(
           ui::ScrollInputType::kWheel, kScrollIsNotInertial,
-          ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, absl::nullopt),
+          ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, std::nullopt),
       CreateScrollUpdateEventMetrics(
           ui::ScrollInputType::kWheel, kScrollIsNotInertial,
-          ScrollUpdateEventMetrics::ScrollUpdateType::kContinued,
-          absl::nullopt),
+          ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, std::nullopt),
       CreateScrollUpdateEventMetrics(
           ui::ScrollInputType::kWheel, kScrollIsInertial,
-          ScrollUpdateEventMetrics::ScrollUpdateType::kContinued,
-          absl::nullopt),
+          ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, std::nullopt),
       CreateScrollBeginEventMetrics(ui::ScrollInputType::kTouchscreen),
       CreateScrollUpdateEventMetrics(
           ui::ScrollInputType::kTouchscreen, kScrollIsNotInertial,
-          ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, absl::nullopt),
+          ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, std::nullopt),
       CreateScrollUpdateEventMetrics(
           ui::ScrollInputType::kTouchscreen, kScrollIsNotInertial,
-          ScrollUpdateEventMetrics::ScrollUpdateType::kContinued,
-          absl::nullopt),
+          ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, std::nullopt),
       CreateScrollUpdateEventMetrics(
           ui::ScrollInputType::kTouchscreen, kScrollIsInertial,
-          ScrollUpdateEventMetrics::ScrollUpdateType::kContinued,
-          absl::nullopt),
+          ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, std::nullopt),
   };
   EXPECT_THAT(event_metrics_ptrs, Each(NotNull()));
   EventMetrics::List events_metrics(
@@ -1443,7 +1439,7 @@
   // Set up two EventMetrics objects.
   std::unique_ptr<EventMetrics> metrics_1 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, std::nullopt);
   base::TimeTicks start_time_1 = metrics_1->GetDispatchStageTimestamp(
       EventMetrics::DispatchStage::kGenerated);
 
@@ -1452,7 +1448,7 @@
   // with differing values for this bit, but let's test both conditions here.)
   std::unique_ptr<EventMetrics> metrics_2 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, std::nullopt);
   metrics_2->set_requires_main_thread_update();
   base::TimeTicks start_time_2 = metrics_2->GetDispatchStageTimestamp(
       EventMetrics::DispatchStage::kGenerated);
@@ -1596,9 +1592,9 @@
   base::HistogramTester histogram_tester;
 
   std::unique_ptr<EventMetrics> event_metrics_ptrs[] = {
-      CreateEventMetrics(ui::ET_TOUCH_PRESSED, absl::nullopt),
-      CreateEventMetrics(ui::ET_TOUCH_MOVED, absl::nullopt),
-      CreateEventMetrics(ui::ET_TOUCH_MOVED, absl::nullopt),
+      CreateEventMetrics(ui::ET_TOUCH_PRESSED, std::nullopt),
+      CreateEventMetrics(ui::ET_TOUCH_MOVED, std::nullopt),
+      CreateEventMetrics(ui::ET_TOUCH_MOVED, std::nullopt),
   };
   EXPECT_THAT(event_metrics_ptrs, Each(NotNull()));
   EventMetrics::List events_metrics(
@@ -2204,15 +2200,15 @@
 
   std::unique_ptr<EventMetrics> metrics_1 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, std::nullopt);
 
   std::unique_ptr<EventMetrics> metrics_2 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, std::nullopt);
 
   std::unique_ptr<EventMetrics> metrics_3 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, std::nullopt);
 
   SimulateBeginImplFrame();  // BF1
   viz::BeginFrameId bf1_id = current_id_;
@@ -2324,12 +2320,12 @@
 
   std::unique_ptr<EventMetrics> metrics_1 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, std::nullopt);
   metrics_1->set_requires_main_thread_update();
 
   std::unique_ptr<EventMetrics> metrics_2 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, std::nullopt);
   metrics_2->set_requires_main_thread_update();
 
   SimulateBeginImplFrame();  // BF1
@@ -2431,11 +2427,11 @@
 
   std::unique_ptr<EventMetrics> metrics_1 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, std::nullopt);
 
   std::unique_ptr<EventMetrics> metrics_2 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, std::nullopt);
 
   SimulateBeginImplFrame();  // BF1
   viz::BeginFrameId bf1_id = current_id_;
@@ -2522,17 +2518,17 @@
 
   std::unique_ptr<EventMetrics> metrics_1 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, std::nullopt);
   metrics_1->set_requires_main_thread_update();
 
   std::unique_ptr<EventMetrics> metrics_2 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, std::nullopt);
   metrics_2->set_requires_main_thread_update();
 
   std::unique_ptr<EventMetrics> metrics_3 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, std::nullopt);
   metrics_3->set_requires_main_thread_update();
 
   SimulateBeginImplFrame();  // BF1
@@ -2692,18 +2688,18 @@
 
   std::unique_ptr<EventMetrics> metrics_1 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kStarted, std::nullopt);
   base::TimeTicks event1_generation_ts = metrics_1->GetDispatchStageTimestamp(
       EventMetrics::DispatchStage::kGenerated);
 
   std::unique_ptr<EventMetrics> metrics_2 = CreateScrollUpdateEventMetrics(
       ui::ScrollInputType::kWheel, /*is_inertial=*/false,
-      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, absl::nullopt);
+      ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, std::nullopt);
   base::TimeTicks event2_generation_ts = metrics_2->GetDispatchStageTimestamp(
       EventMetrics::DispatchStage::kGenerated);
 
   std::unique_ptr<EventMetrics> non_scroll_event =
-      CreateEventMetrics(ui::ET_TOUCH_PRESSED, absl::nullopt);
+      CreateEventMetrics(ui::ET_TOUCH_PRESSED, std::nullopt);
 
   base::TimeDelta vsync_interval = event2_generation_ts - event1_generation_ts;
   args_.interval = vsync_interval;
diff --git a/cc/metrics/dropped_frame_counter.h b/cc/metrics/dropped_frame_counter.h
index f4c886b..84beede 100644
--- a/cc/metrics/dropped_frame_counter.h
+++ b/cc/metrics/dropped_frame_counter.h
@@ -11,6 +11,7 @@
 #include <utility>
 #include <vector>
 
+#include <optional>
 #include "base/containers/ring_buffer.h"
 #include "base/functional/callback_forward.h"
 #include "base/memory/raw_ptr.h"
@@ -19,7 +20,6 @@
 #include "cc/metrics/frame_info.h"
 #include "cc/metrics/frame_sorter.h"
 #include "cc/metrics/ukm_smoothness_data.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 class TotalFrameCounter;
@@ -125,15 +125,15 @@
     return sliding_window_max_percent_dropped_;
   }
 
-  absl::optional<double> max_percent_dropped_After_1_sec() const {
+  std::optional<double> max_percent_dropped_After_1_sec() const {
     return sliding_window_max_percent_dropped_After_1_sec_;
   }
 
-  absl::optional<double> max_percent_dropped_After_2_sec() const {
+  std::optional<double> max_percent_dropped_After_2_sec() const {
     return sliding_window_max_percent_dropped_After_2_sec_;
   }
 
-  absl::optional<double> max_percent_dropped_After_5_sec() const {
+  std::optional<double> max_percent_dropped_After_5_sec() const {
     return sliding_window_max_percent_dropped_After_5_sec_;
   }
 
@@ -196,9 +196,9 @@
   size_t total_smoothness_dropped_ = 0;
   bool fcp_received_ = false;
   double sliding_window_max_percent_dropped_ = 0;
-  absl::optional<double> sliding_window_max_percent_dropped_After_1_sec_;
-  absl::optional<double> sliding_window_max_percent_dropped_After_2_sec_;
-  absl::optional<double> sliding_window_max_percent_dropped_After_5_sec_;
+  std::optional<double> sliding_window_max_percent_dropped_After_1_sec_;
+  std::optional<double> sliding_window_max_percent_dropped_After_2_sec_;
+  std::optional<double> sliding_window_max_percent_dropped_After_5_sec_;
   base::TimeTicks time_fcp_received_;
   raw_ptr<UkmSmoothnessDataShared> ukm_smoothness_data_ = nullptr;
   FrameSorter frame_sorter_;
@@ -209,10 +209,10 @@
     double p95_window = 0;
   } last_reported_metrics_;
 
-  absl::optional<SortedFrameCallback> sorted_frame_callback_;
+  std::optional<SortedFrameCallback> sorted_frame_callback_;
 
   bool report_for_ui_ = false;
-  absl::optional<double> sliding_window_current_percent_dropped_;
+  std::optional<double> sliding_window_current_percent_dropped_;
 
   // Sets to true on a newly dropped frame and stays true as long as the frames
   // that follow are dropped. Reset when a frame is presented. It is used to
diff --git a/cc/metrics/event_metrics.cc b/cc/metrics/event_metrics.cc
index 90cb3ba..da782d6 100644
--- a/cc/metrics/event_metrics.cc
+++ b/cc/metrics/event_metrics.cc
@@ -28,12 +28,12 @@
   const char* name;
 
   ui::EventType ui_event_type;
-  absl::optional<bool> scroll_is_inertial = absl::nullopt;
-  absl::optional<ScrollUpdateEventMetrics::ScrollUpdateType>
-      scroll_update_type = absl::nullopt;
+  std::optional<bool> scroll_is_inertial = std::nullopt;
+  std::optional<ScrollUpdateEventMetrics::ScrollUpdateType> scroll_update_type =
+      std::nullopt;
 
-  absl::optional<EventMetrics::HistogramBucketing> histogram_bucketing =
-      absl::nullopt;
+  std::optional<EventMetrics::HistogramBucketing> histogram_bucketing =
+      std::nullopt;
 } kInterestingEvents[] = {
 #define EVENT_TYPE(type_name, ui_type, ...)                      \
   {                                                              \
@@ -148,10 +148,10 @@
                   static_cast<int>(PinchEventMetrics::PinchType::kMaxValue) + 1,
               "PinchEventMetrics::PinchType has changed.");
 
-absl::optional<EventMetrics::EventType> ToInterestingEventType(
+std::optional<EventMetrics::EventType> ToInterestingEventType(
     ui::EventType ui_event_type,
-    absl::optional<bool> scroll_is_inertial,
-    absl::optional<ScrollUpdateEventMetrics::ScrollUpdateType>
+    std::optional<bool> scroll_is_inertial,
+    std::optional<ScrollUpdateEventMetrics::ScrollUpdateType>
         scroll_update_type) {
   for (size_t i = 0; i < std::size(kInterestingEvents); i++) {
     const auto& interesting_event = kInterestingEvents[i];
@@ -164,7 +164,7 @@
       return metrics_event_type;
     }
   }
-  return absl::nullopt;
+  return std::nullopt;
 }
 
 ScrollEventMetrics::ScrollType ToScrollType(ui::ScrollInputType ui_input_type) {
@@ -215,7 +215,7 @@
 std::unique_ptr<EventMetrics> EventMetrics::Create(
     ui::EventType type,
     base::TimeTicks timestamp,
-    absl::optional<TraceId> trace_id) {
+    std::optional<TraceId> trace_id) {
   return Create(type, timestamp, base::TimeTicks(), trace_id);
 }
 
@@ -224,7 +224,7 @@
     ui::EventType type,
     base::TimeTicks timestamp,
     base::TimeTicks arrived_in_browser_main_timestamp,
-    absl::optional<TraceId> trace_id) {
+    std::optional<TraceId> trace_id) {
   // TODO(crbug.com/1157090): We expect that `timestamp` is not null, but there
   // seems to be some tests that are emitting events with null timestamp. We
   // should investigate and try to fix those cases and add a `DCHECK` here to
@@ -249,7 +249,7 @@
     base::TimeTicks timestamp,
     base::TimeTicks arrived_in_browser_main_timestamp,
     const base::TickClock* tick_clock,
-    absl::optional<TraceId> trace_id) {
+    std::optional<TraceId> trace_id) {
   DCHECK(!timestamp.is_null());
 
   std::unique_ptr<EventMetrics> metrics =
@@ -277,7 +277,7 @@
 
   std::unique_ptr<EventMetrics> metrics =
       CreateInternal(type, base::TimeTicks(), base::TimeTicks(),
-                     existing->tick_clock_, absl::nullopt);
+                     existing->tick_clock_, std::nullopt);
   if (!metrics)
     return nullptr;
 
@@ -294,10 +294,10 @@
     base::TimeTicks timestamp,
     base::TimeTicks arrived_in_browser_main_timestamp,
     const base::TickClock* tick_clock,
-    absl::optional<TraceId> trace_id) {
-  absl::optional<EventType> interesting_type =
-      ToInterestingEventType(type, /*scroll_is_inertial=*/absl::nullopt,
-                             /*scroll_update_type=*/absl::nullopt);
+    std::optional<TraceId> trace_id) {
+  std::optional<EventType> interesting_type =
+      ToInterestingEventType(type, /*scroll_is_inertial=*/std::nullopt,
+                             /*scroll_update_type=*/std::nullopt);
   if (!interesting_type)
     return nullptr;
   return base::WrapUnique(new EventMetrics(*interesting_type, timestamp,
@@ -308,7 +308,7 @@
 EventMetrics::EventMetrics(EventType type,
                            base::TimeTicks timestamp,
                            const base::TickClock* tick_clock,
-                           absl::optional<TraceId> trace_id)
+                           std::optional<TraceId> trace_id)
     : type_(type), tick_clock_(tick_clock), trace_id_(trace_id) {
   dispatch_stage_timestamps_[static_cast<int>(DispatchStage::kGenerated)] =
       timestamp;
@@ -318,7 +318,7 @@
                            base::TimeTicks timestamp,
                            base::TimeTicks arrived_in_browser_main_timestamp,
                            const base::TickClock* tick_clock,
-                           absl::optional<TraceId> trace_id)
+                           std::optional<TraceId> trace_id)
     : EventMetrics(type, timestamp, tick_clock, trace_id) {
   dispatch_stage_timestamps_[static_cast<int>(
       DispatchStage::kArrivedInBrowserMain)] =
@@ -348,7 +348,7 @@
   return kInterestingEvents[static_cast<int>(type)].name;
 }
 
-const absl::optional<EventMetrics::HistogramBucketing>&
+const std::optional<EventMetrics::HistogramBucketing>&
 EventMetrics::GetHistogramBucketing() const {
   return kInterestingEvents[static_cast<int>(type_)].histogram_bucketing;
 }
@@ -435,7 +435,7 @@
     base::TimeTicks timestamp,
     base::TimeTicks arrived_in_browser_main_timestamp,
     base::TimeTicks blocking_touch_dispatched_to_renderer,
-    absl::optional<TraceId> trace_id) {
+    std::optional<TraceId> trace_id) {
   // TODO(crbug.com/1157090): We expect that `timestamp` is not null, but there
   // seems to be some tests that are emitting events with null timestamp.  We
   // should investigate and try to fix those cases and add a `DCHECK` here to
@@ -464,7 +464,7 @@
     ui::ScrollInputType input_type,
     bool is_inertial,
     base::TimeTicks timestamp,
-    absl::optional<TraceId> trace_id) {
+    std::optional<TraceId> trace_id) {
   return Create(type, input_type, is_inertial, timestamp,
                 /*arrived_in_browser_main_timestamp=*/base::TimeTicks(),
                 /*blocking_touch_dispatched_to_renderer=*/base::TimeTicks(),
@@ -483,7 +483,7 @@
 
   std::unique_ptr<ScrollEventMetrics> metrics = CreateInternal(
       type, input_type, is_inertial, timestamp,
-      arrived_in_browser_main_timestamp, tick_clock, absl::nullopt);
+      arrived_in_browser_main_timestamp, tick_clock, std::nullopt);
   if (!metrics)
     return nullptr;
 
@@ -509,7 +509,7 @@
 
   std::unique_ptr<ScrollEventMetrics> metrics =
       CreateInternal(type, input_type, is_inertial, base::TimeTicks(),
-                     base::TimeTicks(), existing->tick_clock_, absl::nullopt);
+                     base::TimeTicks(), existing->tick_clock_, std::nullopt);
   if (!metrics)
     return nullptr;
 
@@ -528,10 +528,10 @@
     base::TimeTicks timestamp,
     base::TimeTicks arrived_in_browser_main_timestamp,
     const base::TickClock* tick_clock,
-    absl::optional<TraceId> trace_id) {
-  absl::optional<EventType> interesting_type =
+    std::optional<TraceId> trace_id) {
+  std::optional<EventType> interesting_type =
       ToInterestingEventType(type, is_inertial,
-                             /*scroll_update_type=*/absl::nullopt);
+                             /*scroll_update_type=*/std::nullopt);
   if (!interesting_type)
     return nullptr;
   return base::WrapUnique(new ScrollEventMetrics(
@@ -545,7 +545,7 @@
     base::TimeTicks timestamp,
     base::TimeTicks arrived_in_browser_main_timestamp,
     const base::TickClock* tick_clock,
-    absl::optional<TraceId> trace_id)
+    std::optional<TraceId> trace_id)
     : EventMetrics(type,
                    timestamp,
                    arrived_in_browser_main_timestamp,
@@ -635,7 +635,7 @@
     base::TimeTicks timestamp,
     base::TimeTicks arrived_in_browser_main_timestamp,
     const base::TickClock* tick_clock,
-    absl::optional<TraceId> trace_id) {
+    std::optional<TraceId> trace_id) {
   DCHECK(!timestamp.is_null());
 
   std::unique_ptr<ScrollUpdateEventMetrics> metrics = CreateInternal(
@@ -671,7 +671,7 @@
       existing->GetDispatchStageTimestamp(DispatchStage::kGenerated);
   std::unique_ptr<ScrollUpdateEventMetrics> metrics = CreateInternal(
       type, input_type, is_inertial, scroll_update_type, delta, generation_ts,
-      base::TimeTicks(), existing->tick_clock_, absl::nullopt);
+      base::TimeTicks(), existing->tick_clock_, std::nullopt);
   if (!metrics)
     return nullptr;
 
@@ -693,8 +693,8 @@
     base::TimeTicks timestamp,
     base::TimeTicks arrived_in_browser_main_timestamp,
     const base::TickClock* tick_clock,
-    absl::optional<TraceId> trace_id) {
-  absl::optional<EventType> interesting_type =
+    std::optional<TraceId> trace_id) {
+  std::optional<EventType> interesting_type =
       ToInterestingEventType(type, is_inertial, scroll_update_type);
   if (!interesting_type)
     return nullptr;
@@ -711,7 +711,7 @@
     base::TimeTicks timestamp,
     base::TimeTicks arrived_in_browser_main_timestamp,
     const base::TickClock* tick_clock,
-    absl::optional<TraceId> trace_id)
+    std::optional<TraceId> trace_id)
     : ScrollEventMetrics(type,
                          scroll_type,
                          timestamp,
@@ -783,7 +783,7 @@
   DCHECK(!timestamp.is_null());
 
   std::unique_ptr<PinchEventMetrics> metrics =
-      CreateInternal(type, input_type, timestamp, tick_clock, absl::nullopt);
+      CreateInternal(type, input_type, timestamp, tick_clock, std::nullopt);
   if (!metrics)
     return nullptr;
 
@@ -798,10 +798,10 @@
     ui::ScrollInputType input_type,
     base::TimeTicks timestamp,
     const base::TickClock* tick_clock,
-    absl::optional<TraceId> trace_id) {
-  absl::optional<EventType> interesting_type =
-      ToInterestingEventType(type, /*scroll_is_inertial=*/absl::nullopt,
-                             /*scroll_update_type=*/absl::nullopt);
+    std::optional<TraceId> trace_id) {
+  std::optional<EventType> interesting_type =
+      ToInterestingEventType(type, /*scroll_is_inertial=*/std::nullopt,
+                             /*scroll_update_type=*/std::nullopt);
   if (!interesting_type)
     return nullptr;
   return base::WrapUnique(
@@ -813,7 +813,7 @@
                                      PinchType pinch_type,
                                      base::TimeTicks timestamp,
                                      const base::TickClock* tick_clock,
-                                     absl::optional<TraceId> trace_id)
+                                     std::optional<TraceId> trace_id)
     : EventMetrics(type, timestamp, tick_clock, trace_id),
       pinch_type_(pinch_type) {}
 
diff --git a/cc/metrics/event_metrics.h b/cc/metrics/event_metrics.h
index 8c399d7..b247976 100644
--- a/cc/metrics/event_metrics.h
+++ b/cc/metrics/event_metrics.h
@@ -10,12 +10,12 @@
 #include <string>
 #include <vector>
 
+#include <optional>
 #include "base/memory/raw_ptr.h"
 #include "base/time/tick_clock.h"
 #include "base/time/time.h"
 #include "base/types/id_type.h"
 #include "cc/cc_export.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/events/types/event_type.h"
 #include "ui/events/types/scroll_input_type.h"
 #include "ui/latency/latency_info.h"
@@ -85,7 +85,7 @@
 
   static std::unique_ptr<EventMetrics> Create(ui::EventType type,
                                               base::TimeTicks timestamp,
-                                              absl::optional<TraceId> trace_id);
+                                              std::optional<TraceId> trace_id);
 
   // Returns a new instance if the event is of a type we are interested in.
   // Otherwise, returns `nullptr`. For scroll and pinch events, use the
@@ -94,7 +94,7 @@
       ui::EventType type,
       base::TimeTicks timestamp,
       base::TimeTicks arrived_in_browser_main_timestamp,
-      absl::optional<TraceId> trace_id);
+      std::optional<TraceId> trace_id);
 
   // Similar to `Create()` with an extra `base::TickClock` to use in tests.
   static std::unique_ptr<EventMetrics> CreateForTesting(
@@ -102,7 +102,7 @@
       base::TimeTicks timestamp,
       base::TimeTicks arrived_in_browser_main_timestamp,
       const base::TickClock* tick_clock,
-      absl::optional<TraceId> trace_id);
+      std::optional<TraceId> trace_id);
 
   // Used to create an instance for an event generated based on an existing
   // event. If the new event is of an interesting type, we expect that the
@@ -122,7 +122,7 @@
 
   EventType type() const { return type_; }
 
-  absl::optional<TraceId> trace_id() const { return trace_id_; }
+  std::optional<TraceId> trace_id() const { return trace_id_; }
 
   // Returns a string representing event type.
   const char* GetTypeName() const;
@@ -136,7 +136,7 @@
     size_t count;
     const char* version_suffix;
   };
-  const absl::optional<HistogramBucketing>& GetHistogramBucketing() const;
+  const std::optional<HistogramBucketing>& GetHistogramBucketing() const;
 
   void SetHighLatencyStage(const std::string& stage);
   const std::vector<std::string>& GetHighLatencyStages() const {
@@ -182,13 +182,13 @@
   EventMetrics(EventType type,
                base::TimeTicks timestamp,
                const base::TickClock* tick_clock,
-               absl::optional<TraceId> trace_id);
+               std::optional<TraceId> trace_id);
 
   EventMetrics(EventType type,
                base::TimeTicks timestamp,
                base::TimeTicks arrived_in_browser_main_timestamp,
                const base::TickClock* tick_clock,
-               absl::optional<TraceId> trace_id);
+               std::optional<TraceId> trace_id);
 
   // Creates a clone of `other` that might be used in creating `EventMetrics`
   // objects for some injected events. Since this object itself does not
@@ -213,7 +213,7 @@
       base::TimeTicks timestamp,
       base::TimeTicks arrived_in_browser_main_timestamp,
       const base::TickClock* tick_clock,
-      absl::optional<TraceId> trace_id);
+      std::optional<TraceId> trace_id);
 
   EventType type_;
 
@@ -243,7 +243,7 @@
   // This is a trace id of an input event. It can be null for events which don't
   // have a corresponding input, for example a generated event based on existing
   // event.
-  absl::optional<TraceId> trace_id_;
+  std::optional<TraceId> trace_id_;
 };
 
 class CC_EXPORT ScrollEventMetrics : public EventMetrics {
@@ -273,7 +273,7 @@
       base::TimeTicks timestamp,
       base::TimeTicks arrived_in_browser_main_timestamp,
       base::TimeTicks blocking_touch_dispatched_to_renderer,
-      absl::optional<TraceId> trace_id);
+      std::optional<TraceId> trace_id);
 
   // Prefer to use `Create()` above. This method is used only by the Browser
   // process which have own breakdowns.
@@ -284,7 +284,7 @@
       ui::ScrollInputType input_type,
       bool is_inertial,
       base::TimeTicks timestamp,
-      absl::optional<TraceId> trace_id);
+      std::optional<TraceId> trace_id);
 
   // Similar to `Create()` with an extra `base::TickClock` to use in tests.
   // Should only be used for scroll events other than scroll-update.
@@ -327,7 +327,7 @@
                      base::TimeTicks timestamp,
                      base::TimeTicks arrived_in_browser_main_timestamp,
                      const base::TickClock* tick_clock,
-                     absl::optional<TraceId> trace_id);
+                     std::optional<TraceId> trace_id);
   ScrollEventMetrics(const ScrollEventMetrics&);
 
  private:
@@ -338,7 +338,7 @@
       base::TimeTicks timestamp,
       base::TimeTicks arrived_in_browser_main_timestamp,
       const base::TickClock* tick_clock,
-      absl::optional<TraceId> trace_id);
+      std::optional<TraceId> trace_id);
 
   // Type of the input device for the event.
   ScrollType scroll_type_;
@@ -396,7 +396,7 @@
       base::TimeTicks timestamp,
       base::TimeTicks arrived_in_browser_main_timestamp,
       const base::TickClock* tick_clock,
-      absl::optional<TraceId> trace_id);
+      std::optional<TraceId> trace_id);
 
   // Used to create an instance for an event generated based on an existing
   // event. If the new event is of an interesting type, we expect that the
@@ -434,10 +434,10 @@
 
   std::unique_ptr<EventMetrics> Clone() const override;
 
-  void set_is_janky_scrolled_frame(absl::optional<bool> is_janky) {
+  void set_is_janky_scrolled_frame(std::optional<bool> is_janky) {
     is_janky_scrolled_frame_ = is_janky;
   }
-  absl::optional<bool> is_janky_scrolled_frame() const {
+  std::optional<bool> is_janky_scrolled_frame() const {
     return is_janky_scrolled_frame_;
   }
 
@@ -449,7 +449,7 @@
                            base::TimeTicks timestamp,
                            base::TimeTicks arrived_in_browser_main_timestamp,
                            const base::TickClock* tick_clock,
-                           absl::optional<TraceId> trace_id);
+                           std::optional<TraceId> trace_id);
   ScrollUpdateEventMetrics(const ScrollUpdateEventMetrics&);
 
  private:
@@ -462,7 +462,7 @@
       base::TimeTicks timestamp,
       base::TimeTicks arrived_in_browser_main_timestamp,
       const base::TickClock* tick_clock,
-      absl::optional<TraceId> trace_id);
+      std::optional<TraceId> trace_id);
 
   float delta_;
   float predicted_delta_;
@@ -473,7 +473,7 @@
   // Total events that were coalesced into this into this ScrollUpdate
   int32_t coalesced_event_count_ = 1;
 
-  absl::optional<bool> is_janky_scrolled_frame_ = absl::nullopt;
+  std::optional<bool> is_janky_scrolled_frame_ = std::nullopt;
 };
 
 class CC_EXPORT PinchEventMetrics : public EventMetrics {
@@ -519,7 +519,7 @@
                     PinchType pinch_type,
                     base::TimeTicks timestamp,
                     const base::TickClock* tick_clock,
-                    absl::optional<TraceId> trace_id);
+                    std::optional<TraceId> trace_id);
   PinchEventMetrics(const PinchEventMetrics&);
 
  private:
@@ -528,7 +528,7 @@
       ui::ScrollInputType input_type,
       base::TimeTicks timestamp,
       const base::TickClock* tick_clock,
-      absl::optional<TraceId> trace_id);
+      std::optional<TraceId> trace_id);
 
   PinchType pinch_type_;
 };
diff --git a/cc/metrics/event_metrics_unittest.cc b/cc/metrics/event_metrics_unittest.cc
index 93aca73..f3ad8e3c 100644
--- a/cc/metrics/event_metrics_unittest.cc
+++ b/cc/metrics/event_metrics_unittest.cc
@@ -34,7 +34,7 @@
       ScrollEventMetrics::Create(
           ui::ET_GESTURE_SCROLL_BEGIN, ui::ScrollInputType::kTouchscreen,
           /*is_inertial=*/false, event_time, arrived_in_browser_main_timestamp,
-          blocking_touch_dispatched_to_renderer_timestamp, absl::nullopt);
+          blocking_touch_dispatched_to_renderer_timestamp, std::nullopt);
 
   // Assert
   EXPECT_EQ(event_time, scroll_event_metric->GetDispatchStageTimestamp(
@@ -84,7 +84,7 @@
       ScrollEventMetrics::Create(
           ui::ET_GESTURE_SCROLL_BEGIN, ui::ScrollInputType::kTouchscreen,
           /*is_inertial=*/false, event_time, arrived_in_browser_main_timestamp,
-          blocking_touch_dispatched_to_renderer_timestamp, absl::nullopt);
+          blocking_touch_dispatched_to_renderer_timestamp, std::nullopt);
 
   // Assert
   EXPECT_EQ(event_time, scroll_event_metric->GetDispatchStageTimestamp(
@@ -129,7 +129,7 @@
       ScrollEventMetrics::Create(
           ui::ET_GESTURE_SCROLL_BEGIN, ui::ScrollInputType::kTouchscreen,
           /*is_inertial=*/false, event_time, arrived_in_browser_main_timestamp,
-          blocking_touch_dispatched_to_renderer_timestamp, absl::nullopt);
+          blocking_touch_dispatched_to_renderer_timestamp, std::nullopt);
 
   // Act
   std::unique_ptr<ScrollEventMetrics> copy_scroll_metric =
@@ -363,7 +363,7 @@
   // Act
   std::unique_ptr<EventMetrics> event_metric =
       EventMetrics::Create(ui::ET_TOUCH_MOVED, event_time,
-                           arrived_in_browser_main_timestamp, absl::nullopt);
+                           arrived_in_browser_main_timestamp, std::nullopt);
 
   // Assert
   EXPECT_EQ(event_time, event_metric->GetDispatchStageTimestamp(
@@ -400,7 +400,7 @@
       base::TimeTicks::Now() - base::Microseconds(50);
   std::unique_ptr<EventMetrics> event_metric =
       EventMetrics::Create(ui::ET_TOUCH_MOVED, event_time,
-                           arrived_in_browser_main_timestamp, absl::nullopt);
+                           arrived_in_browser_main_timestamp, std::nullopt);
 
   // Act
   std::unique_ptr<EventMetrics> copy_event_metric =
diff --git a/cc/metrics/events_metrics_manager_unittest.cc b/cc/metrics/events_metrics_manager_unittest.cc
index 879bf94..ff438df 100644
--- a/cc/metrics/events_metrics_manager_unittest.cc
+++ b/cc/metrics/events_metrics_manager_unittest.cc
@@ -60,7 +60,7 @@
     test_tick_clock_.Advance(base::Microseconds(10));
     return EventMetrics::CreateForTesting(type, event_time,
                                           arrived_in_browser_main_timestamp,
-                                          &test_tick_clock_, absl::nullopt);
+                                          &test_tick_clock_, std::nullopt);
   }
 
   EventsMetricsManager manager_;
diff --git a/cc/metrics/frame_sorter.h b/cc/metrics/frame_sorter.h
index 71561659..a8671c1 100644
--- a/cc/metrics/frame_sorter.h
+++ b/cc/metrics/frame_sorter.h
@@ -9,11 +9,11 @@
 
 #include <map>
 
+#include <optional>
 #include "base/containers/circular_deque.h"
 #include "base/functional/callback.h"
 #include "cc/cc_export.h"
 #include "components/viz/common/frame_sinks/begin_frame_args.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -78,7 +78,7 @@
   std::map<viz::BeginFrameId, FrameState> frame_states_;
   std::map<viz::BeginFrameId, FrameInfo> frame_infos_;
 
-  absl::optional<uint64_t> current_source_id_;
+  std::optional<uint64_t> current_source_id_;
 };
 
 }  // namespace cc
diff --git a/cc/metrics/predictor_jank_tracker.cc b/cc/metrics/predictor_jank_tracker.cc
index 9b447e1..9967256 100644
--- a/cc/metrics/predictor_jank_tracker.cc
+++ b/cc/metrics/predictor_jank_tracker.cc
@@ -67,7 +67,7 @@
     float next_delta,
     base::TimeTicks next_presentation_ts,
     base::TimeDelta vsync_interval,
-    absl::optional<EventMetrics::TraceId> trace_id) {
+    std::optional<EventMetrics::TraceId> trace_id) {
   total_frames_++;
   float d1 = frame_data_.prev_delta_;
   float d2 = frame_data_.cur_delta_;
@@ -123,7 +123,7 @@
     float janky_value,
     bool contains_missed_vsyncs,
     bool slow_scroll,
-    absl::optional<EventMetrics::TraceId> trace_id) {
+    std::optional<EventMetrics::TraceId> trace_id) {
   janky_frames_++;
   TRACE_EVENT_INSTANT(
       "input.scrolling", "PredictorJankTracker::ReportJankyFrame",
@@ -200,7 +200,7 @@
 void PredictorJankTracker::StoreLatestFrameData(
     float delta,
     base::TimeTicks presentation_ts,
-    absl::optional<EventMetrics::TraceId> trace_id) {
+    std::optional<EventMetrics::TraceId> trace_id) {
   frame_data_.prev_delta_ = frame_data_.cur_delta_;
   frame_data_.prev_trace_id_ = frame_data_.cur_trace_id_;
   frame_data_.cur_delta_ = delta;
diff --git a/cc/metrics/predictor_jank_tracker.h b/cc/metrics/predictor_jank_tracker.h
index 1c69c93f..bc6c6be 100644
--- a/cc/metrics/predictor_jank_tracker.h
+++ b/cc/metrics/predictor_jank_tracker.h
@@ -5,10 +5,10 @@
 #ifndef CC_METRICS_PREDICTOR_JANK_TRACKER_H_
 #define CC_METRICS_PREDICTOR_JANK_TRACKER_H_
 
+#include <optional>
 #include "base/time/time.h"
 #include "cc/cc_export.h"
 #include "cc/metrics/event_metrics.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -28,7 +28,7 @@
   void ReportLatestScrollDelta(float delta,
                                base::TimeTicks presentation_ts,
                                base::TimeDelta vsync_interval,
-                               absl::optional<EventMetrics::TraceId> trace_id);
+                               std::optional<EventMetrics::TraceId> trace_id);
 
   // Whenever a new scroll starts, data inside this class will be erased
   // as it should be comparing neighbouring frames only.
@@ -40,13 +40,13 @@
   // frame information.
   void StoreLatestFrameData(float delta,
                             base::TimeTicks presentation_ts,
-                            absl::optional<EventMetrics::TraceId> trace_id);
+                            std::optional<EventMetrics::TraceId> trace_id);
 
   void ReportJankyFrame(float next_delta,
                         float janky_value,
                         bool contains_missed_vsyncs,
                         bool slow_scroll,
-                        absl::optional<EventMetrics::TraceId> trace_id);
+                        std::optional<EventMetrics::TraceId> trace_id);
 
   // Finds if a sequence of 3 consecutive frames were presnted in
   // consecutive vsyncs, or some vsyncs were missed.
@@ -59,11 +59,11 @@
     // Delta for the previous frame in pixels.
     float prev_delta_ = 0;
     // The EventLatency event_trace_id value if available.
-    absl::optional<EventMetrics::TraceId> prev_trace_id_;
+    std::optional<EventMetrics::TraceId> prev_trace_id_;
     // Delta for the current frame in pixels.
     float cur_delta_ = 0;
     // The EventLatency event_trace_id value if available.
-    absl::optional<EventMetrics::TraceId> cur_trace_id_;
+    std::optional<EventMetrics::TraceId> cur_trace_id_;
 
     // Presentation timestamp of the previous frame.
     base::TimeTicks prev_presentation_ts_;
diff --git a/cc/metrics/scroll_jank_dropped_frame_tracker.h b/cc/metrics/scroll_jank_dropped_frame_tracker.h
index 0959574..80bf649 100644
--- a/cc/metrics/scroll_jank_dropped_frame_tracker.h
+++ b/cc/metrics/scroll_jank_dropped_frame_tracker.h
@@ -5,10 +5,10 @@
 #ifndef CC_METRICS_SCROLL_JANK_DROPPED_FRAME_TRACKER_H_
 #define CC_METRICS_SCROLL_JANK_DROPPED_FRAME_TRACKER_H_
 
+#include <optional>
 #include "base/time/time.h"
 #include "cc/cc_export.h"
 #include "cc/metrics/event_metrics.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -77,8 +77,8 @@
   // TODO(b/306611560): Cleanup experimental per vsync metric or promote to
   // default.
   JankData experimental_vsync_fixed_window_;
-  absl::optional<JankData> per_scroll_;
-  absl::optional<JankData> experimental_per_scroll_vsync_;
+  std::optional<JankData> per_scroll_;
+  std::optional<JankData> experimental_per_scroll_vsync_;
 };
 
 }  // namespace cc
diff --git a/cc/metrics/scroll_jank_dropped_frame_tracker_unittest.cc b/cc/metrics/scroll_jank_dropped_frame_tracker_unittest.cc
index 06977ce1..98669d05 100644
--- a/cc/metrics/scroll_jank_dropped_frame_tracker_unittest.cc
+++ b/cc/metrics/scroll_jank_dropped_frame_tracker_unittest.cc
@@ -90,7 +90,7 @@
           /*is_inertial=*/false,
           ScrollUpdateEventMetrics::ScrollUpdateType::kContinued,
           /*delta=*/10.0f, prev_frame.first_input_ts, base::TimeTicks(),
-          &tick_clock, /*trace_id=*/absl::nullopt);
+          &tick_clock, /*trace_id=*/std::nullopt);
 
       scroll_jank_dropped_frame_tracker_->ReportLatestPresentationData(
           *event.get(), prev_frame.last_input_ts, prev_frame.presentation_ts,
@@ -107,7 +107,7 @@
         /*is_inertial=*/false,
         ScrollUpdateEventMetrics::ScrollUpdateType::kContinued,
         /*delta=*/10.0f, frame.first_input_ts, base::TimeTicks(), &tick_clock,
-        /*trace_id=*/absl::nullopt);
+        /*trace_id=*/std::nullopt);
     scroll_jank_dropped_frame_tracker_->ReportLatestPresentationData(
         *event.get(), frame.last_input_ts, frame.presentation_ts,
         kVsyncInterval);
diff --git a/cc/metrics/video_playback_roughness_reporter.h b/cc/metrics/video_playback_roughness_reporter.h
index c967596..c407352 100644
--- a/cc/metrics/video_playback_roughness_reporter.h
+++ b/cc/metrics/video_playback_roughness_reporter.h
@@ -5,6 +5,7 @@
 #ifndef CC_METRICS_VIDEO_PLAYBACK_ROUGHNESS_REPORTER_H_
 #define CC_METRICS_VIDEO_PLAYBACK_ROUGHNESS_REPORTER_H_
 
+#include <optional>
 #include "base/containers/circular_deque.h"
 #include "base/containers/flat_set.h"
 #include "base/functional/callback.h"
@@ -12,7 +13,6 @@
 #include "cc/cc_export.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_types.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace cc {
@@ -111,10 +111,10 @@
     FrameInfo();
     FrameInfo(const FrameInfo&);
     TokenType token = 0;
-    absl::optional<base::TimeTicks> decode_time;
-    absl::optional<base::TimeTicks> presentation_time;
-    absl::optional<base::TimeDelta> actual_duration;
-    absl::optional<base::TimeDelta> intended_duration;
+    std::optional<base::TimeTicks> decode_time;
+    std::optional<base::TimeTicks> presentation_time;
+    std::optional<base::TimeDelta> actual_duration;
+    std::optional<base::TimeDelta> intended_duration;
     int refresh_rate_hz = 60;
     gfx::Size size;
   };
diff --git a/cc/mojo_embedder/async_layer_tree_frame_sink.cc b/cc/mojo_embedder/async_layer_tree_frame_sink.cc
index 02a334aba..b22dfbc 100644
--- a/cc/mojo_embedder/async_layer_tree_frame_sink.cc
+++ b/cc/mojo_embedder/async_layer_tree_frame_sink.cc
@@ -200,7 +200,7 @@
               frame.size_in_pixels().width());
   }
 
-  absl::optional<viz::HitTestRegionList> hit_test_region_list =
+  std::optional<viz::HitTestRegionList> hit_test_region_list =
       client_->BuildHitTestData();
 
   // If |hit_test_data_changed| was set or local_surface_id has been updated,
@@ -214,7 +214,7 @@
                                         last_hit_test_data_)) {
       DCHECK(!viz::HitTestRegionList::IsEqual(*hit_test_region_list,
                                               viz::HitTestRegionList()));
-      hit_test_region_list = absl::nullopt;
+      hit_test_region_list = std::nullopt;
     } else {
       last_hit_test_data_ = *hit_test_region_list;
     }
diff --git a/cc/mojom/render_frame_metadata_mojom_traits.h b/cc/mojom/render_frame_metadata_mojom_traits.h
index 34b04ce..5cee93f 100644
--- a/cc/mojom/render_frame_metadata_mojom_traits.h
+++ b/cc/mojom/render_frame_metadata_mojom_traits.h
@@ -5,13 +5,13 @@
 #ifndef CC_MOJOM_RENDER_FRAME_METADATA_MOJOM_TRAITS_H_
 #define CC_MOJOM_RENDER_FRAME_METADATA_MOJOM_TRAITS_H_
 
+#include <optional>
 #include "base/component_export.h"
 #include "build/build_config.h"
 #include "cc/mojom/render_frame_metadata.mojom-shared.h"
 #include "cc/trees/render_frame_metadata.h"
 #include "services/viz/public/cpp/compositing/local_surface_id_mojom_traits.h"
 #include "skia/public/mojom/skcolor4f_mojom_traits.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkColor.h"
 
 namespace mojo {
@@ -38,7 +38,7 @@
     return metadata.root_background_color;
   }
 
-  static const absl::optional<gfx::PointF>& root_scroll_offset(
+  static const std::optional<gfx::PointF>& root_scroll_offset(
       const cc::RenderFrameMetadata& metadata) {
     return metadata.root_scroll_offset;
   }
@@ -56,7 +56,7 @@
     return metadata.is_mobile_optimized;
   }
 
-  static const absl::optional<cc::DelegatedInkBrowserMetadata>&
+  static const std::optional<cc::DelegatedInkBrowserMetadata>&
   delegated_ink_metadata(const cc::RenderFrameMetadata& metadata) {
     return metadata.delegated_ink_metadata;
   }
@@ -70,7 +70,7 @@
     return metadata.viewport_size_in_pixels;
   }
 
-  static const absl::optional<viz::LocalSurfaceId>& local_surface_id(
+  static const std::optional<viz::LocalSurfaceId>& local_surface_id(
       const cc::RenderFrameMetadata& metadata) {
     return metadata.local_surface_id;
   }
diff --git a/cc/paint/decoded_draw_image.cc b/cc/paint/decoded_draw_image.cc
index 0d7d687..58e81961 100644
--- a/cc/paint/decoded_draw_image.cc
+++ b/cc/paint/decoded_draw_image.cc
@@ -32,7 +32,7 @@
       is_budgeted_(true) {}
 
 DecodedDrawImage::DecodedDrawImage(
-    absl::optional<uint32_t> transfer_cache_entry_id,
+    std::optional<uint32_t> transfer_cache_entry_id,
     sk_sp<ColorFilter> dark_mode_color_filter,
     const SkSize& src_rect_offset,
     const SkSize& scale_adjustment,
diff --git a/cc/paint/decoded_draw_image.h b/cc/paint/decoded_draw_image.h
index fd4f93a..634098a 100644
--- a/cc/paint/decoded_draw_image.h
+++ b/cc/paint/decoded_draw_image.h
@@ -8,10 +8,10 @@
 #include <cfloat>
 #include <cmath>
 
+#include <optional>
 #include "cc/paint/paint_export.h"
 #include "cc/paint/paint_flags.h"
 #include "gpu/command_buffer/common/mailbox.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/core/SkSize.h"
@@ -35,7 +35,7 @@
                    bool is_budgeted);
   DecodedDrawImage(const gpu::Mailbox& mailbox,
                    PaintFlags::FilterQuality filter_quality);
-  DecodedDrawImage(absl::optional<uint32_t> transfer_cache_entry_id,
+  DecodedDrawImage(std::optional<uint32_t> transfer_cache_entry_id,
                    sk_sp<ColorFilter> dark_mode_color_filter,
                    const SkSize& src_rect_offset,
                    const SkSize& scale_adjustment,
@@ -54,7 +54,7 @@
   const sk_sp<ColorFilter>& dark_mode_color_filter() const {
     return dark_mode_color_filter_;
   }
-  absl::optional<uint32_t> transfer_cache_entry_id() const {
+  std::optional<uint32_t> transfer_cache_entry_id() const {
     return transfer_cache_entry_id_;
   }
   const SkSize& src_rect_offset() const { return src_rect_offset_; }
@@ -76,7 +76,7 @@
  private:
   sk_sp<SkImage> image_;
   gpu::Mailbox mailbox_;
-  absl::optional<uint32_t> transfer_cache_entry_id_;
+  std::optional<uint32_t> transfer_cache_entry_id_;
   sk_sp<ColorFilter> dark_mode_color_filter_;
   SkSize src_rect_offset_;
   SkSize scale_adjustment_;
diff --git a/cc/paint/discardable_image_map.cc b/cc/paint/discardable_image_map.cc
index 0c33d9f..26a2dd4 100644
--- a/cc/paint/discardable_image_map.cc
+++ b/cc/paint/discardable_image_map.cc
@@ -115,7 +115,7 @@
         continue;
 
       gfx::Rect op_rect;
-      absl::optional<gfx::Rect> local_op_rect;
+      std::optional<gfx::Rect> local_op_rect;
 
       if (top_level_op_rect) {
         op_rect = *top_level_op_rect;
diff --git a/cc/paint/display_item_list.cc b/cc/paint/display_item_list.cc
index ff462feb..b934f88d 100644
--- a/cc/paint/display_item_list.cc
+++ b/cc/paint/display_item_list.cc
@@ -348,7 +348,7 @@
     offsets_to_use = &offsets;
   }
 
-  absl::optional<SkColor4f> solid_color =
+  std::optional<SkColor4f> solid_color =
       SolidColorAnalyzer::DetermineIfSolidColor(
           paint_op_buffer_, rect, max_ops_to_analyze, offsets_to_use);
   if (solid_color) {
@@ -360,7 +360,7 @@
 
 namespace {
 
-absl::optional<DisplayItemList::DirectlyCompositedImageResult>
+std::optional<DisplayItemList::DirectlyCompositedImageResult>
 DirectlyCompositedImageResultForPaintOpBuffer(const PaintOpBuffer& op_buffer) {
   // A PaintOpBuffer for an image may have 1 (a kDrawimagerect or a kDrawrecord
   // that recursively contains a PaintOpBuffer for an image) or 4 paint
@@ -375,10 +375,10 @@
   // PaintOpBuffer (i.e. 5 operations).
   constexpr size_t kMaxDrawImageOps = 5;
   if (op_buffer.size() > kMaxDrawImageOps)
-    return absl::nullopt;
+    return std::nullopt;
 
   bool transpose_image_size = false;
-  absl::optional<DisplayItemList::DirectlyCompositedImageResult> result;
+  std::optional<DisplayItemList::DirectlyCompositedImageResult> result;
   for (const PaintOp& op : op_buffer) {
     switch (op.GetType()) {
       case PaintOpType::kSave:
@@ -389,14 +389,14 @@
         // We only expect a single transformation. If we see another one, then
         // this image won't be eligible for directly compositing.
         if (transpose_image_size)
-          return absl::nullopt;
+          return std::nullopt;
         // The transformation must be before the kDrawimagerect operation.
         if (result)
-          return absl::nullopt;
+          return std::nullopt;
 
         const ConcatOp& concat_op = static_cast<const ConcatOp&>(op);
         if (!MathUtil::SkM44Preserves2DAxisAlignment(concat_op.matrix))
-          return absl::nullopt;
+          return std::nullopt;
 
         // If the image has been rotated +/-90 degrees we'll need to transpose
         // the width and height dimensions to account for the same transform
@@ -408,13 +408,13 @@
       }
       case PaintOpType::kDrawimagerect: {
         if (result)
-          return absl::nullopt;
+          return std::nullopt;
         const auto& draw_image_rect_op =
             static_cast<const DrawImageRectOp&>(op);
         const SkRect& src = draw_image_rect_op.src;
         const SkRect& dst = draw_image_rect_op.dst;
         if (src.isEmpty() || dst.isEmpty())
-          return absl::nullopt;
+          return std::nullopt;
         result.emplace();
         result->default_raster_scale = gfx::Vector2dF(
             src.width() / dst.width(), src.height() / dst.height());
@@ -427,16 +427,16 @@
       }
       case PaintOpType::kDrawrecord:
         if (result)
-          return absl::nullopt;
+          return std::nullopt;
         result = DirectlyCompositedImageResultForPaintOpBuffer(
             static_cast<const DrawRecordOp&>(op).record.buffer());
         if (!result)
-          return absl::nullopt;
+          return std::nullopt;
         break;
       default:
         // Disqualify the layer as a directly composited image if any other
         // paint op is detected.
-        return absl::nullopt;
+        return std::nullopt;
     }
   }
 
@@ -447,7 +447,7 @@
 
 }  // anonymous namespace
 
-absl::optional<DisplayItemList::DirectlyCompositedImageResult>
+std::optional<DisplayItemList::DirectlyCompositedImageResult>
 DisplayItemList::GetDirectlyCompositedImageResult() const {
   return DirectlyCompositedImageResultForPaintOpBuffer(paint_op_buffer_);
 }
diff --git a/cc/paint/display_item_list.h b/cc/paint/display_item_list.h
index 9d036dac..8411e5d 100644
--- a/cc/paint/display_item_list.h
+++ b/cc/paint/display_item_list.h
@@ -11,6 +11,7 @@
 #include <utility>
 #include <vector>
 
+#include <optional>
 #include "base/gtest_prod_util.h"
 #include "base/memory/ref_counted.h"
 #include "cc/base/rtree.h"
@@ -19,7 +20,6 @@
 #include "cc/paint/paint_export.h"
 #include "cc/paint/paint_op.h"
 #include "cc/paint/paint_op_buffer.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkPicture.h"
 #include "ui/gfx/color_space.h"
 #include "ui/gfx/geometry/rect.h"
@@ -136,7 +136,7 @@
   // rasterized at the intrinsic size of the image), return the intrinsic size
   // of the image and whether or not to use nearest neighbor filtering when
   // scaling the layer.
-  absl::optional<DirectlyCompositedImageResult>
+  std::optional<DirectlyCompositedImageResult>
   GetDirectlyCompositedImageResult() const;
 
   int num_slow_paths_up_to_min_for_MSAA() const {
@@ -230,7 +230,7 @@
 
   void GenerateDiscardableImagesMetadata() const;
 
-  mutable absl::optional<DiscardableImageMap> image_map_
+  mutable std::optional<DiscardableImageMap> image_map_
       GUARDED_BY_CONTEXT(image_generation_lock_);
   mutable base::Lock image_generation_lock_;
 
diff --git a/cc/paint/draw_image.cc b/cc/paint/draw_image.cc
index 875fc5e..2a56eb2 100644
--- a/cc/paint/draw_image.cc
+++ b/cc/paint/draw_image.cc
@@ -48,7 +48,7 @@
                      const SkIRect& src_rect,
                      PaintFlags::FilterQuality filter_quality,
                      const SkM44& matrix,
-                     absl::optional<size_t> frame_index)
+                     std::optional<size_t> frame_index)
     : paint_image_(std::move(image)),
       use_dark_mode_(use_dark_mode),
       src_rect_(src_rect),
@@ -62,7 +62,7 @@
                      const SkIRect& src_rect,
                      PaintFlags::FilterQuality filter_quality,
                      const SkM44& matrix,
-                     absl::optional<size_t> frame_index,
+                     std::optional<size_t> frame_index,
                      const TargetColorParams& target_color_params)
     : paint_image_(std::move(image)),
       use_dark_mode_(use_dark_mode),
diff --git a/cc/paint/draw_image.h b/cc/paint/draw_image.h
index bafbc2ef..a2ad0fdc 100644
--- a/cc/paint/draw_image.h
+++ b/cc/paint/draw_image.h
@@ -5,11 +5,11 @@
 #ifndef CC_PAINT_DRAW_IMAGE_H_
 #define CC_PAINT_DRAW_IMAGE_H_
 
+#include <optional>
 #include "cc/paint/paint_export.h"
 #include "cc/paint/paint_flags.h"
 #include "cc/paint/paint_image.h"
 #include "cc/paint/target_color_params.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkM44.h"
 #include "third_party/skia/include/core/SkRect.h"
@@ -32,13 +32,13 @@
             const SkIRect& src_rect,
             PaintFlags::FilterQuality filter_quality,
             const SkM44& matrix,
-            absl::optional<size_t> frame_index = absl::nullopt);
+            std::optional<size_t> frame_index = std::nullopt);
   DrawImage(PaintImage image,
             bool use_dark_mode,
             const SkIRect& src_rect,
             PaintFlags::FilterQuality filter_quality,
             const SkM44& matrix,
-            absl::optional<size_t> frame_index,
+            std::optional<size_t> frame_index,
             const TargetColorParams& target_color_params);
   // Constructs a DrawImage from |other| by adjusting its scale and setting new
   // color params.
@@ -92,8 +92,8 @@
   PaintFlags::FilterQuality filter_quality_;
   SkSize scale_;
   bool matrix_is_decomposable_;
-  absl::optional<size_t> frame_index_;
-  absl::optional<TargetColorParams> target_color_params_;
+  std::optional<size_t> frame_index_;
+  std::optional<TargetColorParams> target_color_params_;
 };
 
 }  // namespace cc
diff --git a/cc/paint/image_provider.cc b/cc/paint/image_provider.cc
index f53b496e..c9e4217f 100644
--- a/cc/paint/image_provider.cc
+++ b/cc/paint/image_provider.cc
@@ -6,8 +6,8 @@
 
 #include <utility>
 
+#include <optional>
 #include "cc/paint/paint_record.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -16,7 +16,7 @@
 ImageProvider::ScopedResult::ScopedResult(DecodedDrawImage image)
     : image_(std::move(image)) {}
 
-ImageProvider::ScopedResult::ScopedResult(absl::optional<PaintRecord> record)
+ImageProvider::ScopedResult::ScopedResult(std::optional<PaintRecord> record)
     : record_(std::move(record)) {}
 
 ImageProvider::ScopedResult::ScopedResult(DecodedDrawImage image,
diff --git a/cc/paint/image_provider.h b/cc/paint/image_provider.h
index f3fd470e..0835fe7d 100644
--- a/cc/paint/image_provider.h
+++ b/cc/paint/image_provider.h
@@ -7,13 +7,13 @@
 
 #include <utility>
 
+#include <optional>
 #include "base/functional/callback.h"
 #include "base/types/optional_util.h"
 #include "cc/paint/decoded_draw_image.h"
 #include "cc/paint/draw_image.h"
 #include "cc/paint/paint_export.h"
 #include "cc/paint/paint_op_buffer.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 class PaintImage;
@@ -28,7 +28,7 @@
 
     ScopedResult();
     explicit ScopedResult(DecodedDrawImage image);
-    explicit ScopedResult(absl::optional<PaintRecord> record);
+    explicit ScopedResult(std::optional<PaintRecord> record);
     ScopedResult(DecodedDrawImage image, DestructionCallback callback);
     ScopedResult(const ScopedResult&) = delete;
     ScopedResult(ScopedResult&& other);
@@ -51,7 +51,7 @@
     void DestroyDecode();
 
     DecodedDrawImage image_;
-    absl::optional<PaintRecord> record_;
+    std::optional<PaintRecord> record_;
     DestructionCallback destruction_callback_;
   };
 
diff --git a/cc/paint/image_transfer_cache_entry.cc b/cc/paint/image_transfer_cache_entry.cc
index a8273f05..7346595 100644
--- a/cc/paint/image_transfer_cache_entry.cc
+++ b/cc/paint/image_transfer_cache_entry.cc
@@ -257,7 +257,7 @@
     GrDirectContext* gr_context,
     skgpu::graphite::Recorder* graphite_recorder,
     bool mip_mapped_for_upload,
-    absl::optional<SkYUVAInfo>* out_yuva_info = nullptr,
+    std::optional<SkYUVAInfo>* out_yuva_info = nullptr,
     std::vector<sk_sp<SkImage>>* out_yuva_plane_images = nullptr) {
   int max_size;
   if (gr_context) {
@@ -349,7 +349,7 @@
     }
 
     if (out_yuva_info) {
-      *out_yuva_info = absl::nullopt;
+      *out_yuva_info = std::nullopt;
     }
     if (out_yuva_plane_images) {
       out_yuva_plane_images->clear();
@@ -476,7 +476,7 @@
 ClientImageTransferCacheEntry::ClientImageTransferCacheEntry(
     const Image& image,
     bool needs_mips,
-    const absl::optional<gfx::HDRMetadata>& hdr_metadata,
+    const std::optional<gfx::HDRMetadata>& hdr_metadata,
     sk_sp<SkColorSpace> target_color_space)
     : needs_mips_(needs_mips),
       target_color_space_(target_color_space),
@@ -767,7 +767,7 @@
     }
 
     // Color conversion converts to RGBA. Remove all YUV state.
-    yuva_info_ = absl::nullopt;
+    yuva_info_ = std::nullopt;
     plane_images_.clear();
     plane_sizes_.clear();
 
diff --git a/cc/paint/image_transfer_cache_entry.h b/cc/paint/image_transfer_cache_entry.h
index 611ff79..95db874 100644
--- a/cc/paint/image_transfer_cache_entry.h
+++ b/cc/paint/image_transfer_cache_entry.h
@@ -10,11 +10,11 @@
 
 #include <vector>
 
+#include <optional>
 #include "base/atomic_sequence_num.h"
 #include "base/containers/span.h"
 #include "base/memory/raw_ptr.h"
 #include "cc/paint/transfer_cache_entry.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkImageInfo.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/core/SkYUVAInfo.h"
@@ -82,7 +82,7 @@
   ClientImageTransferCacheEntry(
       const Image& image,
       bool needs_mips,
-      const absl::optional<gfx::HDRMetadata>& hdr_metadata = absl::nullopt,
+      const std::optional<gfx::HDRMetadata>& hdr_metadata = std::nullopt,
       sk_sp<SkColorSpace> target_color_space = nullptr);
   ClientImageTransferCacheEntry(const Image& image,
                                 const Image& gainmap_image,
@@ -115,11 +115,11 @@
 
   // The gainmap image and parameters. Either both or neither of these must
   // be specified.
-  absl::optional<Image> gainmap_image_;
-  absl::optional<SkGainmapInfo> gainmap_info_;
+  std::optional<Image> gainmap_image_;
+  std::optional<SkGainmapInfo> gainmap_info_;
 
   // The HDR metadata for non-gainmap HDR metadata.
-  absl::optional<gfx::HDRMetadata> hdr_metadata_;
+  std::optional<gfx::HDRMetadata> hdr_metadata_;
 };
 
 class CC_PAINT_EXPORT ServiceImageTransferCacheEntry final
@@ -197,7 +197,7 @@
 
   // HDR tonemapping may be done with a tone curve (for global tone mapping).
   bool use_tone_curve_ = false;
-  absl::optional<gfx::HDRMetadata> tone_curve_hdr_metadata_;
+  std::optional<gfx::HDRMetadata> tone_curve_hdr_metadata_;
 
   // The value of `size_` is computed during deserialization and never updated
   // (even if the size of the image changes due to mipmaps being requested).
@@ -206,7 +206,7 @@
   // The individual planes that are used by `image_` when `image_` is a YUVA
   // image. The planes are kept around for use in EnsureMips(), memory dumps,
   // and unit tests.
-  absl::optional<SkYUVAInfo> yuva_info_;
+  std::optional<SkYUVAInfo> yuva_info_;
   std::vector<sk_sp<SkImage>> plane_images_;
   std::vector<size_t> plane_sizes_;
 };
diff --git a/cc/paint/image_transfer_cache_entry_unittest.cc b/cc/paint/image_transfer_cache_entry_unittest.cc
index b094518..a055d6d 100644
--- a/cc/paint/image_transfer_cache_entry_unittest.cc
+++ b/cc/paint/image_transfer_cache_entry_unittest.cc
@@ -245,7 +245,7 @@
       ClientImageTransferCacheEntry::Image(yuva_pixmaps.planes().data(),
                                            yuva_info,
                                            nullptr /* decoded color space*/),
-      true /* needs_mips */, absl::nullopt));
+      true /* needs_mips */, std::nullopt));
   uint32_t size = client_entry->SerializedSize();
   auto data = PaintOpWriter::AllocateAlignedBuffer<uint8_t>(size);
   ASSERT_TRUE(client_entry->Serialize(
@@ -399,7 +399,7 @@
 
   ClientImageTransferCacheEntry client_entry(
       ClientImageTransferCacheEntry::Image(&bitmap.pixmap()), true,
-      absl::nullopt);
+      std::nullopt);
   const uint32_t storage_size = client_entry.SerializedSize();
   auto storage = PaintOpWriter::AllocateAlignedBuffer<uint8_t>(storage_size);
   client_entry.Serialize(base::make_span(storage.get(), storage_size));
@@ -429,7 +429,7 @@
       SkImageInfo::MakeN32Premul(gr_context->maxTextureSize() + 1, 10));
   ClientImageTransferCacheEntry client_entry(
       ClientImageTransferCacheEntry::Image(&bitmap.pixmap()), false,
-      absl::nullopt);
+      std::nullopt);
   const uint32_t storage_size = client_entry.SerializedSize();
   auto storage = PaintOpWriter::AllocateAlignedBuffer<uint8_t>(storage_size);
   client_entry.Serialize(base::make_span(storage.get(), storage_size));
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc
index d63fcb0..eed3655 100644
--- a/cc/paint/oop_pixeltest.cc
+++ b/cc/paint/oop_pixeltest.cc
@@ -174,7 +174,7 @@
 
   SkBitmap Raster(scoped_refptr<DisplayItemList> display_item_list,
                   const RasterOptions& options) {
-    absl::optional<PlaybackImageProvider::Settings> settings;
+    std::optional<PlaybackImageProvider::Settings> settings;
     settings.emplace(PlaybackImageProvider::Settings());
     settings->raster_mode = options.image_provider_raster_mode;
     PlaybackImageProvider image_provider(oop_image_cache_.get(),
@@ -267,7 +267,7 @@
       gpu::SharedImageInterface* sii,
       const RasterOptions& options,
       viz::SharedImageFormat image_format,
-      absl::optional<gfx::ColorSpace> color_space = absl::nullopt) {
+      std::optional<gfx::ColorSpace> color_space = std::nullopt) {
     uint32_t flags = gpu::SHARED_IMAGE_USAGE_RASTER |
                      gpu::SHARED_IMAGE_USAGE_OOP_RASTERIZATION;
     gpu::Mailbox mailbox =
@@ -832,7 +832,7 @@
 
   auto actual = Raster(display_item_list, options);
 
-#if BUILDFLAG(IS_ANDROID) || (BUILDFLAG(IS_IOS) && BUILDFLAG(SKIA_USE_METAL))
+#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
   // Android has slight differences in color.
   FuzzyPixelOffByOneComparator comparator;
 #else
@@ -1655,13 +1655,6 @@
       public ::testing::WithParamInterface<TextBlobTestConfig> {
  public:
   void RunTest() {
-#if BUILDFLAG(IS_IOS) && BUILDFLAG(SKIA_USE_METAL)
-    if (GetFilterStrategy(GetParam()) != FilterStrategy::kNone) {
-      GTEST_SKIP() << " blur with decal tile mode currently fails on with "
-                      "SkiaGraphite and the metal backend in the simulator";
-    }
-#endif
-
     RasterOptions options;
     options.resource_size = gfx::Size(100, 100);
     options.content_size = options.resource_size;
@@ -2512,7 +2505,7 @@
     display_item_list->Finalize();
 
     auto comparator =
-#if BUILDFLAG(IS_IOS) && BUILDFLAG(SKIA_USE_METAL)
+#if BUILDFLAG(IS_IOS)
         // TODO(crbug.com/1476507): We have larger errors on the platform, but
         // the images here still seem visually indistinguishable.
         FuzzyPixelComparator().SetErrorPixelsPercentageLimit(0.5f);
diff --git a/cc/paint/paint_filter.h b/cc/paint/paint_filter.h
index b7326f4..a32fad8 100644
--- a/cc/paint/paint_filter.h
+++ b/cc/paint/paint_filter.h
@@ -7,13 +7,13 @@
 
 #include <string>
 
+#include <optional>
 #include "base/check_op.h"
 #include "cc/paint/color_filter.h"
 #include "cc/paint/paint_export.h"
 #include "cc/paint/paint_image.h"
 #include "cc/paint/paint_shader.h"
 #include "third_party/abseil-cpp/absl/container/inlined_vector.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkBlendMode.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "third_party/skia/include/core/SkImageFilter.h"
@@ -144,7 +144,7 @@
   friend class viz::SoftwareRenderer;
 
   const Type type_;
-  absl::optional<CropRect> crop_rect_;
+  std::optional<CropRect> crop_rect_;
   const bool has_discardable_images_;
 
   ImageAnalysisState image_analysis_state_ = ImageAnalysisState::kNoAnalysis;
diff --git a/cc/paint/paint_image.h b/cc/paint/paint_image.h
index bfada0f..c3b11c36 100644
--- a/cc/paint/paint_image.h
+++ b/cc/paint/paint_image.h
@@ -8,6 +8,7 @@
 #include <string>
 #include <vector>
 
+#include <optional>
 #include "base/gtest_prod_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "cc/paint/frame_metadata.h"
@@ -15,7 +16,6 @@
 #include "cc/paint/paint_export.h"
 #include "cc/paint/paint_record.h"
 #include "gpu/command_buffer/common/mailbox.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkImageInfo.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
@@ -85,7 +85,7 @@
   YUVSubsampling yuv_subsampling = YUVSubsampling::kUnknown;
 
   // The HDR metadata included with the image, if present.
-  absl::optional<gfx::HDRMetadata> hdr_metadata;
+  std::optional<gfx::HDRMetadata> hdr_metadata;
 
   // The visible size of the image (i.e., the area that contains meaningful
   // pixels).
@@ -95,7 +95,7 @@
   // |image_size| for a 4:2:0 JPEG is 12x31, its coded size should be 16x32
   // because the size of a minimum-coded unit for 4:2:0 is 16x16.
   // A zero-initialized |coded_size| indicates an invalid image.
-  absl::optional<gfx::Size> coded_size;
+  std::optional<gfx::Size> coded_size;
 
   // Whether the image embeds an ICC color profile.
   bool has_embedded_color_profile = false;
@@ -104,11 +104,11 @@
   bool all_data_received_prior_to_decode = false;
 
   // For JPEGs only: whether the image is progressive (as opposed to baseline).
-  absl::optional<bool> jpeg_is_progressive;
+  std::optional<bool> jpeg_is_progressive;
 
   // For WebPs only: whether this is a simple-format lossy image. See
   // https://developers.google.com/speed/webp/docs/riff_container#simple_file_format_lossy.
-  absl::optional<bool> webp_is_non_extended_lossy;
+  std::optional<bool> webp_is_non_extended_lossy;
 };
 
 // A representation of an image for the compositor.  This is the most abstract
@@ -358,11 +358,11 @@
     return gainmap_info_.value();
   }
 
-  absl::optional<gfx::HDRMetadata> GetHDRMetadata() const {
+  std::optional<gfx::HDRMetadata> GetHDRMetadata() const {
     if (const auto* image_metadata = GetImageHeaderMetadata()) {
       return image_metadata->hdr_metadata;
     }
-    return absl::nullopt;
+    return std::nullopt;
   }
 
   std::string ToString() const;
@@ -400,7 +400,7 @@
   const sk_sp<SkImage>& GetSkImage() const;
 
   sk_sp<SkImage> sk_image_;
-  absl::optional<PaintRecord> paint_record_;
+  std::optional<PaintRecord> paint_record_;
   gfx::Rect paint_record_rect_;
 
   ContentId content_id_ = kInvalidContentId;
@@ -409,10 +409,10 @@
 
   // Gainmap HDR metadata.
   sk_sp<PaintImageGenerator> gainmap_paint_image_generator_;
-  absl::optional<SkGainmapInfo> gainmap_info_;
+  std::optional<SkGainmapInfo> gainmap_info_;
 
   // The HDR metadata for non-gainmap HDR rendering.
-  absl::optional<gfx::HDRMetadata> hdr_metadata_;
+  std::optional<gfx::HDRMetadata> hdr_metadata_;
 
   sk_sp<TextureBacking> texture_backing_;
 
diff --git a/cc/paint/paint_image_builder.cc b/cc/paint/paint_image_builder.cc
index 176dece4..d08ca0f7 100644
--- a/cc/paint/paint_image_builder.cc
+++ b/cc/paint/paint_image_builder.cc
@@ -29,7 +29,7 @@
 #endif
   if (clear_contents) {
     paint_image_.sk_image_ = nullptr;
-    paint_image_.paint_record_ = absl::nullopt;
+    paint_image_.paint_record_ = std::nullopt;
     paint_image_.paint_record_rect_ = gfx::Rect();
     paint_image_.paint_image_generator_ = nullptr;
     paint_image_.cached_sk_image_ = nullptr;
diff --git a/cc/paint/paint_image_builder.h b/cc/paint/paint_image_builder.h
index 54f8685..3f80dbd9b 100644
--- a/cc/paint/paint_image_builder.h
+++ b/cc/paint/paint_image_builder.h
@@ -86,7 +86,7 @@
     return std::move(*this);
   }
   PaintImageBuilder&& set_hdr_metadata(
-      absl::optional<gfx::HDRMetadata> hdr_metadata) {
+      std::optional<gfx::HDRMetadata> hdr_metadata) {
     paint_image_.hdr_metadata_ = hdr_metadata;
     return std::move(*this);
   }
diff --git a/cc/paint/paint_op.cc b/cc/paint/paint_op.cc
index fa753ce..decb0df2 100644
--- a/cc/paint/paint_op.cc
+++ b/cc/paint/paint_op.cc
@@ -881,7 +881,7 @@
 template <typename T>
 bool DeserializeSkottieMap(
     base::flat_map<SkottieResourceIdHash, T>& map,
-    absl::optional<size_t> max_map_size,
+    std::optional<size_t> max_map_size,
     PaintOpReader& reader,
     base::FunctionRef<T(PaintOpReader& reader)> value_deserializer) {
   size_t map_size = 0;
@@ -954,7 +954,7 @@
           op->images, /*max_map_size=*/num_assets_in_animation, reader,
           DeserializeSkottieFrameData) &&
       DeserializeSkottieMap<SkColor>(op->color_map,
-                                     /*max_map_size=*/absl::nullopt, reader,
+                                     /*max_map_size=*/std::nullopt, reader,
                                      DeserializeSkottieColor) &&
       DeserializeSkottieMap<SkottieTextPropertyValue>(
           op->text_map, /*max_map_size=*/num_text_nodes_in_animation, reader,
@@ -1454,7 +1454,7 @@
                               const PlaybackParams& params) {
   // See PaintOp::kUnsetRect
   bool unset = op->bounds.left() == SK_ScalarInfinity;
-  absl::optional<SkPaint> paint;
+  std::optional<SkPaint> paint;
   if (op->alpha != 1.0f) {
     paint.emplace();
     paint->setAlphaf(op->alpha);
diff --git a/cc/paint/paint_op_buffer.h b/cc/paint/paint_op_buffer.h
index 2d19b217..e8304e9 100644
--- a/cc/paint/paint_op_buffer.h
+++ b/cc/paint/paint_op_buffer.h
@@ -10,6 +10,7 @@
 #include <utility>
 #include <vector>
 
+#include <optional>
 #include "base/bits.h"
 #include "base/check_op.h"
 #include "base/functional/callback.h"
@@ -17,7 +18,6 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/raw_ptr_exclusion.h"
 #include "cc/paint/paint_export.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkM44.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 
@@ -75,7 +75,7 @@
   CustomDataRasterCallback custom_callback;
   DidDrawOpCallback did_draw_op_callback;
   ConvertOpCallback convert_op_callback;
-  absl::optional<bool> save_layer_alpha_should_preserve_lcd_text;
+  std::optional<bool> save_layer_alpha_should_preserve_lcd_text;
   bool is_analyzing = false;
 };
 
diff --git a/cc/paint/paint_op_buffer_iterator.cc b/cc/paint/paint_op_buffer_iterator.cc
index 076bef4..28ba1af6 100644
--- a/cc/paint/paint_op_buffer_iterator.cc
+++ b/cc/paint/paint_op_buffer_iterator.cc
@@ -39,10 +39,10 @@
     const PaintOpBuffer& buffer,
     const std::vector<size_t>* offsets)
     : iter_(offsets == nullptr ? absl::variant<Iterator, OffsetIterator>(
-                                     absl::in_place_type<Iterator>,
+                                     std::in_place_type<Iterator>,
                                      buffer)
                                : absl::variant<Iterator, OffsetIterator>(
-                                     absl::in_place_type<OffsetIterator>,
+                                     std::in_place_type<OffsetIterator>,
                                      buffer,
                                      *offsets)) {}
 
diff --git a/cc/paint/paint_op_reader.cc b/cc/paint/paint_op_reader.cc
index 128d430..1af06fd 100644
--- a/cc/paint/paint_op_reader.cc
+++ b/cc/paint/paint_op_reader.cc
@@ -925,7 +925,7 @@
   }
 
   uint32_t has_crop_rect = 0;
-  absl::optional<PaintFilter::CropRect> crop_rect;
+  std::optional<PaintFilter::CropRect> crop_rect;
   ReadSimple(&has_crop_rect);
   if (has_crop_rect) {
     SkRect rect = SkRect::MakeEmpty();
@@ -1009,7 +1009,7 @@
 
 void PaintOpReader::ReadColorFilterPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   sk_sp<ColorFilter> color_filter;
   sk_sp<PaintFilter> input;
 
@@ -1024,7 +1024,7 @@
 
 void PaintOpReader::ReadBlurPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   SkScalar sigma_x = 0.f;
   SkScalar sigma_y = 0.f;
   SkTileMode tile_mode;
@@ -1043,7 +1043,7 @@
 
 void PaintOpReader::ReadDropShadowPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   SkScalar dx = 0.f;
   SkScalar dy = 0.f;
   SkScalar sigma_x = 0.f;
@@ -1069,7 +1069,7 @@
 
 void PaintOpReader::ReadMagnifierPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   SkRect lens_bounds = SkRect::MakeEmpty();
   SkScalar zoom_amount = 1.f;
   SkScalar inset = 0.f;
@@ -1088,7 +1088,7 @@
 
 void PaintOpReader::ReadComposePaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   sk_sp<PaintFilter> outer;
   sk_sp<PaintFilter> inner;
 
@@ -1101,7 +1101,7 @@
 
 void PaintOpReader::ReadAlphaThresholdPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   SkRegion region;
   sk_sp<PaintFilter> input;
 
@@ -1115,7 +1115,7 @@
 
 void PaintOpReader::ReadXfermodePaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   SkBlendMode blend_mode;
   sk_sp<PaintFilter> background;
   sk_sp<PaintFilter> foreground;
@@ -1133,7 +1133,7 @@
 
 void PaintOpReader::ReadArithmeticPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   float k1 = 0.f;
   float k2 = 0.f;
   float k3 = 0.f;
@@ -1157,7 +1157,7 @@
 
 void PaintOpReader::ReadMatrixConvolutionPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   SkISize kernel_size = SkISize::MakeEmpty();
   SkScalar gain = 0.f;
   SkScalar bias = 0.f;
@@ -1203,7 +1203,7 @@
 
 void PaintOpReader::ReadDisplacementMapEffectPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   SkColorChannel channel_x;
   SkColorChannel channel_y;
   SkScalar scale = 0.f;
@@ -1225,7 +1225,7 @@
 
 void PaintOpReader::ReadImagePaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   PaintImage image;
   Read(&image, PaintFlags::DynamicRangeLimit::kHigh);
   if (!image) {
@@ -1248,7 +1248,7 @@
 
 void PaintOpReader::ReadRecordPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   bool has_filter = false;
   ReadSimple(&has_filter);
   if (!has_filter) {
@@ -1282,7 +1282,7 @@
     return;
   }
 
-  absl::optional<PaintRecord> record;
+  std::optional<PaintRecord> record;
   Read(&record);
   if (!valid_) {
     return;
@@ -1293,7 +1293,7 @@
 
 void PaintOpReader::ReadMergePaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   size_t input_count = 0;
   ReadSize(&input_count);
 
@@ -1317,7 +1317,7 @@
 
 void PaintOpReader::ReadMorphologyPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   MorphologyPaintFilter::MorphType morph_type;
   float radius_x = 0;
   float radius_y = 0;
@@ -1335,7 +1335,7 @@
 
 void PaintOpReader::ReadOffsetPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   SkScalar dx = 0.f;
   SkScalar dy = 0.f;
   sk_sp<PaintFilter> input;
@@ -1351,7 +1351,7 @@
 
 void PaintOpReader::ReadTilePaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   SkRect src = SkRect::MakeEmpty();
   SkRect dst = SkRect::MakeEmpty();
   sk_sp<PaintFilter> input;
@@ -1366,7 +1366,7 @@
 
 void PaintOpReader::ReadTurbulencePaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   TurbulencePaintFilter::TurbulenceType turbulence_type;
   SkScalar base_frequency_x = 0.f;
   SkScalar base_frequency_y = 0.f;
@@ -1389,7 +1389,7 @@
 
 void PaintOpReader::ReadShaderPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   using Dither = SkImageFilters::Dither;
 
   sk_sp<PaintShader> shader;
@@ -1411,7 +1411,7 @@
 
 void PaintOpReader::ReadMatrixPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   SkMatrix matrix = SkMatrix::I();
   PaintFlags::FilterQuality filter_quality = PaintFlags::FilterQuality::kNone;
   sk_sp<PaintFilter> input;
@@ -1427,7 +1427,7 @@
 
 void PaintOpReader::ReadLightingDistantPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   PaintFilter::LightingType lighting_type;
   SkPoint3 direction = SkPoint3::Make(0.f, 0.f, 0.f);
   SkColor light_color = SK_ColorBLACK;
@@ -1454,7 +1454,7 @@
 
 void PaintOpReader::ReadLightingPointPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   PaintFilter::LightingType lighting_type;
   SkPoint3 location = SkPoint3::Make(0.f, 0.f, 0.f);
   SkColor light_color = SK_ColorBLACK;
@@ -1480,7 +1480,7 @@
 
 void PaintOpReader::ReadLightingSpotPaintFilter(
     sk_sp<PaintFilter>* filter,
-    const absl::optional<PaintFilter::CropRect>& crop_rect) {
+    const std::optional<PaintFilter::CropRect>& crop_rect) {
   PaintFilter::LightingType lighting_type;
   SkPoint3 location = SkPoint3::Make(0.f, 0.f, 0.f);
   SkPoint3 target = SkPoint3::Make(0.f, 0.f, 0.f);
@@ -1512,7 +1512,7 @@
       std::move(input), base::OptionalToPtr(crop_rect)));
 }
 
-size_t PaintOpReader::Read(absl::optional<PaintRecord>* record) {
+size_t PaintOpReader::Read(std::optional<PaintRecord>* record) {
   size_t size_bytes = 0;
   ReadSize(&size_bytes);
 
diff --git a/cc/paint/paint_op_reader.h b/cc/paint/paint_op_reader.h
index 30b9d78..d65dd3a 100644
--- a/cc/paint/paint_op_reader.h
+++ b/cc/paint/paint_op_reader.h
@@ -5,6 +5,7 @@
 #ifndef CC_PAINT_PAINT_OP_READER_H_
 #define CC_PAINT_PAINT_OP_READER_H_
 
+#include <optional>
 #include "base/bits.h"
 #include "base/memory/raw_ref.h"
 #include "base/memory/scoped_refptr.h"
@@ -12,7 +13,6 @@
 #include "cc/paint/paint_filter.h"
 #include "cc/paint/paint_op_writer.h"
 #include "cc/paint/transfer_cache_deserialize_helper.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 struct SkGainmapInfo;
 struct SkHighContrastConfig;
@@ -245,73 +245,73 @@
   // the following functions depending on read type.
   void ReadColorFilterPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadBlurPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadDropShadowPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadMagnifierPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadComposePaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadAlphaThresholdPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadXfermodePaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadArithmeticPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadMatrixConvolutionPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadDisplacementMapEffectPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadImagePaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadRecordPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadMergePaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadMorphologyPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadOffsetPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadTilePaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadTurbulencePaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadShaderPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadMatrixPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadLightingDistantPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadLightingPointPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
   void ReadLightingSpotPaintFilter(
       sk_sp<PaintFilter>* filter,
-      const absl::optional<PaintFilter::CropRect>& crop_rect);
+      const std::optional<PaintFilter::CropRect>& crop_rect);
 
   // Returns the size of the read record, 0 if error.
-  size_t Read(absl::optional<PaintRecord>* record);
+  size_t Read(std::optional<PaintRecord>* record);
 
   void Read(SkRegion* region);
   uint8_t* CopyScratchSpace(size_t bytes);
diff --git a/cc/paint/paint_op_writer.cc b/cc/paint/paint_op_writer.cc
index eda20a06..53c47b6 100644
--- a/cc/paint/paint_op_writer.cc
+++ b/cc/paint/paint_op_writer.cc
@@ -380,7 +380,7 @@
     return;
   }
 
-  absl::optional<uint32_t> id = decoded_draw_image.transfer_cache_entry_id();
+  std::optional<uint32_t> id = decoded_draw_image.transfer_cache_entry_id();
   // In the case of a decode failure, id may not be set. Send an invalid ID.
   WriteImage(id.value_or(kInvalidImageTransferCacheEntryId),
              decoded_draw_image.transfer_cache_entry_needs_mips());
diff --git a/cc/paint/paint_op_writer.h b/cc/paint/paint_op_writer.h
index 26bb335..f9d2356f 100644
--- a/cc/paint/paint_op_writer.h
+++ b/cc/paint/paint_op_writer.h
@@ -151,7 +151,7 @@
   static size_t SerializedSize(const PaintFilter* filter);
 
   template <typename T>
-  static size_t SerializedSize(const absl::optional<T>& o) {
+  static size_t SerializedSize(const std::optional<T>& o) {
     if (o) {
       return (base::CheckedNumeric<size_t>(SerializedSize<bool>()) +
               SerializedSize<T>(*o))
diff --git a/cc/paint/paint_shader.h b/cc/paint/paint_shader.h
index 8b0fbfc..8ab0504 100644
--- a/cc/paint/paint_shader.h
+++ b/cc/paint/paint_shader.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <vector>
 
+#include <optional>
 #include "base/gtest_prod_util.h"
 #include "base/types/optional_util.h"
 #include "cc/paint/image_analysis_state.h"
@@ -15,7 +16,6 @@
 #include "cc/paint/paint_flags.h"
 #include "cc/paint/paint_image.h"
 #include "cc/paint/paint_record.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkScalar.h"
 #include "third_party/skia/include/effects/SkGradientShader.h"
@@ -256,7 +256,7 @@
   SkColor4f fallback_color_ = SkColors::kTransparent;
   ScalingBehavior scaling_behavior_ = ScalingBehavior::kRasterAtScale;
 
-  absl::optional<SkMatrix> local_matrix_;
+  std::optional<SkMatrix> local_matrix_;
   SkPoint center_ = SkPoint::Make(0, 0);
   SkRect tile_ = SkRect::MakeEmpty();
 
@@ -267,12 +267,12 @@
   SkScalar end_degrees_ = 0;
 
   PaintImage image_;
-  absl::optional<PaintRecord> record_;
+  std::optional<PaintRecord> record_;
   RecordShaderId id_ = kInvalidRecordShaderId;
 
   // For decoded PaintRecord shaders, specifies the scale at which the record
   // will be rasterized.
-  absl::optional<gfx::SizeF> tile_scale_;
+  std::optional<gfx::SizeF> tile_scale_;
 
   std::vector<SkColor4f> colors_;
   std::vector<SkScalar> positions_;
diff --git a/cc/paint/paint_worklet_input.h b/cc/paint/paint_worklet_input.h
index f0fdc22..4e451a31 100644
--- a/cc/paint/paint_worklet_input.h
+++ b/cc/paint/paint_worklet_input.h
@@ -9,12 +9,12 @@
 #include <utility>
 #include <vector>
 
+#include <optional>
 #include "base/containers/flat_map.h"
 #include "base/memory/ref_counted.h"
 #include "cc/paint/element_id.h"
 #include "cc/paint/paint_export.h"
 #include "cc/paint/paint_image.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 #include "ui/gfx/geometry/size_f.h"
@@ -55,8 +55,8 @@
     bool operator!=(const PropertyKey& other) const;
     bool operator<(const PropertyKey&) const;
 
-    absl::optional<std::string> custom_property_name;
-    absl::optional<NativePropertyType> native_property_type;
+    std::optional<std::string> custom_property_name;
+    std::optional<NativePropertyType> native_property_type;
     ElementId element_id;
   };
 
@@ -74,8 +74,8 @@
     ~PropertyValue();
     bool has_value() const;
     void reset();
-    absl::optional<float> float_value;
-    absl::optional<SkColor4f> color_value;
+    std::optional<float> float_value;
+    std::optional<SkColor4f> color_value;
   };
 
   virtual gfx::SizeF GetSize() const = 0;
@@ -104,7 +104,7 @@
 // the PaintWorklet to enable efficient invalidation of dirty PaintWorklets.
 using PaintWorkletRecordMap =
     base::flat_map<scoped_refptr<const PaintWorkletInput>,
-                   std::pair<PaintImage::Id, absl::optional<PaintRecord>>>;
+                   std::pair<PaintImage::Id, std::optional<PaintRecord>>>;
 
 }  // namespace cc
 
diff --git a/cc/paint/record_paint_canvas.h b/cc/paint/record_paint_canvas.h
index 0f9f81d..90403ed 100644
--- a/cc/paint/record_paint_canvas.h
+++ b/cc/paint/record_paint_canvas.h
@@ -5,6 +5,7 @@
 #ifndef CC_PAINT_RECORD_PAINT_CANVAS_H_
 #define CC_PAINT_RECORD_PAINT_CANVAS_H_
 
+#include <optional>
 #include "base/compiler_specific.h"
 #include "base/memory/raw_ptr.h"
 #include "build/build_config.h"
@@ -13,7 +14,6 @@
 #include "cc/paint/paint_op_buffer.h"
 #include "cc/paint/paint_record.h"
 #include "cc/paint/skottie_color_map.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/utils/SkNoDrawCanvas.h"
 
 namespace cc {
diff --git a/cc/paint/scoped_raster_flags.h b/cc/paint/scoped_raster_flags.h
index 40d1a43..8104ca6 100644
--- a/cc/paint/scoped_raster_flags.h
+++ b/cc/paint/scoped_raster_flags.h
@@ -5,11 +5,11 @@
 #ifndef CC_PAINT_SCOPED_RASTER_FLAGS_H_
 #define CC_PAINT_SCOPED_RASTER_FLAGS_H_
 
+#include <optional>
 #include "base/memory/raw_ptr_exclusion.h"
 #include "cc/paint/decode_stashing_image_provider.h"
 #include "cc/paint/paint_export.h"
 #include "cc/paint/paint_flags.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -77,8 +77,8 @@
   // This field is not a raw_ptr<> because it was filtered by the rewriter for:
   // #union
   RAW_PTR_EXCLUSION const PaintFlags* original_flags_;
-  absl::optional<PaintFlags> modified_flags_;
-  absl::optional<DecodeStashingImageProvider> decode_stashing_image_provider_;
+  std::optional<PaintFlags> modified_flags_;
+  std::optional<DecodeStashingImageProvider> decode_stashing_image_provider_;
   bool decode_failed_ = false;
 };
 
diff --git a/cc/paint/skia_paint_canvas.cc b/cc/paint/skia_paint_canvas.cc
index 94945f5..6286f7b 100644
--- a/cc/paint/skia_paint_canvas.cc
+++ b/cc/paint/skia_paint_canvas.cc
@@ -279,7 +279,7 @@
                                 const SkSamplingOptions& sampling,
                                 const PaintFlags* flags) {
   DCHECK(!image.IsPaintWorklet());
-  absl::optional<ScopedRasterFlags> scoped_flags;
+  std::optional<ScopedRasterFlags> scoped_flags;
   if (flags) {
     scoped_flags.emplace(flags, image_provider_, canvas_->getTotalMatrix(),
                          GetMaxTextureSize(), 1.0f);
@@ -300,7 +300,7 @@
                                     const SkSamplingOptions& sampling,
                                     const PaintFlags* flags,
                                     SkCanvas::SrcRectConstraint constraint) {
-  absl::optional<ScopedRasterFlags> scoped_flags;
+  std::optional<ScopedRasterFlags> scoped_flags;
   if (flags) {
     scoped_flags.emplace(flags, image_provider_, canvas_->getTotalMatrix(),
                          GetMaxTextureSize(), 1.0f);
diff --git a/cc/paint/skottie_frame_data_provider.h b/cc/paint/skottie_frame_data_provider.h
index 2a49a88..d9d1d6a 100644
--- a/cc/paint/skottie_frame_data_provider.h
+++ b/cc/paint/skottie_frame_data_provider.h
@@ -5,13 +5,13 @@
 #ifndef CC_PAINT_SKOTTIE_FRAME_DATA_PROVIDER_H_
 #define CC_PAINT_SKOTTIE_FRAME_DATA_PROVIDER_H_
 
+#include <optional>
 #include "base/files/file_path.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/strings/string_piece.h"
 #include "cc/paint/paint_export.h"
 #include "cc/paint/skottie_frame_data.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace cc {
@@ -66,7 +66,7 @@
   virtual scoped_refptr<ImageAsset> LoadImageAsset(
       base::StringPiece resource_id,
       const base::FilePath& resource_path,
-      const absl::optional<gfx::Size>& size) = 0;
+      const std::optional<gfx::Size>& size) = 0;
 };
 
 }  // namespace cc
diff --git a/cc/paint/skottie_mru_resource_provider.cc b/cc/paint/skottie_mru_resource_provider.cc
index 8840193..950b454 100644
--- a/cc/paint/skottie_mru_resource_provider.cc
+++ b/cc/paint/skottie_mru_resource_provider.cc
@@ -7,12 +7,12 @@
 #include <string>
 #include <utility>
 
+#include <optional>
 #include "base/check.h"
 #include "base/json/json_reader.h"
 #include "base/logging.h"
 #include "base/strings/string_piece.h"
 #include "base/values.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 
@@ -30,7 +30,7 @@
     base::StringPiece animation_json) {
   base::flat_map<std::string, gfx::Size> image_asset_sizes;
 
-  absl::optional<base::Value> animation_dict =
+  std::optional<base::Value> animation_dict =
       base::JSONReader::Read(animation_json);
   if (!animation_dict || !animation_dict->is_dict()) {
     LOG(ERROR) << "Failed to parse Lottie animation json";
@@ -52,8 +52,8 @@
     const base::Value::Dict& asset_dict = asset.GetDict();
 
     const std::string* id = asset_dict.FindString(kIdKey);
-    absl::optional<int> width = asset_dict.FindInt(kWidthKey);
-    absl::optional<int> height = asset_dict.FindInt(kHeightKey);
+    std::optional<int> width = asset_dict.FindInt(kWidthKey);
+    std::optional<int> height = asset_dict.FindInt(kHeightKey);
     if (id && width && height && *width > 0 && *height > 0 &&
         !image_asset_sizes.emplace(*id, gfx::Size(*width, *height)).second) {
       LOG(WARNING) << "Multiple assets found in animation with id " << *id;
@@ -116,7 +116,7 @@
     const char resource_name[],
     const char resource_id[]) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  absl::optional<gfx::Size> size;
+  std::optional<gfx::Size> size;
   if (image_asset_sizes_.contains(resource_id))
     size.emplace(image_asset_sizes_.at(resource_id));
 
diff --git a/cc/paint/skottie_mru_resource_provider_unittest.cc b/cc/paint/skottie_mru_resource_provider_unittest.cc
index c6d7638b..1c71e6f8 100644
--- a/cc/paint/skottie_mru_resource_provider_unittest.cc
+++ b/cc/paint/skottie_mru_resource_provider_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include <optional>
 #include "base/containers/flat_map.h"
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
@@ -17,7 +18,6 @@
 #include "cc/test/skia_common.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/modules/skresources/include/SkResources.h"
 #include "ui/gfx/geometry/size.h"
@@ -189,7 +189,7 @@
           FieldsAre(base::FilePath(FILE_PATH_LITERAL(
                                        "test-resource-path/test-resource-name"))
                         .NormalizePathSeparators(),
-                    Eq(absl::nullopt)))));
+                    Eq(std::nullopt)))));
 }
 
 TEST_F(SkottieMRUResourceProviderTest, HandlesIncompleteDimensions) {
@@ -210,7 +210,7 @@
           FieldsAre(base::FilePath(FILE_PATH_LITERAL(
                                        "test-resource-path/test-resource-name"))
                         .NormalizePathSeparators(),
-                    Eq(absl::nullopt)))));
+                    Eq(std::nullopt)))));
 
   Init(R"({
       "assets": [
@@ -229,7 +229,7 @@
           FieldsAre(base::FilePath(FILE_PATH_LITERAL(
                                        "test-resource-path/test-resource-name"))
                         .NormalizePathSeparators(),
-                    Eq(absl::nullopt)))));
+                    Eq(std::nullopt)))));
 }
 
 TEST_F(SkottieMRUResourceProviderTest, HandlesInvalidDimensions) {
@@ -250,7 +250,7 @@
           FieldsAre(base::FilePath(FILE_PATH_LITERAL(
                                        "test-resource-path/test-resource-name"))
                         .NormalizePathSeparators(),
-                    Eq(absl::nullopt)))));
+                    Eq(std::nullopt)))));
 
   Init(R"({
       "assets": [
@@ -269,7 +269,7 @@
           FieldsAre(base::FilePath(FILE_PATH_LITERAL(
                                        "test-resource-path/test-resource-name"))
                         .NormalizePathSeparators(),
-                    Eq(absl::nullopt)))));
+                    Eq(std::nullopt)))));
 }
 
 TEST_F(SkottieMRUResourceProviderTest, GracefullyHandlesInvalidJson) {
diff --git a/cc/paint/skottie_resource_metadata.cc b/cc/paint/skottie_resource_metadata.cc
index f4eeb8a..03944cd 100644
--- a/cc/paint/skottie_resource_metadata.cc
+++ b/cc/paint/skottie_resource_metadata.cc
@@ -15,7 +15,7 @@
 
 SkottieResourceMetadataMap::ImageAssetMetadata::ImageAssetMetadata(
     base::FilePath resource_path_in,
-    absl::optional<gfx::Size> size_in)
+    std::optional<gfx::Size> size_in)
     : resource_path(std::move(resource_path_in)), size(std::move(size_in)) {}
 
 SkottieResourceMetadataMap::SkottieResourceMetadataMap() = default;
@@ -31,7 +31,7 @@
 bool SkottieResourceMetadataMap::RegisterAsset(base::StringPiece resource_path,
                                                base::StringPiece resource_name,
                                                base::StringPiece resource_id,
-                                               absl::optional<gfx::Size> size) {
+                                               std::optional<gfx::Size> size) {
   DCHECK(!size || !size->IsEmpty());
   if (resource_id.empty()) {
     LOG(ERROR) << "Skottie animation has asset with empty resource_id";
diff --git a/cc/paint/skottie_resource_metadata.h b/cc/paint/skottie_resource_metadata.h
index c81405a..2cb92cb 100644
--- a/cc/paint/skottie_resource_metadata.h
+++ b/cc/paint/skottie_resource_metadata.h
@@ -7,12 +7,12 @@
 
 #include <string>
 
+#include <optional>
 #include "base/containers/flat_map.h"
 #include "base/files/file_path.h"
 #include "base/strings/string_piece.h"
 #include "base/types/id_type.h"
 #include "cc/paint/paint_export.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace cc {
@@ -24,12 +24,12 @@
   // Metadata for a single image asset.
   struct ImageAssetMetadata {
     ImageAssetMetadata(base::FilePath resource_path_in,
-                       absl::optional<gfx::Size> size_in);
+                       std::optional<gfx::Size> size_in);
 
     base::FilePath resource_path;
     // May be null if asset's dimensions are not specified in the animation
     // file.
-    absl::optional<gfx::Size> size;
+    std::optional<gfx::Size> size;
   };
 
   using Storage =
@@ -46,7 +46,7 @@
   bool RegisterAsset(base::StringPiece resource_path,
                      base::StringPiece resource_name,
                      base::StringPiece resource_id,
-                     absl::optional<gfx::Size> size);
+                     std::optional<gfx::Size> size);
 
   const Storage& asset_storage() const { return asset_storage_; }
 
diff --git a/cc/paint/skottie_resource_metadata_unittest.cc b/cc/paint/skottie_resource_metadata_unittest.cc
index 3597800..4085917 100644
--- a/cc/paint/skottie_resource_metadata_unittest.cc
+++ b/cc/paint/skottie_resource_metadata_unittest.cc
@@ -27,7 +27,7 @@
                                  "test-resource-id-1", gfx::Size(100, 100)));
   ASSERT_TRUE(resource_map.RegisterAsset("test-resource-path-2",
                                          "test-resource-name-2",
-                                         "test-resource-id-2", absl::nullopt));
+                                         "test-resource-id-2", std::nullopt));
   EXPECT_THAT(
       resource_map.asset_storage(),
       UnorderedElementsAre(
@@ -42,7 +42,7 @@
                              FILE_PATH_LITERAL(
                                  "test-resource-path-2/test-resource-name-2"))
                              .NormalizePathSeparators(),
-                         Eq(absl::nullopt)))));
+                         Eq(std::nullopt)))));
 }
 
 TEST(SkottieResourceMetadataTest,
@@ -50,10 +50,10 @@
   SkottieResourceMetadataMap resource_map;
   ASSERT_TRUE(resource_map.RegisterAsset("test-resource-path-1",
                                          "test-resource-name-1",
-                                         "test-resource-id-1", absl::nullopt));
+                                         "test-resource-id-1", std::nullopt));
   EXPECT_FALSE(resource_map.RegisterAsset("test-resource-path-2",
                                           "test-resource-name-2",
-                                          "test-resource-id-1", absl::nullopt));
+                                          "test-resource-id-1", std::nullopt));
 }
 
 TEST(SkottieResourceMetadataTest,
@@ -61,7 +61,7 @@
   SkottieResourceMetadataMap resource_map;
   EXPECT_FALSE(resource_map.RegisterAsset("test-resource-path",
                                           "test-resource-name",
-                                          /*resource_id=*/"", absl::nullopt));
+                                          /*resource_id=*/"", std::nullopt));
 }
 
 TEST(SkottieResourceMetadataTest,
@@ -69,7 +69,7 @@
   SkottieResourceMetadataMap resource_map;
   EXPECT_FALSE(resource_map.RegisterAsset("test-resource-path",
                                           "/absolute-resource-name",
-                                          /*resource_id=*/"", absl::nullopt));
+                                          /*resource_id=*/"", std::nullopt));
 }
 
 TEST(SkottieResourceMetadataTest, HashSkottieResourceIdReturnsMatchingHashes) {
diff --git a/cc/paint/solid_color_analyzer.cc b/cc/paint/solid_color_analyzer.cc
index e06032d..7170e090 100644
--- a/cc/paint/solid_color_analyzer.cc
+++ b/cc/paint/solid_color_analyzer.cc
@@ -218,7 +218,7 @@
 
 }  // namespace
 
-absl::optional<SkColor4f> SolidColorAnalyzer::DetermineIfSolidColor(
+std::optional<SkColor4f> SolidColorAnalyzer::DetermineIfSolidColor(
     const PaintOpBuffer& buffer,
     const gfx::Rect& rect,
     int max_ops_to_analyze,
@@ -283,11 +283,11 @@
       case PaintOpType::kDrawline:
       case PaintOpType::kDrawoval:
       case PaintOpType::kDrawpath:
-        return absl::nullopt;
+        return std::nullopt;
       // TODO(vmpstr): Add more tests on exceeding max_ops_to_analyze.
       case PaintOpType::kDrawrrect: {
         if (++num_draw_ops > max_ops_to_analyze)
-          return absl::nullopt;
+          return std::nullopt;
         const auto& rrect_op = static_cast<const DrawRRectOp&>(op);
         CheckIfSolidShape(canvas, rrect_op.rrect, rrect_op.flags, &is_solid,
                           &is_transparent, &color);
@@ -305,7 +305,7 @@
       // cover the canvas.
       // TODO(vmpstr): We could investigate handling these.
       case PaintOpType::kClippath:
-        return absl::nullopt;
+        return std::nullopt;
       case PaintOpType::kCliprrect: {
         const auto& rrect_op = static_cast<const ClipRRectOp&>(op);
         bool does_cover_canvas =
@@ -313,12 +313,12 @@
         // If the clip covers the full canvas, we can treat it as if there's no
         // clip at all and continue, otherwise this is no longer a solid color.
         if (!does_cover_canvas)
-          return absl::nullopt;
+          return std::nullopt;
         break;
       }
       case PaintOpType::kDrawrect: {
         if (++num_draw_ops > max_ops_to_analyze)
-          return absl::nullopt;
+          return std::nullopt;
         const auto& rect_op = static_cast<const DrawRectOp&>(op);
         CheckIfSolidShape(canvas, rect_op.rect, rect_op.flags, &is_solid,
                           &is_transparent, &color);
@@ -326,7 +326,7 @@
       }
       case PaintOpType::kDrawcolor: {
         if (++num_draw_ops > max_ops_to_analyze)
-          return absl::nullopt;
+          return std::nullopt;
         const auto& color_op = static_cast<const DrawColorOp&>(op);
         CheckIfSolidColor(canvas, color_op.color, color_op.mode, &is_solid,
                           &is_transparent, &color);
@@ -339,7 +339,7 @@
         // a rect, this is no longer solid color.
         const auto& clip_op = static_cast<const ClipRectOp&>(op);
         if (clip_op.op == SkClipOp::kDifference)
-          return absl::nullopt;
+          return std::nullopt;
         op.Raster(&canvas, params);
         break;
       }
@@ -369,7 +369,7 @@
     return SkColors::kTransparent;
   if (is_solid)
     return color;
-  return absl::nullopt;
+  return std::nullopt;
 }
 
 }  // namespace cc
diff --git a/cc/paint/solid_color_analyzer.h b/cc/paint/solid_color_analyzer.h
index a43dae0..fd3fb6e 100644
--- a/cc/paint/solid_color_analyzer.h
+++ b/cc/paint/solid_color_analyzer.h
@@ -7,9 +7,9 @@
 
 #include <vector>
 
+#include <optional>
 #include "cc/paint/paint_export.h"
 #include "cc/paint/paint_flags.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/skia_conversions.h"
 
@@ -20,7 +20,7 @@
  public:
   SolidColorAnalyzer() = delete;
 
-  static absl::optional<SkColor4f> DetermineIfSolidColor(
+  static std::optional<SkColor4f> DetermineIfSolidColor(
       const PaintOpBuffer& buffer,
       const gfx::Rect& rect,
       int max_ops_to_analyze,
diff --git a/cc/paint/solid_color_analyzer_unittest.cc b/cc/paint/solid_color_analyzer_unittest.cc
index 07bae36..7835518a 100644
--- a/cc/paint/solid_color_analyzer_unittest.cc
+++ b/cc/paint/solid_color_analyzer_unittest.cc
@@ -4,13 +4,13 @@
 
 #include "cc/paint/solid_color_analyzer.h"
 
+#include <optional>
 #include "base/memory/ref_counted.h"
 #include "build/build_config.h"
 #include "cc/paint/display_item_list.h"
 #include "cc/paint/paint_filter.h"
 #include "cc/paint/record_paint_canvas.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/skia_conversions.h"
 
 namespace cc {
@@ -39,7 +39,7 @@
   RecordPaintCanvas canvas_;
 
  private:
-  absl::optional<SolidColorAnalyzer> analyzer_;
+  std::optional<SolidColorAnalyzer> analyzer_;
 };
 
 TEST_F(SolidColorAnalyzerTest, Empty) {
diff --git a/cc/paint/target_color_params.h b/cc/paint/target_color_params.h
index 8931fa3f..5dc4fcd 100644
--- a/cc/paint/target_color_params.h
+++ b/cc/paint/target_color_params.h
@@ -7,8 +7,8 @@
 
 #include <string>
 
+#include <optional>
 #include "cc/paint/paint_export.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/color_space.h"
 #include "ui/gfx/hdr_metadata.h"
 
diff --git a/cc/raster/categorized_worker_pool.cc b/cc/raster/categorized_worker_pool.cc
index b869938f..8a016a7 100644
--- a/cc/raster/categorized_worker_pool.cc
+++ b/cc/raster/categorized_worker_pool.cc
@@ -515,7 +515,7 @@
 
 void CategorizedWorkerPoolJob::Run(base::span<const TaskCategory> categories,
                                    base::JobDelegate* job_delegate) {
-  absl::optional<TaskGraphWorkQueue::PrioritizedTask> prioritized_task;
+  std::optional<TaskGraphWorkQueue::PrioritizedTask> prioritized_task;
 
   while (!job_delegate->ShouldYield()) {
     base::JobHandle* job_handle_to_notify = nullptr;
@@ -563,7 +563,7 @@
   }
 }
 
-absl::optional<TaskGraphWorkQueue::PrioritizedTask>
+std::optional<TaskGraphWorkQueue::PrioritizedTask>
 CategorizedWorkerPoolJob::GetNextTaskToRunWithLockAcquired(
     base::span<const TaskCategory> categories) {
   lock_.AssertAcquired();
@@ -572,7 +572,7 @@
       return work_queue_.GetNextTaskToRun(category);
     }
   }
-  return absl::nullopt;
+  return std::nullopt;
 }
 
 void CategorizedWorkerPoolJob::FlushForTesting() {
diff --git a/cc/raster/categorized_worker_pool.h b/cc/raster/categorized_worker_pool.h
index 3334497e..0a19bae 100644
--- a/cc/raster/categorized_worker_pool.h
+++ b/cc/raster/categorized_worker_pool.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <vector>
 
+#include <optional>
 #include "base/containers/span.h"
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
@@ -22,7 +23,6 @@
 #include "cc/raster/task_category.h"
 #include "cc/raster/task_graph_runner.h"
 #include "cc/raster/task_graph_work_queue.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -209,7 +209,7 @@
  private:
   ~CategorizedWorkerPoolJob() override;
 
-  absl::optional<TaskGraphWorkQueue::PrioritizedTask>
+  std::optional<TaskGraphWorkQueue::PrioritizedTask>
   GetNextTaskToRunWithLockAcquired(base::span<const TaskCategory> categories);
 
   base::JobHandle* ScheduleTasksWithLockAcquired(NamespaceToken token,
diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc
index e79d8b8..4e6ef4f6 100644
--- a/cc/raster/gpu_raster_buffer_provider.cc
+++ b/cc/raster/gpu_raster_buffer_provider.cc
@@ -162,7 +162,7 @@
 
 #if BUILDFLAG(IS_ANDROID)
   {
-    absl::optional<viz::RasterContextProvider::ScopedRasterContextLock> lock;
+    std::optional<viz::RasterContextProvider::ScopedRasterContextLock> lock;
     lock.emplace(worker_context_provider);
     auto is_using_vulkan =
         worker_context_provider->ContextCapabilities().using_vulkan_context;
@@ -349,7 +349,7 @@
   }
 
   {
-    absl::optional<base::ElapsedTimer> timer;
+    std::optional<base::ElapsedTimer> timer;
     if (measure_raster_metric)
       timer.emplace();
     RasterizeSource(raster_source, raster_full_rect, playback_rect, transform,
diff --git a/cc/raster/playback_image_provider.cc b/cc/raster/playback_image_provider.cc
index 220ba65..5b6a24fb 100644
--- a/cc/raster/playback_image_provider.cc
+++ b/cc/raster/playback_image_provider.cc
@@ -22,7 +22,7 @@
 PlaybackImageProvider::PlaybackImageProvider(
     ImageDecodeCache* cache,
     const TargetColorParams& target_color_params,
-    absl::optional<Settings>&& settings)
+    std::optional<Settings>&& settings)
     : cache_(cache),
       target_color_params_(target_color_params),
       settings_(std::move(settings)) {
diff --git a/cc/raster/playback_image_provider.h b/cc/raster/playback_image_provider.h
index 84c7cb1e..26d6f889 100644
--- a/cc/raster/playback_image_provider.h
+++ b/cc/raster/playback_image_provider.h
@@ -44,7 +44,7 @@
   // If no settings are provided, all images are skipped during rasterization.
   PlaybackImageProvider(ImageDecodeCache* cache,
                         const TargetColorParams& target_color_params,
-                        absl::optional<Settings>&& settings);
+                        std::optional<Settings>&& settings);
   PlaybackImageProvider(const PlaybackImageProvider&) = delete;
   PlaybackImageProvider(PlaybackImageProvider&& other);
   ~PlaybackImageProvider() override;
@@ -61,7 +61,7 @@
   // #union
   RAW_PTR_EXCLUSION ImageDecodeCache* cache_;
   TargetColorParams target_color_params_;
-  absl::optional<Settings> settings_;
+  std::optional<Settings> settings_;
 };
 
 }  // namespace cc
diff --git a/cc/raster/playback_image_provider_unittest.cc b/cc/raster/playback_image_provider_unittest.cc
index 7d17ce77..0fb3eeb 100644
--- a/cc/raster/playback_image_provider_unittest.cc
+++ b/cc/raster/playback_image_provider_unittest.cc
@@ -75,7 +75,7 @@
 
 TEST(PlaybackImageProviderTest, SkipsAllImages) {
   MockDecodeCache cache;
-  PlaybackImageProvider provider(&cache, TargetColorParams(), absl::nullopt);
+  PlaybackImageProvider provider(&cache, TargetColorParams(), std::nullopt);
 
   SkIRect rect = SkIRect::MakeWH(10, 10);
   SkM44 matrix = SkM44();
@@ -98,7 +98,7 @@
   MockDecodeCache cache;
   PaintImage skip_image = CreateDiscardablePaintImage(gfx::Size(10, 10));
 
-  absl::optional<PlaybackImageProvider::Settings> settings;
+  std::optional<PlaybackImageProvider::Settings> settings;
   settings.emplace();
   settings->images_to_skip = {skip_image.stable_id()};
 
@@ -115,7 +115,7 @@
 TEST(PlaybackImageProviderTest, RefAndUnrefDecode) {
   MockDecodeCache cache;
 
-  absl::optional<PlaybackImageProvider::Settings> settings;
+  std::optional<PlaybackImageProvider::Settings> settings;
   settings.emplace();
   PlaybackImageProvider provider(&cache, TargetColorParams(),
                                  std::move(settings));
@@ -143,7 +143,7 @@
 
   base::flat_map<PaintImage::Id, size_t> image_to_frame;
   image_to_frame[image.stable_id()] = 1u;
-  absl::optional<PlaybackImageProvider::Settings> settings;
+  std::optional<PlaybackImageProvider::Settings> settings;
   settings.emplace();
   settings->image_to_current_frame_index = image_to_frame;
 
@@ -163,7 +163,7 @@
 TEST(PlaybackImageProviderTest, BitmapImages) {
   MockDecodeCache cache;
 
-  absl::optional<PlaybackImageProvider::Settings> settings;
+  std::optional<PlaybackImageProvider::Settings> settings;
   settings.emplace();
   PlaybackImageProvider provider(&cache, TargetColorParams(),
                                  std::move(settings));
@@ -186,7 +186,7 @@
 TEST(PlaybackImageProviderTest, IgnoresImagesNotSupportedByCache) {
   MockDecodeCache cache;
   cache.set_use_cache_for_draw_image(false);
-  absl::optional<PlaybackImageProvider::Settings> settings;
+  std::optional<PlaybackImageProvider::Settings> settings;
   settings.emplace();
   PlaybackImageProvider provider(&cache, TargetColorParams(),
                                  std::move(settings));
diff --git a/cc/raster/raster_buffer_provider_unittest.cc b/cc/raster/raster_buffer_provider_unittest.cc
index 6e18be8..0c34fe0 100644
--- a/cc/raster/raster_buffer_provider_unittest.cc
+++ b/cc/raster/raster_buffer_provider_unittest.cc
@@ -321,7 +321,7 @@
       return;
     }
 
-    absl::optional<viz::RasterContextProvider::ScopedRasterContextLock> lock;
+    std::optional<viz::RasterContextProvider::ScopedRasterContextLock> lock;
     if (use_lock) {
       lock.emplace(context_provider);
     }
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
index be5f90ca..ea5f62b 100644
--- a/cc/scheduler/scheduler_unittest.cc
+++ b/cc/scheduler/scheduler_unittest.cc
@@ -295,7 +295,7 @@
   std::vector<const char*> actions_;
   raw_ptr<TestScheduler, DanglingUntriaged> scheduler_ = nullptr;
   base::TimeDelta frame_interval_;
-  absl::optional<FrameSkippedReason> last_frame_skipped_reason_;
+  std::optional<FrameSkippedReason> last_frame_skipped_reason_;
 };
 
 enum BeginFrameSourceType {
@@ -333,7 +333,7 @@
   void RunTasksWhile(base::RepeatingCallback<bool()> condition) {
     run_condition_ = condition;
     FastForwardUntilNoTasksRemain();
-    run_condition_ = absl::nullopt;
+    run_condition_ = std::nullopt;
     // We've moved all the pending tasks away to break the execution loop,
     // now we should restore them.
     while (!tasks_to_requeue_.empty()) {
@@ -359,7 +359,7 @@
   ~SchedulerTestTaskRunner() override = default;  // Ref-counted.
 
   size_t task_count_ = 0u;
-  absl::optional<base::RepeatingCallback<bool()>> run_condition_;
+  std::optional<base::RepeatingCallback<bool()>> run_condition_;
   base::circular_deque<base::TestPendingTask> tasks_to_requeue_;
 };
 
diff --git a/cc/slim/delayer_scheduler_unittest.cc b/cc/slim/delayer_scheduler_unittest.cc
index 945a7df2..3873cb9 100644
--- a/cc/slim/delayer_scheduler_unittest.cc
+++ b/cc/slim/delayer_scheduler_unittest.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <optional>
 #include "cc/slim/delayed_scheduler.h"
 #include "cc/slim/scheduler.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc::slim {
 
@@ -28,12 +28,12 @@
   }
 
   void SetDoBeginFrameResult(bool result) { do_begin_frame_result_ = result; }
-  absl::optional<viz::BeginFrameArgs> TakeLastDoBeginFrameArgs() {
+  std::optional<viz::BeginFrameArgs> TakeLastDoBeginFrameArgs() {
     auto rv = last_do_begin_frame_args_;
     last_do_begin_frame_args_.reset();
     return rv;
   }
-  absl::optional<viz::BeginFrameArgs> TakeLastDidNotProduceFrameArgs() {
+  std::optional<viz::BeginFrameArgs> TakeLastDidNotProduceFrameArgs() {
     auto rv = last_did_not_produce_frame_args_;
     last_did_not_produce_frame_args_.reset();
     return rv;
@@ -41,8 +41,8 @@
 
  private:
   const raw_ptr<Scheduler> scheduler_;
-  absl::optional<viz::BeginFrameArgs> last_do_begin_frame_args_;
-  absl::optional<viz::BeginFrameArgs> last_did_not_produce_frame_args_;
+  std::optional<viz::BeginFrameArgs> last_do_begin_frame_args_;
+  std::optional<viz::BeginFrameArgs> last_did_not_produce_frame_args_;
   bool do_begin_frame_result_ = false;
 };
 
diff --git a/cc/slim/frame_data.h b/cc/slim/frame_data.h
index 3c082f46..e7f4981 100644
--- a/cc/slim/frame_data.h
+++ b/cc/slim/frame_data.h
@@ -7,12 +7,12 @@
 
 #include <vector>
 
+#include <optional>
 #include "base/containers/flat_set.h"
 #include "base/memory/raw_ref.h"
 #include "cc/base/simple_enclosed_region.h"
 #include "cc/slim/damage_data.h"
 #include "components/viz/common/surfaces/surface_id.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/mask_filter_info.h"
 
 namespace viz {
@@ -32,7 +32,7 @@
   const raw_ref<std::vector<viz::HitTestRegion>, ExperimentalAsh>
       hit_test_regions;
   base::flat_set<viz::SurfaceId> activation_dependencies;
-  absl::optional<uint32_t> deadline_in_frames;
+  std::optional<uint32_t> deadline_in_frames;
   bool use_default_lower_bound_deadline = false;
 
   // These fields are for a particular render pass (ie target) and the
diff --git a/cc/slim/frame_sink_impl.cc b/cc/slim/frame_sink_impl.cc
index 061337c..d6410b8a 100644
--- a/cc/slim/frame_sink_impl.cc
+++ b/cc/slim/frame_sink_impl.cc
@@ -327,7 +327,7 @@
         });
     frame_sink_->SubmitCompositorFrame(
         local_surface_id_, std::move(frame),
-        send_new_hit_test_region_list ? hit_test_region_list_ : absl::nullopt,
+        send_new_hit_test_region_list ? hit_test_region_list_ : std::nullopt,
         0);
   }
   num_unacked_frames_++;
diff --git a/cc/slim/frame_sink_impl.h b/cc/slim/frame_sink_impl.h
index dce4a416..c66c727 100644
--- a/cc/slim/frame_sink_impl.h
+++ b/cc/slim/frame_sink_impl.h
@@ -9,6 +9,7 @@
 #include <string>
 #include <vector>
 
+#include <optional>
 #include "base/component_export.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
@@ -32,7 +33,6 @@
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "services/viz/public/mojom/compositing/compositor_frame_sink.mojom.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc::slim {
 
@@ -146,7 +146,7 @@
   UploadedResourceMap uploaded_resources_;
   viz::ClientResourceProvider resource_provider_;
   // Last `HitTestRegionList` sent to viz.
-  absl::optional<viz::HitTestRegionList> hit_test_region_list_;
+  std::optional<viz::HitTestRegionList> hit_test_region_list_;
   base::PlatformThreadId io_thread_id_;
 
   viz::LocalSurfaceId last_submitted_local_surface_id_;
diff --git a/cc/slim/layer.cc b/cc/slim/layer.cc
index c95d2219..50c2fd8 100644
--- a/cc/slim/layer.cc
+++ b/cc/slim/layer.cc
@@ -466,12 +466,12 @@
   return transform;
 }
 
-absl::optional<gfx::Transform> Layer::ComputeTransformFromParent() const {
+std::optional<gfx::Transform> Layer::ComputeTransformFromParent() const {
   // TODO(crbug.com/1408128): Consider caching this result since GetInverse
   // may be expensive.
   gfx::Transform inverse_transform;
   if (!transform_.GetInverse(&inverse_transform)) {
-    return absl::nullopt;
+    return std::nullopt;
   }
   // TransformFromParent is:
   // transform_origin x inverse_transform x -transform_origin x -position
@@ -528,7 +528,7 @@
       render_pass.CreateAndAppendSharedQuadState();
   const gfx::Rect layer_rect{bounds()};
   DCHECK(layer_rect.Contains(visible_rect));
-  absl::optional<gfx::Rect> clip_opt;
+  std::optional<gfx::Rect> clip_opt;
   if (clip_in_target) {
     clip_opt = *clip_in_target;
   }
diff --git a/cc/slim/layer.h b/cc/slim/layer.h
index ec4bff3..5b6a582 100644
--- a/cc/slim/layer.h
+++ b/cc/slim/layer.h
@@ -7,6 +7,7 @@
 
 #include <vector>
 
+#include <optional>
 #include "base/component_export.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/ref_counted.h"
@@ -14,7 +15,6 @@
 #include "cc/paint/filter_operations.h"
 #include "cc/slim/filter.h"
 #include "cc/slim/frame_data.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/linear_gradient.h"
 #include "ui/gfx/geometry/point3_f.h"
@@ -224,7 +224,7 @@
 
   // Called by LayerTree.
   gfx::Transform ComputeTransformToParent() const;
-  absl::optional<gfx::Transform> ComputeTransformFromParent() const;
+  std::optional<gfx::Transform> ComputeTransformFromParent() const;
   bool HasFilters() const;
   cc::FilterOperations GetFilters() const;
   bool HasNonTrivialMaskFilterInfo() const;
diff --git a/cc/slim/layer_tree_cc_wrapper.h b/cc/slim/layer_tree_cc_wrapper.h
index 7bada0b..85809c3 100644
--- a/cc/slim/layer_tree_cc_wrapper.h
+++ b/cc/slim/layer_tree_cc_wrapper.h
@@ -67,7 +67,7 @@
   void OnDeferCommitsChanged(
       bool,
       cc::PaintHoldingReason,
-      absl::optional<cc::PaintHoldingCommitTrigger>) override {}
+      std::optional<cc::PaintHoldingCommitTrigger>) override {}
   void OnCommitRequested() override {}
   void BeginMainFrameNotExpectedSoon() override {}
   void BeginMainFrameNotExpectedUntil(base::TimeTicks time) override {}
diff --git a/cc/slim/layer_tree_impl.cc b/cc/slim/layer_tree_impl.cc
index f25cbea..a92f80e3 100644
--- a/cc/slim/layer_tree_impl.cc
+++ b/cc/slim/layer_tree_impl.cc
@@ -516,7 +516,7 @@
           background_opaque && unoccluded_region.GetRegionComplexity() <= 1;
       quad_state->SetAll(gfx::Transform(), gutter_bounding_rect,
                          gutter_bounding_rect, gfx::MaskFilterInfo(),
-                         /*clip=*/absl::nullopt, contents_opaque,
+                         /*clip=*/std::nullopt, contents_opaque,
                          /*opacity_f=*/1.0f, SkBlendMode::kSrcOver,
                          /*sorting_context=*/0, /*layer_id=*/0u,
                          /*fast_rounded_corner=*/false);
@@ -573,7 +573,7 @@
     return;
   }
 
-  absl::optional<gfx::Transform> transform_from_parent =
+  std::optional<gfx::Transform> transform_from_parent =
       layer.ComputeTransformFromParent();
   // If a 2d transform isn't invertible, then it must map the whole 2d space to
   // a single line or pointer, neither is visible.
@@ -747,7 +747,7 @@
   // Any clip introduced by this layer is already applied by the bounds of the
   // new pass, so only need to apply any clips in parents target that came
   // from parent.
-  absl::optional<gfx::Rect> clip_opt;
+  std::optional<gfx::Rect> clip_opt;
   if (parent_clip_in_target) {
     clip_opt = gfx::ToEnclosingRect(*parent_clip_in_target);
   }
@@ -799,7 +799,7 @@
   const bool subtree_property_changed =
       layer.GetAndResetSubtreePropertyChanged() ||
       data.subtree_property_changed_from_parent;
-  absl::optional<base::AutoReset<gfx::MaskFilterInfo>>
+  std::optional<base::AutoReset<gfx::MaskFilterInfo>>
       auto_reset_mask_filter_info;
   if (layer.HasNonTrivialMaskFilterInfo()) {
     gfx::MaskFilterInfo info(gfx::RRectF(gfx::RectF(gfx::Rect(layer.bounds())),
diff --git a/cc/slim/layer_tree_impl.h b/cc/slim/layer_tree_impl.h
index 79b6b84..42f393b 100644
--- a/cc/slim/layer_tree_impl.h
+++ b/cc/slim/layer_tree_impl.h
@@ -11,6 +11,7 @@
 #include <utility>
 #include <vector>
 
+#include <optional>
 #include "base/component_export.h"
 #include "base/containers/circular_deque.h"
 #include "base/functional/callback.h"
@@ -26,7 +27,6 @@
 #include "components/viz/common/surfaces/child_local_surface_id_allocator.h"
 #include "components/viz/common/surfaces/local_surface_id.h"
 #include "components/viz/common/surfaces/surface_range.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/rect_f.h"
@@ -212,7 +212,7 @@
   gfx::Rect device_viewport_rect_;
   float device_scale_factor_ = 1.0f;
   SkColor4f background_color_ = SkColors::kWhite;
-  absl::optional<float> top_controls_visible_height_;
+  std::optional<float> top_controls_visible_height_;
   SurfaceRangesAndCounts referenced_surfaces_;
   viz::FrameTokenGenerator next_frame_token_;
   gfx::OverlayTransform display_transform_hint_ = gfx::OVERLAY_TRANSFORM_NONE;
diff --git a/cc/slim/slim_layer_tree_compositor_frame_unittest.cc b/cc/slim/slim_layer_tree_compositor_frame_unittest.cc
index 0759032..749b0fd 100644
--- a/cc/slim/slim_layer_tree_compositor_frame_unittest.cc
+++ b/cc/slim/slim_layer_tree_compositor_frame_unittest.cc
@@ -77,7 +77,7 @@
   }
 
   viz::CompositorFrame ProduceFrame(
-      absl::optional<viz::HitTestRegionList>* out_list = nullptr) {
+      std::optional<viz::HitTestRegionList>* out_list = nullptr) {
     layer_tree_->SetNeedsRedraw();
     EXPECT_TRUE(layer_tree_->NeedsBeginFrames());
     base::TimeTicks frame_time = base::TimeTicks::Now();
@@ -147,7 +147,7 @@
     EXPECT_EQ(1.0f, metadata.device_scale_factor);
     EXPECT_EQ(SkColors::kWhite, metadata.root_background_color);
     EXPECT_EQ(gfx::OVERLAY_TRANSFORM_NONE, metadata.display_transform_hint);
-    EXPECT_EQ(absl::nullopt, metadata.top_controls_visible_height);
+    EXPECT_EQ(std::nullopt, metadata.top_controls_visible_height);
   }
 
   IncrementLocalSurfaceId();
@@ -194,7 +194,7 @@
 
   EXPECT_EQ(shared_quad_state->quad_layer_rect, viewport_);
   EXPECT_EQ(shared_quad_state->visible_quad_layer_rect, viewport_);
-  EXPECT_EQ(shared_quad_state->clip_rect, absl::nullopt);
+  EXPECT_EQ(shared_quad_state->clip_rect, std::nullopt);
   EXPECT_EQ(shared_quad_state->are_contents_opaque, true);
   EXPECT_EQ(shared_quad_state->blend_mode, SkBlendMode::kSrcOver);
 }
@@ -344,8 +344,8 @@
       CreateSolidColorLayer(viewport_.size(), SkColors::kGray);
   layer_tree_->SetRoot(solid_color_layer);
 
-  absl::optional<gfx::PresentationFeedback> feedback_opt_1;
-  absl::optional<gfx::PresentationFeedback> feedback_opt_2;
+  std::optional<gfx::PresentationFeedback> feedback_opt_1;
+  std::optional<gfx::PresentationFeedback> feedback_opt_2;
   layer_tree_->RequestPresentationTimeForNextFrame(base::BindLambdaForTesting(
       [&](const gfx::PresentationFeedback& feedback) {
         feedback_opt_1 = feedback;
@@ -373,14 +373,14 @@
       CreateSolidColorLayer(viewport_.size(), SkColors::kGray);
   layer_tree_->SetRoot(solid_color_layer);
 
-  absl::optional<gfx::PresentationFeedback> feedback_opt_1;
+  std::optional<gfx::PresentationFeedback> feedback_opt_1;
   layer_tree_->RequestPresentationTimeForNextFrame(base::BindLambdaForTesting(
       [&](const gfx::PresentationFeedback& feedback) {
         feedback_opt_1 = feedback;
       }));
   viz::CompositorFrame frame1 = ProduceFrame();
 
-  absl::optional<gfx::PresentationFeedback> feedback_opt_2;
+  std::optional<gfx::PresentationFeedback> feedback_opt_2;
   layer_tree_->RequestPresentationTimeForNextFrame(base::BindLambdaForTesting(
       [&](const gfx::PresentationFeedback& feedback) {
         feedback_opt_2 = feedback;
@@ -421,8 +421,8 @@
       CreateSolidColorLayer(viewport_.size(), SkColors::kGray);
   layer_tree_->SetRoot(solid_color_layer);
 
-  absl::optional<base::TimeTicks> feedback_time_opt_1;
-  absl::optional<base::TimeTicks> feedback_time_opt_2;
+  std::optional<base::TimeTicks> feedback_time_opt_1;
+  std::optional<base::TimeTicks> feedback_time_opt_2;
   layer_tree_->RequestSuccessfulPresentationTimeForNextFrame(
       base::BindLambdaForTesting(
           [&](base::TimeTicks timeticks) { feedback_time_opt_1 = timeticks; }));
@@ -451,14 +451,14 @@
       CreateSolidColorLayer(viewport_.size(), SkColors::kGray);
   layer_tree_->SetRoot(solid_color_layer);
 
-  absl::optional<base::TimeTicks> feedback_time_opt_1;
+  std::optional<base::TimeTicks> feedback_time_opt_1;
   layer_tree_->RequestSuccessfulPresentationTimeForNextFrame(
       base::BindLambdaForTesting(
           [&](base::TimeTicks timeticks) { feedback_time_opt_1 = timeticks; }));
   viz::CompositorFrame frame1 = ProduceFrame();
   viz::CompositorFrame frame2 = ProduceFrame();
 
-  absl::optional<base::TimeTicks> feedback_time_opt_2;
+  std::optional<base::TimeTicks> feedback_time_opt_2;
   layer_tree_->RequestSuccessfulPresentationTimeForNextFrame(
       base::BindLambdaForTesting(
           [&](base::TimeTicks timeticks) { feedback_time_opt_2 = timeticks; }));
@@ -879,7 +879,7 @@
         cc::DeadlinePolicy::UseDefaultDeadline();
     surface_layer->SetSurfaceId(surface_id, deadline_policy);
 
-    absl::optional<viz::HitTestRegionList> hit_test_region_list;
+    std::optional<viz::HitTestRegionList> hit_test_region_list;
     viz::CompositorFrame frame = ProduceFrame(&hit_test_region_list);
     ASSERT_TRUE(hit_test_region_list);
     EXPECT_EQ(hit_test_region_list->bounds, viewport_);
@@ -908,7 +908,7 @@
   child_surface_layer->SetSurfaceId(surface_id, deadline_policy);
 
   {
-    absl::optional<viz::HitTestRegionList> hit_test_region_list;
+    std::optional<viz::HitTestRegionList> hit_test_region_list;
     viz::CompositorFrame frame = ProduceFrame(&hit_test_region_list);
 
     ASSERT_TRUE(hit_test_region_list);
@@ -962,7 +962,7 @@
   filter_layer->AddChild(surface_layer);
 
   {
-    absl::optional<viz::HitTestRegionList> hit_test_region_list;
+    std::optional<viz::HitTestRegionList> hit_test_region_list;
     viz::CompositorFrame frame = ProduceFrame(&hit_test_region_list);
     ASSERT_TRUE(hit_test_region_list);
     EXPECT_EQ(hit_test_region_list->bounds, viewport_);
@@ -1105,7 +1105,7 @@
   auto* shared_quad_state = render_pass_quad->shared_quad_state;
   EXPECT_EQ(shared_quad_state->quad_layer_rect, gfx::Rect(50, 50));
   EXPECT_EQ(shared_quad_state->visible_quad_layer_rect, gfx::Rect(50, 50));
-  EXPECT_EQ(shared_quad_state->clip_rect, absl::nullopt);
+  EXPECT_EQ(shared_quad_state->clip_rect, std::nullopt);
 }
 
 TEST_F(SlimLayerTreeCompositorFrameTest, ChildPassOutputRect) {
@@ -1174,7 +1174,7 @@
     EXPECT_EQ(shared_quad_state->quad_layer_rect, gfx::Rect(20, 20, 30, 30));
     EXPECT_EQ(shared_quad_state->visible_quad_layer_rect,
               gfx::Rect(20, 20, 30, 30));
-    EXPECT_EQ(shared_quad_state->clip_rect, absl::nullopt);
+    EXPECT_EQ(shared_quad_state->clip_rect, std::nullopt);
   }
 }
 
@@ -1239,7 +1239,7 @@
     auto* shared_quad_state = render_pass_quad->shared_quad_state;
     EXPECT_EQ(shared_quad_state->quad_layer_rect, gfx::Rect(40, 40));
     EXPECT_EQ(shared_quad_state->visible_quad_layer_rect, gfx::Rect(40, 40));
-    EXPECT_EQ(shared_quad_state->clip_rect, absl::nullopt);
+    EXPECT_EQ(shared_quad_state->clip_rect, std::nullopt);
   }
 }
 
diff --git a/cc/slim/slim_layer_unittest.cc b/cc/slim/slim_layer_unittest.cc
index 16be087b..6e78d70 100644
--- a/cc/slim/slim_layer_unittest.cc
+++ b/cc/slim/slim_layer_unittest.cc
@@ -199,7 +199,7 @@
   viz::SurfaceId end(viz::FrameSinkId(1u, 2u),
                      viz::LocalSurfaceId(5u, 6u, token));
 
-  EXPECT_EQ(layer->oldest_acceptable_fallback(), absl::nullopt);
+  EXPECT_EQ(layer->oldest_acceptable_fallback(), std::nullopt);
   layer->SetOldestAcceptableFallback(start);
   EXPECT_EQ(layer->oldest_acceptable_fallback(), start);
   layer->SetSurfaceId(end, cc::DeadlinePolicy::UseDefaultDeadline());
diff --git a/cc/slim/surface_layer.cc b/cc/slim/surface_layer.cc
index b6ac050..96cc1f9 100644
--- a/cc/slim/surface_layer.cc
+++ b/cc/slim/surface_layer.cc
@@ -104,12 +104,12 @@
   }
 
   SetSurfaceRange(viz::SurfaceRange(
-      surface_id.is_valid() ? absl::optional<viz::SurfaceId>(surface_id)
-                            : absl::nullopt,
+      surface_id.is_valid() ? std::optional<viz::SurfaceId>(surface_id)
+                            : std::nullopt,
       surface_range_.end()));
 }
 
-const absl::optional<viz::SurfaceId>& SurfaceLayer::oldest_acceptable_fallback()
+const std::optional<viz::SurfaceId>& SurfaceLayer::oldest_acceptable_fallback()
     const {
   return cc_layer() ? cc_layer()->oldest_acceptable_fallback()
                     : surface_range_.start();
diff --git a/cc/slim/surface_layer.h b/cc/slim/surface_layer.h
index 69ae6eb..17c5839 100644
--- a/cc/slim/surface_layer.h
+++ b/cc/slim/surface_layer.h
@@ -5,12 +5,12 @@
 #ifndef CC_SLIM_SURFACE_LAYER_H_
 #define CC_SLIM_SURFACE_LAYER_H_
 
+#include <optional>
 #include "base/component_export.h"
 #include "cc/layers/deadline_policy.h"
 #include "cc/slim/layer.h"
 #include "components/viz/common/surfaces/surface_id.h"
 #include "components/viz/common/surfaces/surface_range.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 class SurfaceLayer;
@@ -42,7 +42,7 @@
   // surface being embedded isn't ready to be drawn yet (before first frame is
   // submitted).
   void SetOldestAcceptableFallback(const viz::SurfaceId& surface_id);
-  const absl::optional<viz::SurfaceId>& oldest_acceptable_fallback() const;
+  const std::optional<viz::SurfaceId>& oldest_acceptable_fallback() const;
 
   void SetLayerTree(LayerTree* layer_tree) override;
 
@@ -64,7 +64,7 @@
 
   bool stretch_content_to_fill_bounds_ = false;
   viz::SurfaceRange surface_range_;
-  absl::optional<uint32_t> deadline_in_frames_;
+  std::optional<uint32_t> deadline_in_frames_;
 };
 
 }  // namespace cc::slim
diff --git a/cc/slim/test_frame_sink_impl.cc b/cc/slim/test_frame_sink_impl.cc
index a36d405..f1a82c7 100644
--- a/cc/slim/test_frame_sink_impl.cc
+++ b/cc/slim/test_frame_sink_impl.cc
@@ -32,7 +32,7 @@
   void SubmitCompositorFrame(
       const viz::LocalSurfaceId& local_surface_id,
       viz::CompositorFrame frame,
-      absl::optional<::viz::HitTestRegionList> hit_test_region_list,
+      std::optional<::viz::HitTestRegionList> hit_test_region_list,
       uint64_t submit_time) override {
     did_submit_ = true;
     last_frame_ = std::move(frame);
@@ -41,7 +41,7 @@
   void SubmitCompositorFrameSync(
       const viz::LocalSurfaceId& local_surface_id,
       viz::CompositorFrame frame,
-      absl::optional<::viz::HitTestRegionList> hit_test_region_list,
+      std::optional<::viz::HitTestRegionList> hit_test_region_list,
       uint64_t submit_time,
       SubmitCompositorFrameSyncCallback callback) override {}
   void DidNotProduceFrame(const viz::BeginFrameAck& ack) override {
@@ -58,7 +58,7 @@
 #endif
 
   viz::CompositorFrame TakeLastFrame() { return std::move(last_frame_); }
-  const absl::optional<::viz::HitTestRegionList>& hit_test_region_list() const {
+  const std::optional<::viz::HitTestRegionList>& hit_test_region_list() const {
     return hit_test_region_list_;
   }
 
@@ -76,7 +76,7 @@
 
  private:
   viz::CompositorFrame last_frame_;
-  absl::optional<::viz::HitTestRegionList> hit_test_region_list_;
+  std::optional<::viz::HitTestRegionList> hit_test_region_list_;
   bool did_submit_ = false;
   bool did_not_produce_frame_ = false;
 };
@@ -126,7 +126,7 @@
   return mojo_sink_->TakeLastFrame();
 }
 
-const absl::optional<::viz::HitTestRegionList>&
+const std::optional<::viz::HitTestRegionList>&
 TestFrameSinkImpl::GetLastHitTestRegionList() const {
   return mojo_sink_->hit_test_region_list();
 }
diff --git a/cc/slim/test_frame_sink_impl.h b/cc/slim/test_frame_sink_impl.h
index e0bb9419..de3ff3e3 100644
--- a/cc/slim/test_frame_sink_impl.h
+++ b/cc/slim/test_frame_sink_impl.h
@@ -27,7 +27,7 @@
   bool GetDidSubmitAndReset();
   bool GetDidNotProduceFrameAndReset();
   viz::CompositorFrame TakeLastFrame();
-  const absl::optional<::viz::HitTestRegionList>& GetLastHitTestRegionList()
+  const std::optional<::viz::HitTestRegionList>& GetLastHitTestRegionList()
       const;
   bool bind_to_client_called() const { return bind_to_client_called_; }
   bool needs_begin_frames() const { return needs_begin_frames_; }
diff --git a/cc/test/animation_test_common.cc b/cc/test/animation_test_common.cc
index 0d21f2e..239fd5e 100644
--- a/cc/test/animation_test_common.cc
+++ b/cc/test/animation_test_common.cc
@@ -291,7 +291,7 @@
                                     float start_opacity,
                                     float end_opacity,
                                     bool use_timing_function,
-                                    absl::optional<int> id) {
+                                    std::optional<int> id) {
   return AddOpacityTransition(
       animation, duration, start_opacity, end_opacity, use_timing_function,
       id ? *id : AnimationIdProvider::NextKeyframeModelId());
diff --git a/cc/test/animation_test_common.h b/cc/test/animation_test_common.h
index 7b69a5f..e526326 100644
--- a/cc/test/animation_test_common.h
+++ b/cc/test/animation_test_common.h
@@ -91,7 +91,7 @@
                                     float start_opacity,
                                     float end_opacity,
                                     bool use_timing_function,
-                                    absl::optional<int> id = absl::nullopt);
+                                    std::optional<int> id = std::nullopt);
 
 int AddAnimatedFilterToAnimation(Animation* animation,
                                  double duration,
diff --git a/cc/test/animation_timelines_test_common.cc b/cc/test/animation_timelines_test_common.cc
index 1e0dd228..bc014c1 100644
--- a/cc/test/animation_timelines_test_common.cc
+++ b/cc/test/animation_timelines_test_common.cc
@@ -413,7 +413,7 @@
 }
 
 void TestAnimationDelegate::NotifyLocalTimeUpdated(
-    absl::optional<base::TimeDelta> local_time) {}
+    std::optional<base::TimeDelta> local_time) {}
 
 AnimationTimelinesTest::AnimationTimelinesTest()
     : client_(ThreadInstance::kMain),
diff --git a/cc/test/animation_timelines_test_common.h b/cc/test/animation_timelines_test_common.h
index e160a3fc..010fa97f 100644
--- a/cc/test/animation_timelines_test_common.h
+++ b/cc/test/animation_timelines_test_common.h
@@ -258,7 +258,7 @@
       base::TimeTicks animation_start_time,
       std::unique_ptr<gfx::AnimationCurve> curve) override;
   void NotifyLocalTimeUpdated(
-      absl::optional<base::TimeDelta> local_time) override;
+      std::optional<base::TimeDelta> local_time) override;
 
   bool started() { return started_; }
 
diff --git a/cc/test/fake_layer_tree_frame_sink_client.cc b/cc/test/fake_layer_tree_frame_sink_client.cc
index 382c6694..a102333 100644
--- a/cc/test/fake_layer_tree_frame_sink_client.cc
+++ b/cc/test/fake_layer_tree_frame_sink_client.cc
@@ -17,7 +17,7 @@
   begin_frame_source_ = source;
 }
 
-absl::optional<viz::HitTestRegionList>
+std::optional<viz::HitTestRegionList>
 FakeLayerTreeFrameSinkClient::BuildHitTestData() {
   return hit_test_region_list_;
 }
diff --git a/cc/test/fake_layer_tree_frame_sink_client.h b/cc/test/fake_layer_tree_frame_sink_client.h
index 0f16a23..4ddaaeaa 100644
--- a/cc/test/fake_layer_tree_frame_sink_client.h
+++ b/cc/test/fake_layer_tree_frame_sink_client.h
@@ -24,7 +24,7 @@
   ~FakeLayerTreeFrameSinkClient() override;
 
   void SetBeginFrameSource(viz::BeginFrameSource* source) override;
-  absl::optional<viz::HitTestRegionList> BuildHitTestData() override;
+  std::optional<viz::HitTestRegionList> BuildHitTestData() override;
   void DidReceiveCompositorFrameAck() override;
   void DidPresentCompositorFrame(
       uint32_t frame_token,
@@ -55,7 +55,7 @@
   }
 
   void set_hit_test_region_list(
-      const absl::optional<viz::HitTestRegionList>& hit_test_region_list) {
+      const std::optional<viz::HitTestRegionList>& hit_test_region_list) {
     hit_test_region_list_ = hit_test_region_list;
   }
 
@@ -64,7 +64,7 @@
   bool did_lose_layer_tree_frame_sink_called_ = false;
   ManagedMemoryPolicy memory_policy_{0};
   raw_ptr<viz::BeginFrameSource> begin_frame_source_;
-  absl::optional<viz::HitTestRegionList> hit_test_region_list_;
+  std::optional<viz::HitTestRegionList> hit_test_region_list_;
 };
 
 }  // namespace cc
diff --git a/cc/test/fake_layer_tree_host_impl.h b/cc/test/fake_layer_tree_host_impl.h
index 3846dd97..aa4262f 100644
--- a/cc/test/fake_layer_tree_host_impl.h
+++ b/cc/test/fake_layer_tree_host_impl.h
@@ -60,7 +60,7 @@
     notify_tile_state_changed_called_ = called;
   }
   void set_target_color_params(
-      absl::optional<TargetColorParams> target_color_params) {
+      std::optional<TargetColorParams> target_color_params) {
     target_color_params_ = target_color_params;
   }
 
@@ -72,7 +72,7 @@
   FakeLayerTreeHostImplClient client_;
   FakeRenderingStatsInstrumentation stats_instrumentation_;
   bool notify_tile_state_changed_called_;
-  absl::optional<TargetColorParams> target_color_params_;
+  std::optional<TargetColorParams> target_color_params_;
 };
 
 }  // namespace cc
diff --git a/cc/test/layer_tree_json_parser.cc b/cc/test/layer_tree_json_parser.cc
index d380e8b..90e832f4 100644
--- a/cc/test/layer_tree_json_parser.cc
+++ b/cc/test/layer_tree_json_parser.cc
@@ -38,16 +38,16 @@
   if (bounds_list->size() < 2)
     return nullptr;
 
-  absl::optional<int> width = (*bounds_list)[0].GetIfInt();
-  absl::optional<int> height = (*bounds_list)[1].GetIfInt();
+  std::optional<int> width = (*bounds_list)[0].GetIfInt();
+  std::optional<int> height = (*bounds_list)[1].GetIfInt();
   if (!width.has_value() || !height.has_value())
     return nullptr;
 
-  absl::optional<bool> draws_content = dict.FindBool("DrawsContent");
+  std::optional<bool> draws_content = dict.FindBool("DrawsContent");
   if (!draws_content.has_value())
     return nullptr;
 
-  absl::optional<bool> hit_testable = dict.FindBool("HitTestable");
+  std::optional<bool> hit_testable = dict.FindBool("HitTestable");
   // If we cannot load hit_testable, we may try loading the old version, since
   // we do not record |hit_testable_without_draws_content| in the past, we use
   // |draws_content| as the value of |hit_testable|.
@@ -65,10 +65,10 @@
     if (aperture_list->size() < 4)
       return nullptr;
 
-    absl::optional<int> aperture_x = (*aperture_list)[0].GetIfInt();
-    absl::optional<int> aperture_y = (*aperture_list)[1].GetIfInt();
-    absl::optional<int> aperture_width = (*aperture_list)[2].GetIfInt();
-    absl::optional<int> aperture_height = (*aperture_list)[3].GetIfInt();
+    std::optional<int> aperture_x = (*aperture_list)[0].GetIfInt();
+    std::optional<int> aperture_y = (*aperture_list)[1].GetIfInt();
+    std::optional<int> aperture_width = (*aperture_list)[2].GetIfInt();
+    std::optional<int> aperture_height = (*aperture_list)[3].GetIfInt();
     if (!(aperture_x.has_value() && aperture_y.has_value() &&
           aperture_width.has_value() && aperture_height.has_value()))
       return nullptr;
@@ -79,8 +79,8 @@
     if (image_bounds_list->size() < 2)
       return nullptr;
 
-    absl::optional<double> image_width = (*image_bounds_list)[0].GetIfDouble();
-    absl::optional<double> image_height = (*image_bounds_list)[1].GetIfDouble();
+    std::optional<double> image_width = (*image_bounds_list)[0].GetIfDouble();
+    std::optional<double> image_height = (*image_bounds_list)[1].GetIfDouble();
     if (!(image_width.has_value() && image_height.has_value()))
       return nullptr;
 
@@ -90,16 +90,16 @@
     if (border_list->size() < 4)
       return nullptr;
 
-    absl::optional<int> border_x = (*border_list)[0].GetIfInt();
-    absl::optional<int> border_y = (*border_list)[1].GetIfInt();
-    absl::optional<int> border_width = (*border_list)[2].GetIfInt();
-    absl::optional<int> border_height = (*border_list)[3].GetIfInt();
+    std::optional<int> border_x = (*border_list)[0].GetIfInt();
+    std::optional<int> border_y = (*border_list)[1].GetIfInt();
+    std::optional<int> border_width = (*border_list)[2].GetIfInt();
+    std::optional<int> border_height = (*border_list)[3].GetIfInt();
 
     if (!(border_x.has_value() && border_y.has_value() &&
           border_width.has_value() && border_height.has_value()))
       return nullptr;
 
-    absl::optional<bool> fill_center = dict.FindBool("FillCenter");
+    std::optional<bool> fill_center = dict.FindBool("FillCenter");
     if (!fill_center.has_value())
       return nullptr;
 
@@ -127,11 +127,11 @@
   new_layer->SetIsDrawable(*draws_content);
   new_layer->SetHitTestable(*hit_testable);
 
-  absl::optional<double> opacity = dict.FindDouble("Opacity");
+  std::optional<double> opacity = dict.FindDouble("Opacity");
   if (opacity.has_value())
     new_layer->SetOpacity(*opacity);
 
-  absl::optional<bool> contents_opaque = dict.FindBool("ContentsOpaque");
+  std::optional<bool> contents_opaque = dict.FindBool("ContentsOpaque");
   if (contents_opaque.has_value())
     new_layer->SetContentsOpaque(*contents_opaque);
 
@@ -140,10 +140,10 @@
   if (touch_region_list) {
     TouchActionRegion touch_action_region;
     for (size_t i = 0; i + 3 < touch_region_list->size(); i += 4) {
-      absl::optional<int> rect_x = (*touch_region_list)[i + 0].GetIfInt();
-      absl::optional<int> rect_y = (*touch_region_list)[i + 1].GetIfInt();
-      absl::optional<int> rect_width = (*touch_region_list)[i + 2].GetIfInt();
-      absl::optional<int> rect_height = (*touch_region_list)[i + 3].GetIfInt();
+      std::optional<int> rect_x = (*touch_region_list)[i + 0].GetIfInt();
+      std::optional<int> rect_y = (*touch_region_list)[i + 1].GetIfInt();
+      std::optional<int> rect_width = (*touch_region_list)[i + 2].GetIfInt();
+      std::optional<int> rect_height = (*touch_region_list)[i + 3].GetIfInt();
 
       if (!(rect_x.has_value() && rect_y.has_value() &&
             rect_width.has_value() && rect_height.has_value()))
diff --git a/cc/test/layer_tree_pixel_resource_test.cc b/cc/test/layer_tree_pixel_resource_test.cc
index f99e240..4b8534d 100644
--- a/cc/test/layer_tree_pixel_resource_test.cc
+++ b/cc/test/layer_tree_pixel_resource_test.cc
@@ -29,7 +29,8 @@
       return "skia_gl";
     case viz::RendererType::kSkiaVk:
       return "skia_vk";
-    case viz::RendererType::kSkiaGraphite:
+    case viz::RendererType::kSkiaGraphiteDawn:
+    case viz::RendererType::kSkiaGraphiteMetal:
       return "skia_graphite";
     case viz::RendererType::kSoftware:
       return "sw";
diff --git a/cc/test/layer_tree_pixel_test.cc b/cc/test/layer_tree_pixel_test.cc
index b62c5ee..67d10a3 100644
--- a/cc/test/layer_tree_pixel_test.cc
+++ b/cc/test/layer_tree_pixel_test.cc
@@ -48,7 +48,8 @@
     case viz::RendererType::kSoftware:
       return TestRasterType::kBitmap;
     case viz::RendererType::kSkiaVk:
-    case viz::RendererType::kSkiaGraphite:
+    case viz::RendererType::kSkiaGraphiteDawn:
+    case viz::RendererType::kSkiaGraphiteMetal:
       return TestRasterType::kGpu;
     default:
       return TestRasterType::kOneCopy;
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc
index 9ad0f31..250da18 100644
--- a/cc/test/layer_tree_test.cc
+++ b/cc/test/layer_tree_test.cc
@@ -264,7 +264,7 @@
     return test_hooks_->PrepareToDrawOnThread(this, frame, draw_result);
   }
 
-  absl::optional<SubmitInfo> DrawLayers(FrameData* frame) override {
+  std::optional<SubmitInfo> DrawLayers(FrameData* frame) override {
     auto r = LayerTreeHostImpl::DrawLayers(frame);
     test_hooks_->DrawLayersOnThread(this);
     return r;
@@ -439,7 +439,7 @@
   void OnDeferCommitsChanged(
       bool,
       PaintHoldingReason,
-      absl::optional<PaintHoldingCommitTrigger>) override {}
+      std::optional<PaintHoldingCommitTrigger>) override {}
   void OnCommitRequested() override {}
 
   void RecordStartOfFrameMetrics() override {}
@@ -732,12 +732,27 @@
   if (renderer_type_ == viz::RendererType::kSkiaVk) {
     scoped_feature_list_.InitAndEnableFeature(features::kVulkan);
     init_vulkan = true;
-  } else if (renderer_type_ == viz::RendererType::kSkiaGraphite) {
+  } else if (renderer_type_ == viz::RendererType::kSkiaGraphiteDawn) {
     scoped_feature_list_.InitAndEnableFeature(features::kSkiaGraphite);
+    bool use_gpu = command_line->HasSwitch(::switches::kUseGpuInTests);
+    // Force the use of Graphite even if disallowed for other reasons e.g.
+    // ANGLE Metal is not enabled on Mac. Use dawn-swiftshader backend if
+    // kUseGpuInTests is not set.
+    command_line->AppendSwitch(::switches::kEnableSkiaGraphite);
+    command_line->AppendSwitchASCII(
+        ::switches::kSkiaGraphiteBackend,
+        use_gpu ? ::switches::kSkiaGraphiteBackendDawn
+                : ::switches::kSkiaGraphiteBackendDawnSwiftshader);
     init_dawn = true;
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
     init_vulkan = true;
 #endif
+  } else if (renderer_type_ == viz::RendererType::kSkiaGraphiteMetal) {
+    scoped_feature_list_.InitAndEnableFeature(features::kSkiaGraphite);
+    // Force the use of Graphite even if disallowed for other reasons.
+    command_line->AppendSwitch(::switches::kEnableSkiaGraphite);
+    command_line->AppendSwitchASCII(::switches::kSkiaGraphiteBackend,
+                                    ::switches::kSkiaGraphiteBackendMetal);
   } else {
     scoped_feature_list_.InitWithFeatures(
         {}, {features::kVulkan, features::kSkiaGraphite});
@@ -754,15 +769,6 @@
   if (init_dawn) {
 #if BUILDFLAG(SKIA_USE_DAWN)
     dawnProcSetProcs(&dawn::native::GetProcs());
-    bool use_gpu = command_line->HasSwitch(::switches::kUseGpuInTests);
-    // Force the use of Graphite even if disallowed for other reasons e.g.
-    // ANGLE Metal is not enabled on Mac. Use dawn-swiftshader backend if
-    // kUseGpuInTests is not set.
-    command_line->AppendSwitch(::switches::kEnableSkiaGraphite);
-    command_line->AppendSwitchASCII(
-        ::switches::kSkiaGraphiteBackend,
-        use_gpu ? ::switches::kSkiaGraphiteBackendDawn
-                : ::switches::kSkiaGraphiteBackendDawnSwiftshader);
 #endif
   }
 }
diff --git a/cc/test/layer_tree_test.h b/cc/test/layer_tree_test.h
index 3b2f7c0..31dbe9ed 100644
--- a/cc/test/layer_tree_test.h
+++ b/cc/test/layer_tree_test.h
@@ -71,11 +71,7 @@
   // TODO(kylechar): This shouldn't be SkiaRenderer/GL for platforms with no GL
   // support.
   static constexpr viz::RendererType kDefaultRendererType =
-#if BUILDFLAG(IS_IOS) && BUILDFLAG(SKIA_USE_METAL)
-      viz::RendererType::kSkiaGraphite;
-#else
       viz::RendererType::kSkiaGL;
-#endif  // BUILDFLAG(IS_IOS)
 
   std::string TestTypeToString() {
     switch (renderer_type_) {
@@ -83,8 +79,10 @@
         return "Skia GL";
       case viz::RendererType::kSkiaVk:
         return "Skia Vulkan";
-      case viz::RendererType::kSkiaGraphite:
-        return "Skia Graphite";
+      case viz::RendererType::kSkiaGraphiteDawn:
+        return "Skia Graphite Dawn";
+      case viz::RendererType::kSkiaGraphiteMetal:
+        return "Skia Graphite Metal";
       case viz::RendererType::kSoftware:
         return "Software";
     }
@@ -227,7 +225,8 @@
     return renderer_type_ == viz::RendererType::kSkiaVk;
   }
   bool use_skia_graphite() const {
-    return renderer_type_ == viz::RendererType::kSkiaGraphite;
+    return renderer_type_ == viz::RendererType::kSkiaGraphiteDawn ||
+           renderer_type_ == viz::RendererType::kSkiaGraphiteMetal;
   }
 
   const viz::RendererType renderer_type_;
diff --git a/cc/test/paint_op_helper.h b/cc/test/paint_op_helper.h
index 6df195d..4682e9f 100644
--- a/cc/test/paint_op_helper.h
+++ b/cc/test/paint_op_helper.h
@@ -38,7 +38,7 @@
   }
 
   template <typename T>
-  static std::string ToString(const absl::optional<T>& opt) {
+  static std::string ToString(const std::optional<T>& opt) {
     return opt.has_value() ? ToString(*opt) : "(nil)";
   }
 
diff --git a/cc/test/paint_op_matchers.h b/cc/test/paint_op_matchers.h
index c7640bf..7566ae3 100644
--- a/cc/test/paint_op_matchers.h
+++ b/cc/test/paint_op_matchers.h
@@ -10,12 +10,12 @@
 #include <string>
 #include <utility>
 
+#include <optional>
 #include "base/memory/ref_counted.h"
 #include "base/strings/stringprintf.h"
 #include "cc/paint/paint_op_buffer.h"
 #include "cc/test/paint_op_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -34,7 +34,7 @@
   template <typename... Args>
   explicit PaintOpEq(Args&&... args)
       : expected_op_(base::MakeRefCounted<base::RefCountedData<OpT>>(
-            absl::in_place,
+            std::in_place,
             std::forward<Args>(args)...)) {}
 
   bool MatchAndExplain(const PaintOp& op,
diff --git a/cc/test/pixel_test.cc b/cc/test/pixel_test.cc
index 75a643e..233a46c 100644
--- a/cc/test/pixel_test.cc
+++ b/cc/test/pixel_test.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/command_line.h"
+#include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/memory/read_only_shared_memory_region.h"
@@ -48,7 +49,8 @@
 PixelTest::PixelTest(GraphicsBackend backend)
     : device_viewport_size_(gfx::Size(200, 200)),
       disable_picture_quad_image_filtering_(false),
-      output_surface_client_(std::make_unique<FakeOutputSurfaceClient>()) {
+      output_surface_client_(std::make_unique<FakeOutputSurfaceClient>()),
+      graphics_backend_(backend) {
   // Keep texture sizes exactly matching the bounds of the RenderPass to avoid
   // floating point badness in texcoords.
   renderer_settings_.dont_round_texture_sizes_for_pixel_tests = true;
@@ -59,12 +61,29 @@
   if (backend == kSkiaVulkan) {
     scoped_feature_list_.InitAndEnableFeature(features::kVulkan);
     init_vulkan = true;
-  } else if (backend == kSkiaGraphite) {
+  } else if (backend == kSkiaGraphiteDawn) {
     scoped_feature_list_.InitAndEnableFeature(features::kSkiaGraphite);
+    auto* command_line = base::CommandLine::ForCurrentProcess();
+    bool use_gpu = command_line->HasSwitch(::switches::kUseGpuInTests);
+    // Force the use of Graphite even if disallowed for other reasons e.g.
+    // ANGLE Metal is not enabled on Mac. Use dawn-swiftshader backend if
+    // kUseGpuInTests is not set.
+    command_line->AppendSwitch(::switches::kEnableSkiaGraphite);
+    command_line->AppendSwitchASCII(
+        ::switches::kSkiaGraphiteBackend,
+        use_gpu ? ::switches::kSkiaGraphiteBackendDawn
+                : ::switches::kSkiaGraphiteBackendDawnSwiftshader);
     init_dawn = true;
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
     init_vulkan = true;
 #endif
+  } else if (backend == kSkiaGraphiteMetal) {
+    scoped_feature_list_.InitAndEnableFeature(features::kSkiaGraphite);
+    auto* command_line = base::CommandLine::ForCurrentProcess();
+    // Force the use of Graphite even if disallowed for other reasons.
+    command_line->AppendSwitch(::switches::kEnableSkiaGraphite);
+    command_line->AppendSwitchASCII(::switches::kSkiaGraphiteBackend,
+                                    ::switches::kSkiaGraphiteBackendMetal);
   } else {
     // Ensure that we don't accidentally have vulkan or graphite enabled.
     scoped_feature_list_.InitWithFeatures(
@@ -84,16 +103,6 @@
   if (init_dawn) {
 #if BUILDFLAG(SKIA_USE_DAWN)
     dawnProcSetProcs(&dawn::native::GetProcs());
-    auto* command_line = base::CommandLine::ForCurrentProcess();
-    bool use_gpu = command_line->HasSwitch(::switches::kUseGpuInTests);
-    // Force the use of Graphite even if disallowed for other reasons e.g.
-    // ANGLE Metal is not enabled on Mac. Use dawn-swiftshader backend if
-    // kUseGpuInTests is not set.
-    command_line->AppendSwitch(::switches::kEnableSkiaGraphite);
-    command_line->AppendSwitchASCII(
-        ::switches::kSkiaGraphiteBackend,
-        use_gpu ? ::switches::kSkiaGraphiteBackendDawn
-                : ::switches::kSkiaGraphiteBackendDawnSwiftshader);
 #endif
   }
 }
diff --git a/cc/test/pixel_test.h b/cc/test/pixel_test.h
index bf53227..d21ae1e7 100644
--- a/cc/test/pixel_test.h
+++ b/cc/test/pixel_test.h
@@ -53,7 +53,9 @@
     // SkiaRenderer with the Vulkan backend will be used.
     kSkiaVulkan,
     // SkiaRenderer with the Skia Graphite on Dawn will be used.
-    kSkiaGraphite,
+    kSkiaGraphiteDawn,
+    // SkiaRenderer with the Skia Graphite on Metal will be used.
+    kSkiaGraphiteMetal,
   };
 
   explicit PixelTest(GraphicsBackend backend = kDefault);
@@ -129,6 +131,11 @@
 
   void TearDown() override;
 
+  bool use_skia_graphite() const {
+    return graphics_backend_ == GraphicsBackend::kSkiaGraphiteDawn ||
+           graphics_backend_ == GraphicsBackend::kSkiaGraphiteMetal;
+  }
+
  private:
   void ReadbackResult(base::OnceClosure quit_run_loop,
                       std::unique_ptr<viz::CopyOutputResult> result);
@@ -137,6 +144,7 @@
                             const PixelComparator& comparator);
 
   std::unique_ptr<gl::DisableNullDrawGLBindings> enable_pixel_output_;
+  GraphicsBackend graphics_backend_ = GraphicsBackend::kDefault;
 };
 
 }  // namespace cc
diff --git a/cc/test/render_pass_test_utils.cc b/cc/test/render_pass_test_utils.cc
index 991f28b..53334842 100644
--- a/cc/test/render_pass_test_utils.cc
+++ b/cc/test/render_pass_test_utils.cc
@@ -128,7 +128,7 @@
                                             const gfx::Transform& transform) {
   viz::SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
   shared_state->SetAll(transform, rect, rect, gfx::MaskFilterInfo(),
-                       /*clip=*/absl::nullopt, /*contents_opaque=*/false,
+                       /*clip=*/std::nullopt, /*contents_opaque=*/false,
                        /*opacity_f=*/1, SkBlendMode::kSrcOver,
                        /*sorting_context=*/0, /*layer_id=*/0u,
                        /*fast_rounded_corner=*/false);
@@ -144,7 +144,7 @@
   viz::SharedQuadState* shared_state =
       to_pass->CreateAndAppendSharedQuadState();
   shared_state->SetAll(gfx::Transform(), output_rect, output_rect,
-                       gfx::MaskFilterInfo(), /*clip=*/absl::nullopt,
+                       gfx::MaskFilterInfo(), /*clip=*/std::nullopt,
                        /*contents_opaque=*/false, /*opacity_f=*/1,
                        SkBlendMode::kSrcOver, /*sorting_context=*/0,
                        /*layer_id=*/0u, /*fast_rounded_corner=*/false);
@@ -179,7 +179,7 @@
       to_pass->CreateAndAppendSharedQuadState();
   shared_state->SetAll(
       transform, output_rect, output_rect, gfx::MaskFilterInfo(),
-      /*clip=*/absl::nullopt, /*contents_opaque=*/false, 1, blend_mode,
+      /*clip=*/std::nullopt, /*contents_opaque=*/false, 1, blend_mode,
       /*sorting_context=*/0, /*layer_id=*/0u, /*fast_rounded_corner=*/false);
   auto* quad =
       to_pass->CreateAndAppendDrawQuad<viz::AggregatedRenderPassDrawQuad>();
@@ -227,7 +227,7 @@
   viz::SharedQuadState* shared_state =
       to_pass->CreateAndAppendSharedQuadState();
   shared_state->SetAll(gfx::Transform(), rect, rect, gfx::MaskFilterInfo(),
-                       /*clip=*/absl::nullopt, /*contents_opaque=*/false,
+                       /*clip=*/std::nullopt, /*contents_opaque=*/false,
                        /*opacity_f=*/1, SkBlendMode::kSrcOver,
                        /*sorting_context=*/0, /*layer_id=*/0u,
                        /*fast_rounded_corner=*/false);
@@ -297,7 +297,7 @@
   viz::SharedQuadState* shared_state2 =
       to_pass->CreateAndAppendSharedQuadState();
   shared_state->SetAll(gfx::Transform(), rect, rect, gfx::MaskFilterInfo(),
-                       /*clip=*/absl::nullopt, /*contents_opaque=*/false,
+                       /*clip=*/std::nullopt, /*contents_opaque=*/false,
                        /*opacity_f=*/1, SkBlendMode::kSrcOver,
                        /*sorting_context=*/0, /*layer_id=*/0u,
                        /*fast_rounded_corner=*/false);
@@ -313,7 +313,7 @@
                    gfx::Size(2, 2), plane_resources[0], plane_resources[1],
                    plane_resources[2], plane_resources[3],
                    gfx::ColorSpace::CreateREC601(), 0.0, 1.0, 8,
-                   gfx::ProtectedVideoType::kClear, absl::nullopt);
+                   gfx::ProtectedVideoType::kClear, std::nullopt);
 
   return {resource1,          resource2,          resource3,
           resource4,          resource5,          resource6,
@@ -416,7 +416,7 @@
   viz::SharedQuadState* shared_state =
       to_pass->CreateAndAppendSharedQuadState();
   shared_state->SetAll(gfx::Transform(), rect, rect, gfx::MaskFilterInfo(),
-                       /*clip=*/absl::nullopt, /*contents_opaque=*/false,
+                       /*clip=*/std::nullopt, /*contents_opaque=*/false,
                        /*opacity_f=*/1, SkBlendMode::kSrcOver,
                        /*sorting_context=*/0, /*layer_id=*/0u,
                        /*fast_rounded_corner=*/false);
@@ -484,7 +484,7 @@
   viz::SharedQuadState* shared_state2 =
       to_pass->CreateAndAppendSharedQuadState();
   shared_state2->SetAll(gfx::Transform(), rect, rect, gfx::MaskFilterInfo(),
-                        /*clip=*/absl::nullopt, /*contents_opaque=*/false,
+                        /*clip=*/std::nullopt, /*contents_opaque=*/false,
                         /*opacity_f=*/1, SkBlendMode::kSrcOver,
                         /*sorting_context=*/0, /*layer_id=*/0u,
                         /*fast_rounded_corner=*/false);
@@ -502,7 +502,7 @@
                    gfx::Size(2, 1), mapped_plane_resources[0],
                    mapped_plane_resources[1], mapped_plane_resources[2],
                    mapped_plane_resources[3], gfx::ColorSpace::CreateREC601(),
-                   0.0, 1.0, 8, gfx::ProtectedVideoType::kClear, absl::nullopt);
+                   0.0, 1.0, 8, gfx::ProtectedVideoType::kClear, std::nullopt);
 }
 
 }  // namespace cc
diff --git a/cc/test/render_pass_test_utils.h b/cc/test/render_pass_test_utils.h
index 24fb004..ba42d1c 100644
--- a/cc/test/render_pass_test_utils.h
+++ b/cc/test/render_pass_test_utils.h
@@ -74,7 +74,7 @@
                                                    float opacity) {
   viz::SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
   shared_state->SetAll(gfx::Transform(), rect, rect, gfx::MaskFilterInfo(),
-                       /*clip=*/absl::nullopt, /*contents_opaque=*/false,
+                       /*clip=*/std::nullopt, /*contents_opaque=*/false,
                        opacity, SkBlendMode::kSrcOver, /*sorting_context=*/0,
                        /*layer_id=*/0u, /*fast_rounded_corner=*/false);
   auto* quad =
diff --git a/cc/test/skia_common.cc b/cc/test/skia_common.cc
index 5129fc03..5da21b7a 100644
--- a/cc/test/skia_common.cc
+++ b/cc/test/skia_common.cc
@@ -161,7 +161,7 @@
     bool allocate_encoded_data,
     PaintImage::Id id,
     SkColorType color_type,
-    absl::optional<YUVSubsampling> yuv_format,
+    std::optional<YUVSubsampling> yuv_format,
     SkYUVAPixmapInfo::DataType yuv_data_type) {
   if (!color_space)
     color_space = SkColorSpace::MakeSRGB();
diff --git a/cc/test/skia_common.h b/cc/test/skia_common.h
index a59c3ff..1adf67c 100644
--- a/cc/test/skia_common.h
+++ b/cc/test/skia_common.h
@@ -9,6 +9,7 @@
 #include <string>
 #include <vector>
 
+#include <optional>
 #include "base/files/file_path.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_refptr.h"
@@ -19,7 +20,6 @@
 #include "cc/paint/image_animation_count.h"
 #include "cc/paint/paint_image.h"
 #include "cc/paint/paint_image_generator.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkColorSpace.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
@@ -59,7 +59,7 @@
     bool allocate_encoded_memory = true,
     PaintImage::Id id = PaintImage::kInvalidId,
     SkColorType color_type = kN32_SkColorType,
-    absl::optional<YUVSubsampling> yuv_format = absl::nullopt,
+    std::optional<YUVSubsampling> yuv_format = std::nullopt,
     SkYUVAPixmapInfo::DataType yuv_data_type =
         SkYUVAPixmapInfo::DataType::kUnorm8);
 
diff --git a/cc/test/stub_layer_tree_host_client.h b/cc/test/stub_layer_tree_host_client.h
index d94648db..8de1e06 100644
--- a/cc/test/stub_layer_tree_host_client.h
+++ b/cc/test/stub_layer_tree_host_client.h
@@ -30,7 +30,7 @@
   void OnDeferCommitsChanged(
       bool,
       PaintHoldingReason,
-      absl::optional<PaintHoldingCommitTrigger>) override {}
+      std::optional<PaintHoldingCommitTrigger>) override {}
   void OnCommitRequested() override {}
   void RecordStartOfFrameMetrics() override {}
   void RecordEndOfFrameMetrics(base::TimeTicks,
diff --git a/cc/test/test_hooks.h b/cc/test/test_hooks.h
index c5eecd3..66a71af4 100644
--- a/cc/test/test_hooks.h
+++ b/cc/test/test_hooks.h
@@ -142,7 +142,7 @@
       base::TimeTicks animation_start_time,
       std::unique_ptr<gfx::AnimationCurve> curve) override {}
   void NotifyLocalTimeUpdated(
-      absl::optional<base::TimeDelta> local_time) override {}
+      std::optional<base::TimeDelta> local_time) override {}
 
   // OutputSurface indirections to the LayerTreeTest, that can be further
   // overridden.
diff --git a/cc/test/test_options_provider.cc b/cc/test/test_options_provider.cc
index 2c364b31..439643a4 100644
--- a/cc/test/test_options_provider.cc
+++ b/cc/test/test_options_provider.cc
@@ -113,7 +113,7 @@
   // Create a transfer cache entry for this image.
   ClientImageTransferCacheEntry cache_entry(
       ClientImageTransferCacheEntry::Image(&bitmap.pixmap()),
-      false /* needs_mips */, absl::nullopt);
+      false /* needs_mips */, std::nullopt);
   const uint32_t data_size = cache_entry.SerializedSize();
   auto data = PaintOpWriter::AllocateAlignedBuffer<uint8_t>(data_size);
   if (!cache_entry.Serialize(base::span<uint8_t>(data.get(), data_size))) {
diff --git a/cc/tiles/checker_image_tracker.h b/cc/tiles/checker_image_tracker.h
index fa042854..5b17d44 100644
--- a/cc/tiles/checker_image_tracker.h
+++ b/cc/tiles/checker_image_tracker.h
@@ -9,12 +9,12 @@
 #include <unordered_map>
 #include <vector>
 
+#include <optional>
 #include "base/containers/contains.h"
 #include "base/memory/raw_ptr.h"
 #include "cc/cc_export.h"
 #include "cc/paint/image_id.h"
 #include "cc/tiles/image_controller.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkImage.h"
 
 namespace cc {
@@ -201,7 +201,7 @@
 
   // The currently outstanding image decode that has been scheduled with the
   // decode service. There can be only one outstanding decode at a time.
-  absl::optional<PaintImage> outstanding_image_decode_;
+  std::optional<PaintImage> outstanding_image_decode_;
 
   // A map of ImageId to its DecodePolicy.
   std::unordered_map<PaintImage::Id, DecodeState> image_async_decode_state_;
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc
index 46e4aa66..bf3c710b 100644
--- a/cc/tiles/gpu_image_decode_cache.cc
+++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -503,7 +503,7 @@
   size_t size_;
 };
 
-absl::optional<SkYUVAPixmapInfo> GetYUVADecodeInfo(
+std::optional<SkYUVAPixmapInfo> GetYUVADecodeInfo(
     const DrawImage& draw_image,
     AuxImage aux_image,
     const SkISize target_size,
@@ -511,7 +511,7 @@
   SkYUVAPixmapInfo original_yuva_pixmap_info;
   if (!draw_image.paint_image().IsYuv(yuva_supported_data_types, aux_image,
                                       &original_yuva_pixmap_info)) {
-    return absl::nullopt;
+    return std::nullopt;
   }
   DCHECK(original_yuva_pixmap_info.isValid());
 
@@ -1227,7 +1227,7 @@
 
   {
     // TODO(crbug.com/1110007): We shouldn't need to lock to get capabilities.
-    absl::optional<viz::RasterContextProvider::ScopedRasterContextLock>
+    std::optional<viz::RasterContextProvider::ScopedRasterContextLock>
         context_lock;
     if (context_->GetLock())
       context_lock.emplace(context_);
@@ -1584,7 +1584,7 @@
                "GpuImageDecodeCache::SetShouldAggressivelyFreeResources",
                "agressive_free_resources", aggressively_free_resources);
   if (aggressively_free_resources) {
-    absl::optional<viz::RasterContextProvider::ScopedRasterContextLock>
+    std::optional<viz::RasterContextProvider::ScopedRasterContextLock>
         context_lock;
     if (auto* lock = context_->GetLock()) {
       // There are callers that might have already acquired the lock. Thus,
@@ -1954,12 +1954,12 @@
 void GpuImageDecodeCache::UploadImageInTask(const DrawImage& draw_image) {
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
                "GpuImageDecodeCache::UploadImage");
-  absl::optional<viz::RasterContextProvider::ScopedRasterContextLock>
+  std::optional<viz::RasterContextProvider::ScopedRasterContextLock>
       context_lock;
   if (context_->GetLock())
     context_lock.emplace(context_);
 
-  absl::optional<ScopedGrContextAccess> gr_context_access;
+  std::optional<ScopedGrContextAccess> gr_context_access;
   if (!use_transfer_cache_)
     gr_context_access.emplace(context_);
   base::AutoLock lock(lock_);
@@ -2602,7 +2602,7 @@
                            draw_image.paint_image().HasGainmap())) {
         target_color_space = nullptr;
       }
-      const absl::optional<gfx::HDRMetadata> hdr_metadata =
+      const std::optional<gfx::HDRMetadata> hdr_metadata =
           draw_image.paint_image().GetHDRMetadata();
 
       UploadImageIfNecessary_TransferCache_SoftwareDecode(
@@ -2676,7 +2676,7 @@
     const DrawImage& draw_image,
     ImageData* image_data,
     sk_sp<SkColorSpace> decoded_color_space,
-    const absl::optional<gfx::HDRMetadata>& hdr_metadata,
+    const std::optional<gfx::HDRMetadata>& hdr_metadata,
     sk_sp<SkColorSpace> target_color_space) {
   DCHECK_EQ(image_data->mode, DecodedDataMode::kTransferCache);
   DCHECK(use_transfer_cache_);
diff --git a/cc/tiles/gpu_image_decode_cache.h b/cc/tiles/gpu_image_decode_cache.h
index fab354b..36c0553 100644
--- a/cc/tiles/gpu_image_decode_cache.h
+++ b/cc/tiles/gpu_image_decode_cache.h
@@ -12,6 +12,7 @@
 #include <utility>
 #include <vector>
 
+#include <optional>
 #include "base/containers/flat_map.h"
 #include "base/containers/lru_cache.h"
 #include "base/feature_list.h"
@@ -28,7 +29,6 @@
 #include "cc/cc_export.h"
 #include "cc/paint/image_transfer_cache_entry.h"
 #include "cc/tiles/image_decode_cache.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/core/SkYUVAInfo.h"
@@ -478,7 +478,7 @@
     }
 
     // If in transfer cache mode.
-    absl::optional<uint32_t> transfer_cache_id() const {
+    std::optional<uint32_t> transfer_cache_id() const {
       DCHECK(mode_ == Mode::kTransferCache || mode_ == Mode::kNone);
       return transfer_cache_id_;
     }
@@ -559,21 +559,21 @@
     // Used if |mode_| == kSkImage.
     // May be null if image not yet uploaded / prepared.
     sk_sp<SkImage> image_;
-    absl::optional<YUVSkImages> image_yuv_planes_;
+    std::optional<YUVSkImages> image_yuv_planes_;
     // TODO(crbug/910276): Change after alpha support.
     bool is_alpha_ = false;
     GrGLuint gl_id_ = 0;
-    absl::optional<std::array<GrGLuint, kNumYUVPlanes>> gl_plane_ids_;
+    std::optional<std::array<GrGLuint, kNumYUVPlanes>> gl_plane_ids_;
 
     // Used if |mode_| == kTransferCache.
-    absl::optional<uint32_t> transfer_cache_id_;
+    std::optional<uint32_t> transfer_cache_id_;
 
     // The original un-mipped image, for RGBX, or the representative image
     // backed by three planes for YUV. It is retained until it can be safely
     // deleted.
     sk_sp<SkImage> unmipped_image_;
     // Used for YUV decoding and null otherwise.
-    absl::optional<YUVSkImages> unmipped_yuv_images_;
+    std::optional<YUVSkImages> unmipped_yuv_images_;
   };
 
   // A structure to represent either an RGBA or a YUVA image info.
@@ -587,8 +587,8 @@
     ~ImageInfo();
 
     // At most one of `rgba` or `yuva` may be valid.
-    absl::optional<SkImageInfo> rgba;
-    absl::optional<SkYUVAPixmapInfo> yuva;
+    std::optional<SkImageInfo> rgba;
+    std::optional<SkYUVAPixmapInfo> yuva;
 
     // The number of bytes used by this image.
     size_t size = 0;
@@ -825,7 +825,7 @@
       const DrawImage& draw_image,
       ImageData* image_data,
       sk_sp<SkColorSpace> decoded_target_colorspace,
-      const absl::optional<gfx::HDRMetadata>& hdr_metadata,
+      const std::optional<gfx::HDRMetadata>& hdr_metadata,
       sk_sp<SkColorSpace> target_color_space) EXCLUSIVE_LOCKS_REQUIRED(lock_);
   void UploadImageIfNecessary_GpuCpu_YUVA(
       const DrawImage& draw_image,
diff --git a/cc/tiles/gpu_image_decode_cache_unittest.cc b/cc/tiles/gpu_image_decode_cache_unittest.cc
index 5217c631..13e0279d 100644
--- a/cc/tiles/gpu_image_decode_cache_unittest.cc
+++ b/cc/tiles/gpu_image_decode_cache_unittest.cc
@@ -337,7 +337,7 @@
         std::move(support), std::move(gl), std::move(raster));
   }
 
-  void SetContextCapabilitiesOverride(absl::optional<gpu::Capabilities> caps) {
+  void SetContextCapabilitiesOverride(std::optional<gpu::Capabilities> caps) {
     capabilities_override_ = caps;
   }
 
@@ -360,7 +360,7 @@
                             nullptr /* sii */,
                             true) {}
 
-  absl::optional<gpu::Capabilities> capabilities_override_;
+  std::optional<gpu::Capabilities> capabilities_override_;
 };
 
 class FakeRasterDarkModeFilter : public RasterDarkModeFilter {
@@ -661,7 +661,7 @@
   void CompareAllPlanesToMippedVersions(
       GpuImageDecodeCache* cache,
       const DrawImage& draw_image,
-      const absl::optional<uint32_t> transfer_cache_id,
+      const std::optional<uint32_t> transfer_cache_id,
       bool should_have_mips) {
     for (size_t i = 0; i < kNumYUVPlanes; ++i) {
       sk_sp<SkImage> original_uploaded_plane;
@@ -693,7 +693,7 @@
   void VerifyUploadedPlaneSizes(
       GpuImageDecodeCache* cache,
       const DrawImage& draw_image,
-      const absl::optional<uint32_t> transfer_cache_id,
+      const std::optional<uint32_t> transfer_cache_id,
       const SkISize plane_sizes[SkYUVAInfo::kMaxPlanes],
       SkYUVAPixmapInfo::DataType expected_type =
           SkYUVAPixmapInfo::DataType::kUnorm8,
@@ -3236,7 +3236,7 @@
     // it attached.
     DecodedDrawImage serialized_decoded_draw_image =
         cache->GetDecodedImageForDraw(draw_image);
-    const absl::optional<uint32_t> transfer_cache_entry_id =
+    const std::optional<uint32_t> transfer_cache_entry_id =
         serialized_decoded_draw_image.transfer_cache_entry_id();
     DecodedDrawImage decoded_draw_image =
         EnsureImageBacked(std::move(serialized_decoded_draw_image));
@@ -3307,7 +3307,7 @@
     // it attached.
     DecodedDrawImage serialized_decoded_draw_image =
         cache->GetDecodedImageForDraw(draw_image);
-    const absl::optional<uint32_t> transfer_cache_entry_id =
+    const std::optional<uint32_t> transfer_cache_entry_id =
         serialized_decoded_draw_image.transfer_cache_entry_id();
     DecodedDrawImage decoded_draw_image =
         EnsureImageBacked(std::move(serialized_decoded_draw_image));
@@ -3355,7 +3355,7 @@
     // it attached.
     DecodedDrawImage serialized_decoded_draw_image =
         cache->GetDecodedImageForDraw(draw_image);
-    const absl::optional<uint32_t> transfer_cache_entry_id =
+    const std::optional<uint32_t> transfer_cache_entry_id =
         serialized_decoded_draw_image.transfer_cache_entry_id();
     DecodedDrawImage decoded_draw_image =
         EnsureImageBacked(std::move(serialized_decoded_draw_image));
@@ -3412,7 +3412,7 @@
     // it attached.
     DecodedDrawImage serialized_decoded_draw_image =
         cache->GetDecodedImageForDraw(draw_image);
-    const absl::optional<uint32_t> transfer_cache_entry_id =
+    const std::optional<uint32_t> transfer_cache_entry_id =
         serialized_decoded_draw_image.transfer_cache_entry_id();
     DecodedDrawImage decoded_draw_image =
         EnsureImageBacked(std::move(serialized_decoded_draw_image));
@@ -3453,7 +3453,7 @@
     // it attached.
     DecodedDrawImage serialized_decoded_draw_image =
         cache->GetDecodedImageForDraw(draw_image);
-    const absl::optional<uint32_t> transfer_cache_entry_id =
+    const std::optional<uint32_t> transfer_cache_entry_id =
         serialized_decoded_draw_image.transfer_cache_entry_id();
     DecodedDrawImage decoded_draw_image =
         EnsureImageBacked(std::move(serialized_decoded_draw_image));
@@ -3552,7 +3552,7 @@
     // it attached.
     DecodedDrawImage serialized_decoded_draw_image =
         cache->GetDecodedImageForDraw(draw_image);
-    const absl::optional<uint32_t> transfer_cache_entry_id =
+    const std::optional<uint32_t> transfer_cache_entry_id =
         serialized_decoded_draw_image.transfer_cache_entry_id();
     DecodedDrawImage decoded_draw_image =
         EnsureImageBacked(std::move(serialized_decoded_draw_image));
@@ -3650,7 +3650,7 @@
     // it attached.
     DecodedDrawImage serialized_decoded_draw_image =
         cache->GetDecodedImageForDraw(draw_image);
-    const absl::optional<uint32_t> transfer_cache_entry_id =
+    const std::optional<uint32_t> transfer_cache_entry_id =
         serialized_decoded_draw_image.transfer_cache_entry_id();
     DecodedDrawImage decoded_draw_image =
         EnsureImageBacked(std::move(serialized_decoded_draw_image));
@@ -3863,7 +3863,7 @@
         // has it attached.
         DecodedDrawImage serialized_decoded_draw_image =
             cache->GetDecodedImageForDraw(draw_image);
-        const absl::optional<uint32_t> transfer_cache_entry_id =
+        const std::optional<uint32_t> transfer_cache_entry_id =
             serialized_decoded_draw_image.transfer_cache_entry_id();
         DecodedDrawImage decoded_draw_image =
             EnsureImageBacked(std::move(serialized_decoded_draw_image));
diff --git a/cc/tiles/image_controller_unittest.cc b/cc/tiles/image_controller_unittest.cc
index 4ed33efe..47f5c79 100644
--- a/cc/tiles/image_controller_unittest.cc
+++ b/cc/tiles/image_controller_unittest.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include <optional>
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/run_loop.h"
@@ -23,7 +24,6 @@
 #include "cc/test/test_paint_worklet_input.h"
 #include "cc/tiles/image_decode_cache.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 namespace {
diff --git a/cc/tiles/software_image_decode_cache.cc b/cc/tiles/software_image_decode_cache.cc
index 8025fde..969f9ba 100644
--- a/cc/tiles/software_image_decode_cache.cc
+++ b/cc/tiles/software_image_decode_cache.cc
@@ -392,7 +392,7 @@
   } else {
     // Attempt to find a cached decode to generate a scaled/subrected decode
     // from.
-    absl::optional<CacheKey> candidate_key = FindCachedCandidate(key);
+    std::optional<CacheKey> candidate_key = FindCachedCandidate(key);
 
     SkISize desired_size = gfx::SizeToSkISize(key.target_size());
     const bool should_decode_to_scale =
@@ -500,7 +500,7 @@
   return TaskProcessingResult::kFullDecode;
 }
 
-absl::optional<SoftwareImageDecodeCache::CacheKey>
+std::optional<SoftwareImageDecodeCache::CacheKey>
 SoftwareImageDecodeCache::FindCachedCandidate(const CacheKey& key) {
   auto image_keys_it = frame_key_to_image_keys_.find(key.frame_key());
   // We know that we must have at least our own |entry| in this list, so it
@@ -534,7 +534,7 @@
     }
   }
 
-  return absl::nullopt;
+  return std::nullopt;
 }
 
 bool SoftwareImageDecodeCache::UseCacheForDrawImage(
diff --git a/cc/tiles/software_image_decode_cache.h b/cc/tiles/software_image_decode_cache.h
index dd32486..02d35d6 100644
--- a/cc/tiles/software_image_decode_cache.h
+++ b/cc/tiles/software_image_decode_cache.h
@@ -134,7 +134,7 @@
       EXCLUSIVE_LOCKS_REQUIRED(lock_);
   void RemoveBudgetForImage(const CacheKey& key, CacheEntry* entry)
       EXCLUSIVE_LOCKS_REQUIRED(lock_);
-  absl::optional<CacheKey> FindCachedCandidate(const CacheKey& key)
+  std::optional<CacheKey> FindCachedCandidate(const CacheKey& key)
       EXCLUSIVE_LOCKS_REQUIRED(lock_);
 
   void UnrefImage(const CacheKey& key) EXCLUSIVE_LOCKS_REQUIRED(lock_);
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index 6d17130..d7e8dbc 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -10,6 +10,7 @@
 #include <limits>
 #include <string>
 
+#include <optional>
 #include "base/containers/contains.h"
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
@@ -43,7 +44,6 @@
 #include "cc/tiles/tile_priority.h"
 #include "cc/tiles/tiles_with_resource_iterator.h"
 #include "components/viz/common/resources/resource_sizes.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/axis_transform2d.h"
 #include "ui/gfx/geometry/rect_conversions.h"
 
@@ -1484,7 +1484,7 @@
           has_at_raster_images, has_hardware_accelerated_jpeg_candidates,
           has_hardware_accelerated_webp_candidates);
 
-  absl::optional<PlaybackImageProvider::Settings> settings;
+  std::optional<PlaybackImageProvider::Settings> settings;
   if (!skip_images) {
     settings.emplace();
     settings->images_to_skip = std::move(images_to_skip);
diff --git a/cc/tiles/tiles_with_resource_iterator.h b/cc/tiles/tiles_with_resource_iterator.h
index 89b8063..641b440 100644
--- a/cc/tiles/tiles_with_resource_iterator.h
+++ b/cc/tiles/tiles_with_resource_iterator.h
@@ -8,11 +8,11 @@
 #include <set>
 #include <vector>
 
+#include <optional>
 #include "base/memory/raw_ptr.h"
 #include "cc/cc_export.h"
 #include "cc/tiles/picture_layer_tiling.h"
 #include "cc/tiles/prioritized_tile.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -73,14 +73,14 @@
 
   // Iterates over the tiles from the current PictureLayerTiling. If this is
   // not set, the end has been reached.
-  absl::optional<PictureLayerTiling::TileIterator> tile_iterator_;
+  std::optional<PictureLayerTiling::TileIterator> tile_iterator_;
 
   // Set of tiles that have been visited. Used to ensure the same tile isn't
   // visited more than once.
   std::set<Tile*> visited_;
 
   // Created when GetCurrentAsPrioritizedTile() is called.
-  absl::optional<PrioritizedTile> prioritized_tile_;
+  std::optional<PrioritizedTile> prioritized_tile_;
 };
 
 }  // namespace cc
diff --git a/cc/trees/compositor_commit_data.cc b/cc/trees/compositor_commit_data.cc
index e50eef4..c09d3c3 100644
--- a/cc/trees/compositor_commit_data.cc
+++ b/cc/trees/compositor_commit_data.cc
@@ -17,7 +17,7 @@
 CompositorCommitData::ScrollUpdateInfo::ScrollUpdateInfo(
     ElementId id,
     gfx::Vector2dF delta,
-    absl::optional<TargetSnapAreaElementIds> snap_target_ids)
+    std::optional<TargetSnapAreaElementIds> snap_target_ids)
     : element_id(id),
       scroll_delta(delta),
       snap_target_element_ids(snap_target_ids) {}
diff --git a/cc/trees/compositor_commit_data.h b/cc/trees/compositor_commit_data.h
index 0d39b319..ac59360 100644
--- a/cc/trees/compositor_commit_data.h
+++ b/cc/trees/compositor_commit_data.h
@@ -8,12 +8,12 @@
 #include <memory>
 #include <vector>
 
+#include <optional>
 #include "cc/cc_export.h"
 #include "cc/input/browser_controls_state.h"
 #include "cc/input/scroll_snap_data.h"
 #include "cc/paint/element_id.h"
 #include "cc/trees/layer_tree_host_client.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/transform.h"
 #include "ui/gfx/geometry/vector2d.h"
 
@@ -32,7 +32,7 @@
     ScrollUpdateInfo();
     ScrollUpdateInfo(ElementId id,
                      gfx::Vector2dF delta,
-                     absl::optional<TargetSnapAreaElementIds> snap_target_ids);
+                     std::optional<TargetSnapAreaElementIds> snap_target_ids);
     ScrollUpdateInfo(const ScrollUpdateInfo& other);
     ScrollUpdateInfo& operator=(const ScrollUpdateInfo&);
     ElementId element_id;
@@ -41,7 +41,7 @@
     // The target snap area element ids of the scrolling element.
     // This will have a value if the scrolled element's scroll node has snap
     // container data and the scroll delta is non-zero.
-    absl::optional<TargetSnapAreaElementIds> snap_target_element_ids;
+    std::optional<TargetSnapAreaElementIds> snap_target_element_ids;
 
     bool operator==(const ScrollUpdateInfo& other) const {
       return element_id == other.element_id &&
diff --git a/cc/trees/effect_node.h b/cc/trees/effect_node.h
index 45cbaac2..ebcf43b 100644
--- a/cc/trees/effect_node.h
+++ b/cc/trees/effect_node.h
@@ -5,13 +5,13 @@
 #ifndef CC_TREES_EFFECT_NODE_H_
 #define CC_TREES_EFFECT_NODE_H_
 
+#include <optional>
 #include "cc/cc_export.h"
 #include "cc/paint/element_id.h"
 #include "cc/paint/filter_operations.h"
 #include "cc/view_transition/view_transition_element_id.h"
 #include "components/viz/common/surfaces/subtree_capture_id.h"
 #include "components/viz/common/view_transition_element_resource_id.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkBlendMode.h"
 #include "ui/gfx/geometry/mask_filter_info.h"
 #include "ui/gfx/geometry/point_f.h"
@@ -80,7 +80,7 @@
 
   FilterOperations filters;
   FilterOperations backdrop_filters;
-  absl::optional<gfx::RRectF> backdrop_filter_bounds;
+  std::optional<gfx::RRectF> backdrop_filter_bounds;
   float backdrop_filter_quality;
   gfx::PointF filters_origin;
 
diff --git a/cc/trees/image_animation_controller.cc b/cc/trees/image_animation_controller.cc
index bf10a009..24a6a558 100644
--- a/cc/trees/image_animation_controller.cc
+++ b/cc/trees/image_animation_controller.cc
@@ -83,7 +83,7 @@
   DCHECK(images_animated_on_sync_tree_.empty());
 
   scheduler_.WillAnimate();
-  absl::optional<base::TimeTicks> next_invalidation_time;
+  std::optional<base::TimeTicks> next_invalidation_time;
 
   for (auto id : registered_animations_) {
     auto it = animation_state_map_.find(id);
@@ -136,7 +136,7 @@
 void ImageAnimationController::UpdateStateFromDrivers() {
   TRACE_EVENT0("cc", "UpdateStateFromAnimationDrivers");
 
-  absl::optional<base::TimeTicks> next_invalidation_time;
+  std::optional<base::TimeTicks> next_invalidation_time;
   for (auto image_id : registered_animations_) {
     auto it = animation_state_map_.find(image_id);
     DCHECK(it != animation_state_map_.end());
diff --git a/cc/trees/image_animation_controller_unittest.cc b/cc/trees/image_animation_controller_unittest.cc
index 7e301df..c73cc54 100644
--- a/cc/trees/image_animation_controller_unittest.cc
+++ b/cc/trees/image_animation_controller_unittest.cc
@@ -69,7 +69,7 @@
  private:
   ~DelayTrackingTaskRunner() override = default;
 
-  absl::optional<base::TimeDelta> last_delay_;
+  std::optional<base::TimeDelta> last_delay_;
   raw_ptr<base::SingleThreadTaskRunner> task_runner_;
 };
 
diff --git a/cc/trees/layer_tree_frame_sink_client.h b/cc/trees/layer_tree_frame_sink_client.h
index 25932a7..f1e50b0 100644
--- a/cc/trees/layer_tree_frame_sink_client.h
+++ b/cc/trees/layer_tree_frame_sink_client.h
@@ -5,13 +5,12 @@
 #ifndef CC_TREES_LAYER_TREE_FRAME_SINK_CLIENT_H_
 #define CC_TREES_LAYER_TREE_FRAME_SINK_CLIENT_H_
 
+#include <optional>
 #include <vector>
-
 #include "base/functional/callback.h"
 #include "cc/cc_export.h"
 #include "components/viz/common/resources/returned_resource.h"
 #include "components/viz/common/surfaces/local_surface_id.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/rect.h"
 
 namespace gfx {
@@ -39,7 +38,7 @@
   // called during SubmitCompositorFrame().
   // TODO(danakj): Just pass it into SubmitCompositorFrame(), with a
   // LayerTreeSetting to enable it or not.
-  virtual absl::optional<viz::HitTestRegionList> BuildHitTestData() = 0;
+  virtual std::optional<viz::HitTestRegionList> BuildHitTestData() = 0;
 
   // Returns resources sent to SubmitCompositorFrame to be reused or freed.
   virtual void ReclaimResources(
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index b1768fa..3795ad8b 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -687,7 +687,7 @@
 void LayerTreeHost::OnDeferCommitsChanged(
     bool defer_status,
     PaintHoldingReason reason,
-    absl::optional<PaintHoldingCommitTrigger> trigger) {
+    std::optional<PaintHoldingCommitTrigger> trigger) {
   DCHECK(IsMainThread());
   client_->OnDeferCommitsChanged(defer_status, reason, trigger);
 }
@@ -1048,7 +1048,7 @@
 void LayerTreeHost::UpdateScrollOffsetFromImpl(
     const ElementId& id,
     const gfx::Vector2dF& delta,
-    const absl::optional<TargetSnapAreaElementIds>& snap_target_ids) {
+    const std::optional<TargetSnapAreaElementIds>& snap_target_ids) {
   if (IsUsingLayerLists()) {
     auto& scroll_tree = property_trees()->scroll_tree_mutable();
     auto new_offset = scroll_tree.current_scroll_offset(id) + delta;
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h
index d6f9d33..d83833e 100644
--- a/cc/trees/layer_tree_host.h
+++ b/cc/trees/layer_tree_host.h
@@ -16,6 +16,7 @@
 #include <utility>
 #include <vector>
 
+#include <optional>
 #include "base/cancelable_callback.h"
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
@@ -63,7 +64,6 @@
 #include "cc/trees/viewport_property_ids.h"
 #include "components/viz/common/surfaces/local_surface_id.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/delegated_ink_metadata.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/overlay_transform.h"
@@ -344,7 +344,7 @@
   // Notification that the proxy started or stopped deferring commits.
   void OnDeferCommitsChanged(bool defer_status,
                              PaintHoldingReason reason,
-                             absl::optional<PaintHoldingCommitTrigger> trigger);
+                             std::optional<PaintHoldingCommitTrigger> trigger);
 
   // Returns whether there are any outstanding ScopedDeferMainFrameUpdate,
   // though commits may be deferred also when the local_surface_id_from_parent()
@@ -989,7 +989,7 @@
   void UpdateScrollOffsetFromImpl(
       const ElementId&,
       const gfx::Vector2dF& delta,
-      const absl::optional<TargetSnapAreaElementIds>&);
+      const std::optional<TargetSnapAreaElementIds>&);
 
   const CompositorMode compositor_mode_;
 
diff --git a/cc/trees/layer_tree_host_client.h b/cc/trees/layer_tree_host_client.h
index 377e2cd8..abcd6ad 100644
--- a/cc/trees/layer_tree_host_client.h
+++ b/cc/trees/layer_tree_host_client.h
@@ -135,7 +135,7 @@
   virtual void OnDeferCommitsChanged(
       bool defer_status,
       PaintHoldingReason reason,
-      absl::optional<PaintHoldingCommitTrigger> trigger) = 0;
+      std::optional<PaintHoldingCommitTrigger> trigger) = 0;
 
   // Notification that a compositing update has been requested.
   virtual void OnCommitRequested() = 0;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 41ac9d2..75adec33 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -14,6 +14,7 @@
 #include <string>
 #include <vector>
 
+#include <optional>
 #include "base/auto_reset.h"
 #include "base/command_line.h"
 #include "base/compiler_specific.h"
@@ -124,7 +125,6 @@
 #include "gpu/command_buffer/common/shared_image_capabilities.h"
 #include "gpu/command_buffer/common/shared_image_usage.h"
 #include "services/metrics/public/cpp/ukm_recorder.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_latency_info.pbzero.h"
 #include "third_party/skia/include/core/SkSurface.h"
 #include "third_party/skia/include/gpu/GrDirectContext.h"
@@ -849,7 +849,7 @@
     for (const auto& entry : layer->GetPaintWorkletRecordMap()) {
       const scoped_refptr<const PaintWorkletInput>& input = entry.first;
       const PaintImage::Id& paint_image_id = entry.second.first;
-      const absl::optional<PaintRecord>& record = entry.second.second;
+      const std::optional<PaintRecord>& record = entry.second.second;
       // If we already have a record we can reuse it and so the
       // PaintWorkletInput isn't dirty.
       if (record)
@@ -1166,7 +1166,7 @@
       target_render_pass->CreateAndAppendSharedQuadState();
   shared_quad_state->SetAll(
       gfx::Transform(), root_target_rect, root_target_rect,
-      gfx::MaskFilterInfo(), absl::nullopt, screen_background_color.isOpaque(),
+      gfx::MaskFilterInfo(), std::nullopt, screen_background_color.isOpaque(),
       /*opacity_f=*/1.f, SkBlendMode::kSrcOver, /*sorting_context=*/0,
       /*layer_id=*/0u, /*fast_rounded_corner=*/false);
 
@@ -2484,7 +2484,7 @@
   return metadata;
 }
 
-absl::optional<LayerTreeHostImpl::SubmitInfo> LayerTreeHostImpl::DrawLayers(
+std::optional<LayerTreeHostImpl::SubmitInfo> LayerTreeHostImpl::DrawLayers(
     FrameData* frame) {
   DCHECK(CanDraw());
   DCHECK_EQ(frame->has_no_damage, frame->render_passes.empty());
@@ -2509,7 +2509,7 @@
       std::ignore = events_metrics_manager_.TakeSavedEventsMetrics();
     }
 
-    return absl::nullopt;
+    return std::nullopt;
   }
 
   layer_tree_frame_sink_->set_source_frame_number(
@@ -3132,10 +3132,10 @@
   hit_test_region->transform = surface_to_root_transform.InverseOrIdentity();
 }
 
-absl::optional<viz::HitTestRegionList> LayerTreeHostImpl::BuildHitTestData() {
+std::optional<viz::HitTestRegionList> LayerTreeHostImpl::BuildHitTestData() {
   TRACE_EVENT0("cc", "LayerTreeHostImpl::BuildHitTestData");
 
-  absl::optional<viz::HitTestRegionList> hit_test_region_list(absl::in_place);
+  std::optional<viz::HitTestRegionList> hit_test_region_list(std::in_place);
   hit_test_region_list->flags = viz::HitTestRegionFlags::kHitTestMine |
                                 viz::HitTestRegionFlags::kHitTestMouse |
                                 viz::HitTestRegionFlags::kHitTestTouch;
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index aa4b0ad..316a9865 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -14,6 +14,7 @@
 #include <utility>
 #include <vector>
 
+#include <optional>
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
 #include "base/containers/lru_cache.h"
@@ -68,7 +69,6 @@
 #include "components/viz/common/surfaces/region_capture_bounds.h"
 #include "components/viz/common/surfaces/surface_id.h"
 #include "components/viz/common/surfaces/surface_range.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/rect.h"
 
 namespace gfx {
@@ -215,7 +215,7 @@
     bool has_missing_content = false;
 
     std::vector<viz::SurfaceId> activation_dependencies;
-    absl::optional<uint32_t> deadline_in_frames;
+    std::optional<uint32_t> deadline_in_frames;
     bool use_default_lower_bound_deadline = false;
     viz::CompositorRenderPassList render_passes;
     raw_ptr<const RenderSurfaceList> render_surface_list = nullptr;
@@ -471,14 +471,14 @@
   // regardless of whether `DrawLayers()` is called between the two.
   virtual DrawResult PrepareToDraw(FrameData* frame);
 
-  // If there is no damage, returns `absl::nullopt`; otherwise, returns
+  // If there is no damage, returns `std::nullopt`; otherwise, returns
   // information about the submitted frame including submit time and a set of
   // `EventMetrics` for the frame.
   struct SubmitInfo {
     base::TimeTicks time;
     EventMetricsSet events_metrics;
   };
-  virtual absl::optional<SubmitInfo> DrawLayers(FrameData* frame);
+  virtual std::optional<SubmitInfo> DrawLayers(FrameData* frame);
 
   // Must be called if and only if PrepareToDraw was called.
   void DidDrawAllLayers(const FrameData& frame);
@@ -560,7 +560,7 @@
   void SetExternalTilePriorityConstraints(
       const gfx::Rect& viewport_rect,
       const gfx::Transform& transform) override;
-  absl::optional<viz::HitTestRegionList> BuildHitTestData() override;
+  std::optional<viz::HitTestRegionList> BuildHitTestData() override;
   void DidLoseLayerTreeFrameSink() override;
   void DidReceiveCompositorFrameAck() override;
   void DidPresentCompositorFrame(
@@ -1238,7 +1238,7 @@
 
   viz::LocalSurfaceId last_draw_local_surface_id_;
   base::flat_set<viz::SurfaceRange> last_draw_referenced_surfaces_;
-  absl::optional<RenderFrameMetadata> last_draw_render_frame_metadata_;
+  std::optional<RenderFrameMetadata> last_draw_render_frame_metadata_;
   // The viz::LocalSurfaceId to unthrottle drawing for.
   viz::LocalSurfaceId target_local_surface_id_;
   viz::LocalSurfaceId evicted_local_surface_id_;
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 457462f8..6ab1da4d 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -10,6 +10,7 @@
 #include <memory>
 #include <utility>
 
+#include <optional>
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/memory/memory_pressure_listener.h"
@@ -91,7 +92,6 @@
 #include "media/base/media.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkMallocPixelRef.h"
 #include "ui/events/types/scroll_input_type.h"
 #include "ui/gfx/geometry/angle_conversions.h"
@@ -773,9 +773,9 @@
     return overflow;
   }
 
-  absl::optional<SnapContainerData> GetSnapContainerData(LayerImpl* layer) {
+  std::optional<SnapContainerData> GetSnapContainerData(LayerImpl* layer) {
     return GetScrollNode(layer) ? GetScrollNode(layer)->snap_container_data
-                                : absl::nullopt;
+                                : std::nullopt;
   }
 
   void ClearLayersAndPropertyTrees(LayerTreeImpl* layer_tree_impl) {
@@ -16752,13 +16752,13 @@
   void DidEndScroll() override {}
 #endif
 
-  const absl::optional<RenderFrameMetadata>& last_metadata() const {
+  const std::optional<RenderFrameMetadata>& last_metadata() const {
     return last_metadata_;
   }
 
  private:
   bool increment_counter_;
-  absl::optional<RenderFrameMetadata> last_metadata_;
+  std::optional<RenderFrameMetadata> last_metadata_;
 };
 
 TEST_F(LayerTreeHostImplTest, RenderFrameMetadata) {
@@ -17127,10 +17127,10 @@
                                              base::UnguessableToken::Create());
   viz::FrameSinkId frame_sink_id(2, 0);
   viz::SurfaceId child_surface_id(frame_sink_id, child_local_surface_id);
-  surface_child1->SetRange(viz::SurfaceRange(absl::nullopt, child_surface_id),
-                           absl::nullopt);
-  surface_child2->SetRange(viz::SurfaceRange(absl::nullopt, child_surface_id),
-                           absl::nullopt);
+  surface_child1->SetRange(viz::SurfaceRange(std::nullopt, child_surface_id),
+                           std::nullopt);
+  surface_child2->SetRange(viz::SurfaceRange(std::nullopt, child_surface_id),
+                           std::nullopt);
 
   CopyProperties(root, intermediate_layer);
   intermediate_layer->SetOffsetToTransformParent(gfx::Vector2dF(200, 300));
@@ -17151,7 +17151,7 @@
 
   constexpr gfx::Rect kFrameRect(0, 0, 1024, 768);
 
-  absl::optional<viz::HitTestRegionList> hit_test_region_list =
+  std::optional<viz::HitTestRegionList> hit_test_region_list =
       host_impl_->BuildHitTestData();
   // Generating HitTestRegionList should have been enabled for this test.
   ASSERT_TRUE(hit_test_region_list);
@@ -17225,13 +17225,13 @@
                                              base::UnguessableToken::Create());
   viz::FrameSinkId frame_sink_id(2, 0);
   viz::SurfaceId child_surface_id(frame_sink_id, child_local_surface_id);
-  surface_child1->SetRange(viz::SurfaceRange(absl::nullopt, child_surface_id),
-                           absl::nullopt);
+  surface_child1->SetRange(viz::SurfaceRange(std::nullopt, child_surface_id),
+                           std::nullopt);
 
   constexpr gfx::Rect kFrameRect(0, 0, 1024, 768);
 
   UpdateDrawProperties(host_impl_->active_tree());
-  absl::optional<viz::HitTestRegionList> hit_test_region_list =
+  std::optional<viz::HitTestRegionList> hit_test_region_list =
       host_impl_->BuildHitTestData();
   // Generating HitTestRegionList should have been enabled for this test.
   ASSERT_TRUE(hit_test_region_list);
@@ -17281,8 +17281,8 @@
                                              base::UnguessableToken::Create());
   viz::FrameSinkId frame_sink_id(2, 0);
   viz::SurfaceId child_surface_id(frame_sink_id, child_local_surface_id);
-  surface_child->SetRange(viz::SurfaceRange(absl::nullopt, child_surface_id),
-                          absl::nullopt);
+  surface_child->SetRange(viz::SurfaceRange(std::nullopt, child_surface_id),
+                          std::nullopt);
 
   CopyProperties(root, surface_child);
 
@@ -17298,7 +17298,7 @@
   constexpr gfx::Rect kFrameRect(0, 0, 1024, 768);
 
   UpdateDrawProperties(host_impl_->active_tree());
-  absl::optional<viz::HitTestRegionList> hit_test_region_list =
+  std::optional<viz::HitTestRegionList> hit_test_region_list =
       host_impl_->BuildHitTestData();
   // Generating HitTestRegionList should have been enabled for this test.
   ASSERT_TRUE(hit_test_region_list);
@@ -17351,8 +17351,8 @@
                                              base::UnguessableToken::Create());
   viz::FrameSinkId frame_sink_id(2, 0);
   viz::SurfaceId child_surface_id(frame_sink_id, child_local_surface_id);
-  surface_child1->SetRange(viz::SurfaceRange(absl::nullopt, child_surface_id),
-                           absl::nullopt);
+  surface_child1->SetRange(viz::SurfaceRange(std::nullopt, child_surface_id),
+                           std::nullopt);
 
   auto* surface_child2 = AddLayer<SurfaceLayerImpl>(host_impl_->active_tree());
 
@@ -17363,13 +17363,13 @@
   surface_child2->SetHasPointerEventsNone(false);
   CopyProperties(root, surface_child2);
 
-  surface_child2->SetRange(viz::SurfaceRange(absl::nullopt, viz::SurfaceId()),
-                           absl::nullopt);
+  surface_child2->SetRange(viz::SurfaceRange(std::nullopt, viz::SurfaceId()),
+                           std::nullopt);
 
   constexpr gfx::Rect kFrameRect(0, 0, 1024, 768);
 
   UpdateDrawProperties(host_impl_->active_tree());
-  absl::optional<viz::HitTestRegionList> hit_test_region_list =
+  std::optional<viz::HitTestRegionList> hit_test_region_list =
       host_impl_->BuildHitTestData();
   // Generating HitTestRegionList should have been enabled for this test.
   ASSERT_TRUE(hit_test_region_list);
diff --git a/cc/trees/layer_tree_host_pixeltest_blending.cc b/cc/trees/layer_tree_host_pixeltest_blending.cc
index 7843c31c..553ec08cf 100644
--- a/cc/trees/layer_tree_host_pixeltest_blending.cc
+++ b/cc/trees/layer_tree_host_pixeltest_blending.cc
@@ -250,7 +250,10 @@
     {viz::RendererType::kSkiaVk, TestRasterType::kGpu},
 #endif  // BUILDFLAG(ENABLE_VULKAN_BACKEND_TESTS)
 #if BUILDFLAG(ENABLE_SKIA_GRAPHITE_TESTS)
-    {viz::RendererType::kSkiaGraphite, TestRasterType::kGpu},
+    {viz::RendererType::kSkiaGraphiteDawn, TestRasterType::kGpu},
+#if BUILDFLAG(IS_IOS)
+    {viz::RendererType::kSkiaGraphiteMetal, TestRasterType::kGpu},
+#endif  // BUILDFLAG(IS_IOS)
 #endif  // BUILDFLAG(ENABLE_SKIA_GRAPHITE_TESTS)
 };
 
diff --git a/cc/trees/layer_tree_host_pixeltest_filters.cc b/cc/trees/layer_tree_host_pixeltest_filters.cc
index 6fb1679..55e4904 100644
--- a/cc/trees/layer_tree_host_pixeltest_filters.cc
+++ b/cc/trees/layer_tree_host_pixeltest_filters.cc
@@ -36,7 +36,8 @@
         return "skia_gl";
       case viz::RendererType::kSkiaVk:
         return "skia_vk";
-      case viz::RendererType::kSkiaGraphite:
+      case viz::RendererType::kSkiaGraphiteDawn:
+      case viz::RendererType::kSkiaGraphiteMetal:
         return "skia_graphite";
       case viz::RendererType::kSoftware:
         return "sw";
diff --git a/cc/trees/layer_tree_host_pixeltest_readback.cc b/cc/trees/layer_tree_host_pixeltest_readback.cc
index 7129044..255d959 100644
--- a/cc/trees/layer_tree_host_pixeltest_readback.cc
+++ b/cc/trees/layer_tree_host_pixeltest_readback.cc
@@ -492,8 +492,12 @@
     ReadbackTestConfig{viz::RendererType::kSkiaVk, TestReadBackType::kTexture},
 #endif  // BUILDFLAG(ENABLE_VULKAN_BACKEND_TESTS)
 #if BUILDFLAG(ENABLE_SKIA_GRAPHITE_TESTS)
-    ReadbackTestConfig{viz::RendererType::kSkiaGraphite,
+    ReadbackTestConfig{viz::RendererType::kSkiaGraphiteDawn,
                        TestReadBackType::kBitmap},
+#if BUILDFLAG(IS_IOS)
+    ReadbackTestConfig{viz::RendererType::kSkiaGraphiteMetal,
+                       TestReadBackType::kBitmap},
+#endif  // BUILDFLAG(IS_IOS)
 #endif  // BUILDFLAG(ENABLE_SKIA_GRAPHITE_TESTS)
 };
 
diff --git a/cc/trees/layer_tree_host_pixeltest_tiles.cc b/cc/trees/layer_tree_host_pixeltest_tiles.cc
index 2b1dea0..d3e558c5 100644
--- a/cc/trees/layer_tree_host_pixeltest_tiles.cc
+++ b/cc/trees/layer_tree_host_pixeltest_tiles.cc
@@ -228,7 +228,10 @@
     {viz::RendererType::kSkiaVk, TestRasterType::kGpu},
 #endif  // BUILDFLAG(ENABLE_VULKAN_BACKEND_TESTS)
 #if BUILDFLAG(ENABLE_SKIA_GRAPHITE_TESTS)
-    {viz::RendererType::kSkiaGraphite, TestRasterType::kGpu},
+    {viz::RendererType::kSkiaGraphiteDawn, TestRasterType::kGpu},
+#if BUILDFLAG(IS_IOS)
+    {viz::RendererType::kSkiaGraphiteMetal, TestRasterType::kGpu},
+#endif  // BUILDFLAG(IS_IOS)
 #endif  // BUILDFLAG(ENABLE_SKIA_GRAPHITE_TESTS)
 };
 
@@ -274,7 +277,10 @@
     {viz::RendererType::kSkiaVk, TestRasterType::kGpu},
 #endif  // BUILDFLAG(ENABLE_VULKAN_BACKEND_TESTS)
 #if BUILDFLAG(ENABLE_SKIA_GRAPHITE_TESTS)
-    {viz::RendererType::kSkiaGraphite, TestRasterType::kGpu},
+    {viz::RendererType::kSkiaGraphiteDawn, TestRasterType::kGpu},
+#if BUILDFLAG(IS_IOS)
+    {viz::RendererType::kSkiaGraphiteMetal, TestRasterType::kGpu},
+#endif  // BUILDFLAG(IS_IOS)
 #endif  // BUILDFLAG(ENABLE_SKIA_GRAPHITE_TESTS)
 };
 
@@ -337,6 +343,9 @@
 }
 
 TEST_P(LayerTreeHostTilesTestRasterColorSpace, GenericRGB) {
+#if BUILDFLAG(IS_IOS)
+  pixel_comparator_ = std::make_unique<FuzzyPixelOffByOneComparator>();
+#endif
   SetColorSpace(gfx::ColorSpace(gfx::ColorSpace::PrimaryID::APPLE_GENERIC_RGB,
                                 gfx::ColorSpace::TransferID::GAMMA18));
 
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index 3f9882a..7119d18 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -3495,10 +3495,10 @@
   void AfterTest() override { EXPECT_TRUE(sent_gesture_); }
 
   // ScrollCallbacks
-  void DidCompositorScroll(ElementId element_id,
-                           const gfx::PointF& scroll_offset,
-                           const absl::optional<TargetSnapAreaElementIds>&
-                               snap_target_ids) override {
+  void DidCompositorScroll(
+      ElementId element_id,
+      const gfx::PointF& scroll_offset,
+      const std::optional<TargetSnapAreaElementIds>& snap_target_ids) override {
     last_scrolled_element_id_ = element_id;
     last_scrolled_offset_ = scroll_offset;
   }
@@ -9244,9 +9244,9 @@
 
   // Check DelegatedInkMetadata on the CompositorFrameMetadata when the
   // compositor frame is submitted.
-  void ExpectMetadata(absl::optional<DelegatedInkBrowserMetadata>
-                          browser_delegated_ink_metadata,
-                      gfx::DelegatedInkMetadata* actual_metadata) {
+  void ExpectMetadata(
+      std::optional<DelegatedInkBrowserMetadata> browser_delegated_ink_metadata,
+      gfx::DelegatedInkMetadata* actual_metadata) {
     if (expected_metadata_.has_value()) {
       EXPECT_TRUE(browser_delegated_ink_metadata.has_value());
       EXPECT_TRUE(actual_metadata);
@@ -9286,7 +9286,7 @@
 #endif
 
  protected:
-  absl::optional<gfx::DelegatedInkMetadata> expected_metadata_;
+  std::optional<gfx::DelegatedInkMetadata> expected_metadata_;
   base::TimeTicks metadata_frame_time_;
   FakeContentLayerClient client_;
   scoped_refptr<Layer> layer_;
@@ -9489,7 +9489,7 @@
             /*is_inertial=*/false,
             ScrollUpdateEventMetrics::ScrollUpdateType::kContinued,
             /*delta=*/10.0f, event_time, arrived_in_browser_main_timestamp,
-            &tick_clock, absl::nullopt);
+            &tick_clock, std::nullopt);
     DCHECK_NE(metrics, nullptr);
     {
       tick_clock.Advance(base::Microseconds(10));
diff --git a/cc/trees/layer_tree_host_unittest_scroll.cc b/cc/trees/layer_tree_host_unittest_scroll.cc
index 0078655..80b7cdda 100644
--- a/cc/trees/layer_tree_host_unittest_scroll.cc
+++ b/cc/trees/layer_tree_host_unittest_scroll.cc
@@ -90,10 +90,10 @@
   }
 
   // ScrollCallbacks
-  void DidCompositorScroll(ElementId element_id,
-                           const gfx::PointF& scroll_offset,
-                           const absl::optional<TargetSnapAreaElementIds>&
-                               snap_target_ids) override {
+  void DidCompositorScroll(
+      ElementId element_id,
+      const gfx::PointF& scroll_offset,
+      const std::optional<TargetSnapAreaElementIds>& snap_target_ids) override {
     // Simulates cc client (e.g Blink) behavior when handling impl-side scrolls.
     SetScrollOffsetFromImplSide(layer_tree_host()->LayerByElementId(element_id),
                                 scroll_offset);
@@ -615,10 +615,10 @@
     }
   }
 
-  void DidCompositorScroll(ElementId element_id,
-                           const gfx::PointF& offset,
-                           const absl::optional<TargetSnapAreaElementIds>&
-                               snap_target_ids) override {
+  void DidCompositorScroll(
+      ElementId element_id,
+      const gfx::PointF& offset,
+      const std::optional<TargetSnapAreaElementIds>& snap_target_ids) override {
     LayerTreeHostScrollTest::DidCompositorScroll(element_id, offset,
                                                  snap_target_ids);
     if (element_id == expected_scroll_layer_->element_id()) {
@@ -1823,7 +1823,7 @@
   void DidCompositorScroll(
       ElementId element_id,
       const gfx::PointF&,
-      const absl::optional<TargetSnapAreaElementIds>&) override {
+      const std::optional<TargetSnapAreaElementIds>&) override {
     if (scroll_destroy_whole_tree_) {
       layer_tree_host()->SetRootLayer(nullptr);
       layer_tree_host()->property_trees()->clear();
diff --git a/cc/trees/layer_tree_mutator.h b/cc/trees/layer_tree_mutator.h
index 73d1a4ca..d1d7ccff 100644
--- a/cc/trees/layer_tree_mutator.h
+++ b/cc/trees/layer_tree_mutator.h
@@ -10,13 +10,13 @@
 #include <unordered_map>
 #include <vector>
 
+#include <optional>
 #include "base/check.h"
 #include "base/functional/callback_forward.h"
 #include "base/time/time.h"
 #include "cc/cc_export.h"
 #include "cc/trees/animation_effect_timings.h"
 #include "cc/trees/animation_options.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace cc {
 
@@ -146,7 +146,7 @@
     ~AnimationState();
 
     WorkletAnimationId worklet_animation_id;
-    std::vector<absl::optional<base::TimeDelta>> local_times;
+    std::vector<std::optional<base::TimeDelta>> local_times;
   };
 
   AnimationWorkletOutput();
diff --git a/cc/trees/local_layer_context.cc b/cc/trees/local_layer_context.cc
index 7b52871..1e52fd5 100644
--- a/cc/trees/local_layer_context.cc
+++ b/cc/trees/local_layer_context.cc
@@ -75,7 +75,7 @@
 void LocalLayerContext::OnDeferCommitsChanged(
     bool defer_status,
     PaintHoldingReason reason,
-    absl::optional<PaintHoldingCommitTrigger> trigger) {}
+    std::optional<PaintHoldingCommitTrigger> trigger) {}
 
 void LocalLayerContext::OnCommitRequested() {}
 
diff --git a/cc/trees/local_layer_context.h b/cc/trees/local_layer_context.h
index 4b535971..62409f0 100644
--- a/cc/trees/local_layer_context.h
+++ b/cc/trees/local_layer_context.h
@@ -43,7 +43,7 @@
   void OnDeferCommitsChanged(
       bool defer_status,
       PaintHoldingReason reason,
-      absl::optional<PaintHoldingCommitTrigger> trigger) override;
+      std::optional<PaintHoldingCommitTrigger> trigger) override;
   void OnCommitRequested() override;
   void BeginMainFrameNotExpectedSoon() override;
   void BeginMainFrameNotExpectedUntil(base::TimeTicks time) override;
diff --git a/cc/trees/mutator_host_client.h b/cc/trees/mutator_host_client.h
index 7f4bc3a6..461162c 100644
--- a/cc/trees/mutator_host_client.h
+++ b/cc/trees/mutator_host_client.h
@@ -5,12 +5,12 @@
 #ifndef CC_TREES_MUTATOR_HOST_CLIENT_H_
 #define CC_TREES_MUTATOR_HOST_CLIENT_H_
 
+#include <optional>
 #include "cc/base/protected_sequence_synchronizer.h"
 #include "cc/paint/element_id.h"
 #include "cc/paint/paint_worklet_input.h"
 #include "cc/trees/property_animation_state.h"
 #include "cc/trees/target_property.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace gfx {
 class Transform;
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc
index b2255f8..6cdb219 100644
--- a/cc/trees/property_tree.cc
+++ b/cc/trees/property_tree.cc
@@ -1712,7 +1712,7 @@
 
     ElementId id = map_entry.first;
 
-    absl::optional<TargetSnapAreaElementIds> snap_target_ids;
+    std::optional<TargetSnapAreaElementIds> snap_target_ids;
     if (snapped_elements.contains(id))
       snap_target_ids = snapped_elements.at(id);
 
@@ -1956,7 +1956,7 @@
 void ScrollTree::NotifyDidCompositorScroll(
     ElementId scroll_element_id,
     const gfx::PointF& scroll_offset,
-    const absl::optional<TargetSnapAreaElementIds>& snap_target_ids) {
+    const std::optional<TargetSnapAreaElementIds>& snap_target_ids) {
   DCHECK(property_trees()->is_main_thread());
   if (callbacks_) {
     callbacks_->DidCompositorScroll(scroll_element_id, scroll_offset,
diff --git a/cc/trees/property_tree.h b/cc/trees/property_tree.h
index c140244..1f76b357 100644
--- a/cc/trees/property_tree.h
+++ b/cc/trees/property_tree.h
@@ -14,6 +14,7 @@
 #include <utility>
 #include <vector>
 
+#include <optional>
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
 #include "base/functional/callback.h"
@@ -32,7 +33,6 @@
 #include "cc/trees/sticky_position_constraint.h"
 #include "cc/trees/transform_node.h"
 #include "components/viz/common/view_transition_element_resource_id.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/point_f.h"
 #include "ui/gfx/geometry/rect_f.h"
 #include "ui/gfx/geometry/transform.h"
@@ -467,7 +467,7 @@
   virtual void DidCompositorScroll(
       ElementId scroll_element_id,
       const gfx::PointF&,
-      const absl::optional<TargetSnapAreaElementIds>&) = 0;
+      const std::optional<TargetSnapAreaElementIds>&) = 0;
   // Called after the hidden status of composited scrollbars changed. Note that
   // |scroll_element_id| is the element id of the scroll not of the scrollbars.
   virtual void DidChangeScrollbarsHidden(ElementId scroll_element_id,
@@ -588,7 +588,7 @@
   void NotifyDidCompositorScroll(
       ElementId scroll_element_id,
       const gfx::PointF& scroll_offset,
-      const absl::optional<TargetSnapAreaElementIds>& snap_target_ids);
+      const std::optional<TargetSnapAreaElementIds>& snap_target_ids);
   void NotifyDidChangeScrollbarsHidden(ElementId scroll_element_id,
                                        bool hidden) const;
 
diff --git a/cc/trees/proxy_impl.cc b/cc/trees/proxy_impl.cc
index b00beb2..44dc9c0 100644
--- a/cc/trees/proxy_impl.cc
+++ b/cc/trees/proxy_impl.cc
@@ -896,7 +896,7 @@
   }
 
   if (draw_frame) {
-    if (absl::optional<LayerTreeHostImpl::SubmitInfo> submit_info =
+    if (std::optional<LayerTreeHostImpl::SubmitInfo> submit_info =
             host_impl_->DrawLayers(&frame)) {
       DCHECK_NE(frame.frame_token, 0u);
       // Drawing implies we submitted a frame to the LayerTreeFrameSink.
diff --git a/cc/trees/proxy_main.cc b/cc/trees/proxy_main.cc
index 5a399eda..73138cc 100644
--- a/cc/trees/proxy_main.cc
+++ b/cc/trees/proxy_main.cc
@@ -448,7 +448,7 @@
   {
     TRACE_EVENT0("cc,raf_investigation", "ProxyMain::BeginMainFrame::commit");
 
-    absl::optional<DebugScopedSetMainThreadBlocked> main_thread_blocked;
+    std::optional<DebugScopedSetMainThreadBlocked> main_thread_blocked;
     if (blocking)
       main_thread_blocked.emplace(task_runner_provider_);
 
@@ -677,7 +677,7 @@
   commits_restart_time_ = base::TimeTicks::Now() + timeout;
 
   // Notify dependent systems that the deferral status has changed.
-  layer_tree_host_->OnDeferCommitsChanged(true, reason, absl::nullopt);
+  layer_tree_host_->OnDeferCommitsChanged(true, reason, std::nullopt);
   return true;
 }
 
diff --git a/cc/trees/proxy_main.h b/cc/trees/proxy_main.h
index 185a2a3f..b8125d8d 100644
--- a/cc/trees/proxy_main.h
+++ b/cc/trees/proxy_main.h
@@ -172,7 +172,7 @@
   // defer_main_frame_update_ will also cause commits to be deferred, regardless
   // of the setting for paint_holding_reason_.
   bool defer_main_frame_update_;
-  absl::optional<PaintHoldingReason> paint_holding_reason_;
+  std::optional<PaintHoldingReason> paint_holding_reason_;
 
   bool pause_rendering_;
   bool block_on_next_commit_ = false;
diff --git a/cc/trees/render_frame_metadata.h b/cc/trees/render_frame_metadata.h
index 1e01d61..65d7e811 100644
--- a/cc/trees/render_frame_metadata.h
+++ b/cc/trees/render_frame_metadata.h
@@ -5,12 +5,12 @@
 #ifndef CC_TREES_RENDER_FRAME_METADATA_H_
 #define CC_TREES_RENDER_FRAME_METADATA_H_
 
+#include <optional>
 #include "build/build_config.h"
 #include "cc/cc_export.h"
 #include "components/viz/common/quads/selection.h"
 #include "components/viz/common/surfaces/local_surface_id.h"
 #include "components/viz/common/vertical_scroll_direction.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/geometry/size_f.h"
@@ -66,7 +66,7 @@
   SkColor4f root_background_color = SkColors::kWhite;
 
   // Scroll offset of the root layer.
-  absl::optional<gfx::PointF> root_scroll_offset;
+  std::optional<gfx::PointF> root_scroll_offset;
 
   // Selection region relative to the current viewport. If the selection is
   // empty or otherwise unused, the bound types will indicate such.
@@ -84,7 +84,7 @@
   // information to be used in making the forwarding decision. It exists the
   // entire time points could be forwarded, and forwarding must stop as soon as
   // it is null.
-  absl::optional<DelegatedInkBrowserMetadata> delegated_ink_metadata;
+  std::optional<DelegatedInkBrowserMetadata> delegated_ink_metadata;
 
   // The device scale factor used to generate a CompositorFrame.
   float device_scale_factor = 1.f;
@@ -94,7 +94,7 @@
   gfx::Size viewport_size_in_pixels;
 
   // The last viz::LocalSurfaceId used to submit a CompositorFrame.
-  absl::optional<viz::LocalSurfaceId> local_surface_id;
+  std::optional<viz::LocalSurfaceId> local_surface_id;
 
   // Page scale factor (always 1.f for sub-frame renderers).
   float page_scale_factor = 1.f;
diff --git a/cc/trees/scroll_node.h b/cc/trees/scroll_node.h
index c8edf41..dcc560b 100644
--- a/cc/trees/scroll_node.h
+++ b/cc/trees/scroll_node.h
@@ -5,13 +5,13 @@
 #ifndef CC_TREES_SCROLL_NODE_H_
 #define CC_TREES_SCROLL_NODE_H_
 
+#include <optional>
 #include "cc/base/region.h"
 #include "cc/cc_export.h"
 #include "cc/input/overscroll_behavior.h"
 #include "cc/input/scroll_snap_data.h"
 #include "cc/paint/element_id.h"
 #include "cc/paint/filter_operations.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace base {
@@ -65,7 +65,7 @@
 
   OverscrollBehavior overscroll_behavior;
 
-  absl::optional<SnapContainerData> snap_container_data;
+  std::optional<SnapContainerData> snap_container_data;
 
   bool is_composited : 1;
 
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc
index 9849b8a..aec81a9 100644
--- a/cc/trees/single_thread_proxy.cc
+++ b/cc/trees/single_thread_proxy.cc
@@ -397,7 +397,7 @@
   commits_restart_time_ = base::TimeTicks::Now() + timeout;
 
   // Notify dependent systems that the deferral status has changed.
-  layer_tree_host_->OnDeferCommitsChanged(true, reason, absl::nullopt);
+  layer_tree_host_->OnDeferCommitsChanged(true, reason, std::nullopt);
   return true;
 }
 
@@ -882,7 +882,7 @@
     draw_result = host_impl_->PrepareToDraw(frame);
     draw_frame = draw_result == DrawResult::kSuccess;
     if (draw_frame) {
-      if (absl::optional<LayerTreeHostImpl::SubmitInfo> submit_info =
+      if (std::optional<LayerTreeHostImpl::SubmitInfo> submit_info =
               host_impl_->DrawLayers(frame)) {
         if (scheduler_on_impl_thread_) {
           // Drawing implies we submitted a frame to the LayerTreeFrameSink.
diff --git a/cc/trees/single_thread_proxy.h b/cc/trees/single_thread_proxy.h
index 2dd8095..20d6b5de 100644
--- a/cc/trees/single_thread_proxy.h
+++ b/cc/trees/single_thread_proxy.h
@@ -214,7 +214,7 @@
   bool inside_draw_;
   bool defer_main_frame_update_;
   bool pause_rendering_;
-  absl::optional<PaintHoldingReason> paint_holding_reason_;
+  std::optional<PaintHoldingReason> paint_holding_reason_;
   bool did_apply_compositor_deltas_ = false;
   bool animate_requested_;
   bool update_layers_requested_;
diff --git a/cc/trees/throttle_decider_unittest.cc b/cc/trees/throttle_decider_unittest.cc
index fe096e2..3b81f172 100644
--- a/cc/trees/throttle_decider_unittest.cc
+++ b/cc/trees/throttle_decider_unittest.cc
@@ -61,7 +61,7 @@
   surface_quad->shared_quad_state = &sqs2;
   surface_quad->material = viz::DrawQuad::Material::kSurfaceContent;
   surface_quad->surface_range = viz::SurfaceRange(
-      absl::nullopt,
+      std::nullopt,
       viz::SurfaceId(frame_sink_id, viz::LocalSurfaceId(
                                         1u, base::UnguessableToken::Create())));
   surface_quad->rect = quad_rect;
@@ -75,7 +75,7 @@
 
   // Put the backdrop filter within bounds (0,10 50x50).
   render_passes[0]->backdrop_filter_bounds =
-      absl::optional<gfx::RRectF>(gfx::RRectF(0.0f, 10.0f, 50.0f, 50.0f, 1.0f));
+      std::optional<gfx::RRectF>(gfx::RRectF(0.0f, 10.0f, 50.0f, 50.0f, 1.0f));
   // The surface quad (0,0 100x100) is partially behind the backdrop filter on
   // the rpdq (0,10 50x50) so it should not be throttled.
   RunThrottleDecider(render_passes);
diff --git a/cc/trees/ukm_manager_unittest.cc b/cc/trees/ukm_manager_unittest.cc
index 2194cb8..339d436 100644
--- a/cc/trees/ukm_manager_unittest.cc
+++ b/cc/trees/ukm_manager_unittest.cc
@@ -167,7 +167,7 @@
     return SetupEventMetrics(ScrollUpdateEventMetrics::CreateForTesting(
         ui::ET_GESTURE_SCROLL_UPDATE, ui::ScrollInputType::kWheel, is_inertial,
         scroll_update_type, /*delta=*/10.0f, event_time,
-        arrived_in_browser_main_timestamp, &test_tick_clock_, absl::nullopt));
+        arrived_in_browser_main_timestamp, &test_tick_clock_, std::nullopt));
   }
 
   struct DispatchTimestamps {
diff --git a/cc/view_transition/README.md b/cc/view_transition/README.md
index 10bf4070..44d4144 100644
--- a/cc/view_transition/README.md
+++ b/cc/view_transition/README.md
@@ -1,5 +1,5 @@
-# cc/document\_transition
+# cc/view\_transition
 
-The view transition direction supports the Document Transition and Shared
-Element Transition projects in Blink. Please see
-//third\_party/blink/renderer/core/document\_transition/README.md for more details.
+The view\_transition directory supports the view transition project in Blink.
+Please see //third\_party/blink/renderer/core/view\_transition/README.md for
+more details.
diff --git a/chrome/VERSION b/chrome/VERSION
index c0e9152..a143a40 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=121
 MINOR=0
-BUILD=6120
+BUILD=6121
 PATCH=0
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 5783ed6e..b6a1940 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -129,6 +129,7 @@
   "java/src/org/chromium/chrome/browser/autofill/settings/AndroidPaymentAppPreference.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/AndroidPaymentAppsFragment.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/AutofillCreditCardEditor.java",
+  "java/src/org/chromium/chrome/browser/autofill/settings/AutofillDeleteCreditCardConfirmationDialog.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/AutofillDeleteSavedCvcsConfirmationDialog.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/AutofillEditLinkPreference.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/AutofillLocalCardEditor.java",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni
index e8f21300..237e650 100644
--- a/chrome/android/chrome_junit_test_java_sources.gni
+++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -45,6 +45,7 @@
   "junit/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptTest.java",
   "junit/src/org/chromium/chrome/browser/autofill/fp/FacilitatedPaymentBottomSheetBridgeTest.java",
   "junit/src/org/chromium/chrome/browser/autofill/fp/FacilitatedPaymentBottomSheetContentTest.java",
+  "junit/src/org/chromium/chrome/browser/autofill/settings/AutofillDeleteCreditCardConfirmationDialogTest.java",
   "junit/src/org/chromium/chrome/browser/autofill/settings/AutofillDeleteSavedCvcsConfirmationDialogTest.java",
   "junit/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardEnrollmentDialogTest.java",
   "junit/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardUnenrollmentDialogTest.java",
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
index fd6f1e1..5784b19 100644
--- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
+++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -745,7 +745,7 @@
 
             // The segmentation results should only be cached when Start is enabled, for example,
             // not on tablet.
-            if (ChromeFeatureList.sStartSurfaceReturnTime.isEnabled()) {
+            if (StartSurfaceConfiguration.START_SURFACE_RETURN_TIME_USE_MODEL.getValue()) {
                 ReturnToChromeUtil.cacheReturnTimeFromSegmentation();
             }
         }
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java
index 9f78ceb..13912ccf 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java
@@ -51,6 +51,7 @@
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ActivityTestUtils;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.user_prefs.UserPrefs;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -71,6 +72,7 @@
     ChromeFeatureList.START_SURFACE_ANDROID + "<Study",
     ChromeFeatureList.INSTANT_START
 })
+@DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
 @Restriction({
     Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE,
     UiRestriction.RESTRICTION_TYPE_PHONE
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartNewTabFromLauncherTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartNewTabFromLauncherTest.java
index c943d14b..7b4a288 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartNewTabFromLauncherTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartNewTabFromLauncherTest.java
@@ -56,6 +56,7 @@
     ChromeFeatureList.START_SURFACE_ANDROID + "<Study",
     ChromeFeatureList.INSTANT_START
 })
+@DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
 @Restriction({
     Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE,
     UiRestriction.RESTRICTION_TYPE_PHONE
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java
index b638a7a..6afd005 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java
@@ -108,6 +108,7 @@
     ChromeFeatureList.INSTANT_START,
     ChromeFeatureList.EMPTY_STATES
 })
+@DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
 @Restriction({
     Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE,
     UiRestriction.RESTRICTION_TYPE_PHONE
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
index 8340e3b..9b27779 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
@@ -99,10 +99,10 @@
     "force-fieldtrials=Study/Group"
 })
 @EnableFeatures({
-    ChromeFeatureList.START_SURFACE_ANDROID,
     ChromeFeatureList.INSTANT_START,
     ChromeFeatureList.EMPTY_STATES
 })
+@DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
 @Restriction({
     Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE,
     UiRestriction.RESTRICTION_TYPE_PHONE
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartToolbarTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartToolbarTest.java
index 2e9fa56e..a2ff76b 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartToolbarTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartToolbarTest.java
@@ -46,6 +46,7 @@
 import org.chromium.chrome.test.R;
 import org.chromium.chrome.test.util.ActivityTestUtils;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.ui.test.util.UiRestriction;
@@ -67,6 +68,7 @@
     ChromeFeatureList.START_SURFACE_ANDROID + "<Study",
     ChromeFeatureList.INSTANT_START
 })
+@DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
 @Restriction({
     Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE,
     UiRestriction.RESTRICTION_TYPE_PHONE
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java
index 8a11da89..be8af43 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java
@@ -82,6 +82,7 @@
     ChromeFeatureList.START_SURFACE_ANDROID + "<Study",
     ChromeFeatureList.EMPTY_STATES
 })
+@DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
 @DoNotBatch(reason = "StartSurface*Test tests startup behaviours and thus can't be batched.")
 @CommandLineFlags.Add({
     ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java
index 5165bfd..702ac10 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java
@@ -62,6 +62,7 @@
 import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.R;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.chrome.test.util.browser.suggestions.SuggestionsDependenciesRule;
 import org.chromium.chrome.test.util.browser.suggestions.mostvisited.FakeMostVisitedSites;
@@ -87,6 +88,7 @@
     ChromeFeatureList.START_SURFACE_ANDROID + "<Study",
     ChromeFeatureList.EMPTY_STATES
 })
+@DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
 @DoNotBatch(reason = "StartSurface*Test tests startup behaviours and thus can't be batched.")
 @CommandLineFlags.Add({
     ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java
index 2e67dcb..f88ec4e 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java
@@ -47,6 +47,7 @@
 import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.R;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.ui.test.util.UiRestriction;
@@ -65,6 +66,7 @@
     Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE
 })
 @EnableFeatures({ChromeFeatureList.START_SURFACE_ANDROID + "<Study"})
+@DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
 @DoNotBatch(reason = "StartSurface*Test tests startup behaviours and thus can't be batched.")
 @CommandLineFlags.Add({
     ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java
index ac196db..99dbc27 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java
@@ -66,6 +66,7 @@
 import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.R;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.ui.test.util.UiRestriction;
@@ -85,6 +86,7 @@
     ChromeFeatureList.START_SURFACE_ANDROID + "<Study",
     ChromeFeatureList.EMPTY_STATES
 })
+@DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
 @DoNotBatch(reason = "StartSurface*Test tests startup behaviours and thus can't be batched.")
 @CommandLineFlags.Add({
     ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
index e9fb750..eb99310c4 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
@@ -124,6 +124,7 @@
     ChromeFeatureList.START_SURFACE_ANDROID + "<Study",
     ChromeFeatureList.EMPTY_STATES
 })
+@DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
 @CommandLineFlags.Add({
     ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
     "force-fieldtrials=Study/Group",
diff --git a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTest.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTest.java
index a6087fa4..92845be 100644
--- a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTest.java
+++ b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTest.java
@@ -49,7 +49,6 @@
 /** Tests for {@link StartSurfaceCoordinator}. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
-@EnableFeatures(ChromeFeatureList.START_SURFACE_ANDROID)
 @DisableFeatures({ChromeFeatureList.WEB_FEED, ChromeFeatureList.SHOPPING_LIST})
 public class StartSurfaceCoordinatorUnitTest {
     private static final String START_SURFACE_TIME_SPENT = "StartSurface.TimeSpent";
diff --git a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java
index b7291886..2e99b13 100644
--- a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java
+++ b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java
@@ -146,6 +146,7 @@
             @Override
             public void evaluate() {
                 ChromeFeatureList.sStartSurfaceAndroid.setForTesting(true);
+                ChromeFeatureList.sShowNtpAtStartupAndroid.setForTesting(false);
 
                 mTabModelSelector = Mockito.mock(TabModelSelector.class);
                 mContainerView = Mockito.mock(ViewGroup.class);
diff --git a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
index 6ef64bb..d07af5e 100644
--- a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
+++ b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
@@ -143,6 +143,7 @@
 import java.util.List;
 
 /** Tests for {@link StartSurfaceMediator}. */
+@DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class StartSurfaceMediatorUnitTest {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
index 91f19c07..848f459 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
@@ -88,7 +88,6 @@
 @Config(manifest = Config.NONE)
 @LooperMode(LooperMode.Mode.LEGACY)
 @DisableFeatures({
-    ChromeFeatureList.START_SURFACE_RETURN_TIME,
     ChromeFeatureList.START_SURFACE_ANDROID
 })
 @EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION)
@@ -966,7 +965,10 @@
     @EnableFeatures(ChromeFeatureList.START_SURFACE_ANDROID)
     // When Start surface refactoring is enabled, the top control properties are no longer handled
     // separately, and it is covered by test updatesPropertiesWithTopControlsChanges().
-    @DisableFeatures(ChromeFeatureList.START_SURFACE_REFACTOR)
+    @DisableFeatures({
+        ChromeFeatureList.START_SURFACE_REFACTOR,
+        ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID
+    })
     public void updatesPropertiesWithTopControlsChanges_StartSurface() {
         assertEquals(0, mModel.get(TabListContainerProperties.TOP_MARGIN));
         assertEquals(0, mModel.get(TabListContainerProperties.SHADOW_TOP_OFFSET));
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 94301f6..f3fa7e16 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
@@ -14,6 +14,9 @@
 import android.widget.ArrayAdapter;
 import android.widget.Spinner;
 
+import androidx.annotation.NonNull;
+
+import org.chromium.base.supplier.Supplier;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.autofill.AutofillEditorBase;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
@@ -21,15 +24,16 @@
 import org.chromium.chrome.browser.feedback.FragmentHelpAndFeedbackLauncher;
 import org.chromium.chrome.browser.feedback.HelpAndFeedbackLauncher;
 import org.chromium.components.autofill.AutofillProfile;
+import org.chromium.ui.modaldialog.DialogDismissalCause;
+import org.chromium.ui.modaldialog.ModalDialogManager;
 
 import java.util.List;
 
-/**
- * The base class for credit card settings.
- */
-abstract class AutofillCreditCardEditor
-        extends AutofillEditorBase implements FragmentHelpAndFeedbackLauncher {
+/** The base class for credit card settings. */
+public abstract class AutofillCreditCardEditor extends AutofillEditorBase
+        implements FragmentHelpAndFeedbackLauncher {
     private HelpAndFeedbackLauncher mHelpAndFeedbackLauncher;
+    private Supplier<ModalDialogManager> mModalDialogManagerSupplier;
 
     protected CreditCard mCard;
     protected Spinner mBillingAddress;
@@ -103,8 +107,7 @@
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         if (item.getItemId() == R.id.delete_menu_id) {
-            deleteEntry();
-            getActivity().finish();
+            showDeleteCreditCardConfirmationDialog();
             return true;
         }
         if (item.getItemId() == R.id.help_menu_id) {
@@ -120,4 +123,32 @@
     public void setHelpAndFeedbackLauncher(HelpAndFeedbackLauncher helpAndFeedbackLauncher) {
         mHelpAndFeedbackLauncher = helpAndFeedbackLauncher;
     }
+
+    /**
+     * Sets Supplier for {@lnk ModalDialogManager} used to display {@link
+     * AutofillDeleteCreditCardConfirmationDialog}.
+     */
+    public void setModalDialogManagerSupplier(
+            @NonNull Supplier<ModalDialogManager> modalDialogManagerSupplier) {
+        mModalDialogManagerSupplier = modalDialogManagerSupplier;
+    }
+
+    private void showDeleteCreditCardConfirmationDialog() {
+        assert mModalDialogManagerSupplier != null;
+
+        ModalDialogManager modalDialogManager = mModalDialogManagerSupplier.get();
+        assert modalDialogManager != null;
+
+        AutofillDeleteCreditCardConfirmationDialog dialog =
+                new AutofillDeleteCreditCardConfirmationDialog(
+                        modalDialogManager,
+                        getContext(),
+                        dismissalCause -> {
+                            if (dismissalCause == DialogDismissalCause.POSITIVE_BUTTON_CLICKED) {
+                                deleteEntry();
+                                getActivity().finish();
+                            }
+                        });
+        dialog.show();
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillDeleteCreditCardConfirmationDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillDeleteCreditCardConfirmationDialog.java
new file mode 100644
index 0000000..d243f01
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillDeleteCreditCardConfirmationDialog.java
@@ -0,0 +1,58 @@
+// 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.
+
+package org.chromium.chrome.browser.autofill.settings;
+
+import android.content.Context;
+
+import org.chromium.base.Callback;
+import org.chromium.chrome.R;
+import org.chromium.ui.modaldialog.ModalDialogManager;
+import org.chromium.ui.modaldialog.ModalDialogProperties;
+import org.chromium.ui.modaldialog.SimpleModalDialogController;
+import org.chromium.ui.modelutil.PropertyModel;
+
+/** Dialog shown to user to confirm deleting a saved credit card. */
+public class AutofillDeleteCreditCardConfirmationDialog {
+
+    private final ModalDialogManager mModalDialogManager;
+    private final Context mContext;
+    private final Callback<Integer> mResultHandler;
+
+    public AutofillDeleteCreditCardConfirmationDialog(
+            ModalDialogManager modalDialogManager,
+            Context context,
+            Callback<Integer> resultHandler) {
+        mModalDialogManager = modalDialogManager;
+        mContext = context;
+        mResultHandler = resultHandler;
+    }
+
+    /** Displays an AutofillDeleteCreditCardConfirmationDialog. */
+    public void show() {
+        ModalDialogProperties.Controller dialogController =
+                new SimpleModalDialogController(mModalDialogManager, mResultHandler);
+
+        final int titleResId = R.string.autofill_credit_card_delete_confirmation_title;
+        final int descResId = R.string.autofill_credit_card_delete_confirmation_description;
+        PropertyModel dialog =
+                new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
+                        .with(ModalDialogProperties.CONTROLLER, dialogController)
+                        .with(ModalDialogProperties.TITLE, mContext.getString(titleResId))
+                        .with(
+                                ModalDialogProperties.MESSAGE_PARAGRAPH_1,
+                                mContext.getString(descResId))
+                        .with(
+                                ModalDialogProperties.POSITIVE_BUTTON_TEXT,
+                                mContext.getString(R.string.delete))
+                        .with(
+                                ModalDialogProperties.BUTTON_STYLES,
+                                ModalDialogProperties.ButtonStyles.PRIMARY_FILLED_NEGATIVE_OUTLINE)
+                        .with(
+                                ModalDialogProperties.NEGATIVE_BUTTON_TEXT,
+                                mContext.getString(R.string.cancel))
+                        .build();
+        mModalDialogManager.showDialog(dialog, ModalDialogManager.ModalDialogType.APP);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
index eda23c4..2793c8f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
@@ -41,6 +41,7 @@
 import org.chromium.chrome.browser.accessibility.settings.ChromeAccessibilitySettingsDelegate;
 import org.chromium.chrome.browser.autofill.options.AutofillOptionsCoordinator;
 import org.chromium.chrome.browser.autofill.options.AutofillOptionsFragment;
+import org.chromium.chrome.browser.autofill.settings.AutofillCreditCardEditor;
 import org.chromium.chrome.browser.back_press.BackPressHelper;
 import org.chromium.chrome.browser.back_press.BackPressManager;
 import org.chromium.chrome.browser.back_press.SecondaryActivityBackPressUma.SecondaryActivity;
@@ -596,6 +597,10 @@
             tpFragment.setCustomTabIntentHelper(
                     LaunchIntentDispatcher::createCustomTabActivityIntent);
         }
+        if (fragment instanceof AutofillCreditCardEditor) {
+            ((AutofillCreditCardEditor) fragment)
+                    .setModalDialogManagerSupplier(getModalDialogManagerSupplier());
+        }
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java
index e6d19c9..9114dfa2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java
@@ -315,7 +315,7 @@
      * @param returnTime The return time parameter based on form factor, either phones or tablets.
      */
     private static long getReturnTime(IntCachedFieldTrialParameter returnTime) {
-        if (ChromeFeatureList.sStartSurfaceReturnTime.isEnabled() && returnTime.getValue() != 0
+        if (returnTime.getValue() != 0
                 && StartSurfaceConfiguration.START_SURFACE_RETURN_TIME_USE_MODEL.getValue()) {
             return getReturnTimeFromSegmentation(returnTime);
         }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/OverviewAppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/OverviewAppMenuTest.java
index 3c9822d..b99a9da 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/OverviewAppMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/OverviewAppMenuTest.java
@@ -98,7 +98,6 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
-    @EnableFeatures({ChromeFeatureList.START_SURFACE_ANDROID})
     @DisableFeatures({ChromeFeatureList.QUICK_DELETE_FOR_ANDROID})
     public void testAllMenuItemsWithStartSurface() throws Exception {
         openTabSwitcher();
@@ -151,7 +150,6 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
-    @EnableFeatures({ChromeFeatureList.START_SURFACE_ANDROID})
     public void testIncognitoAllMenuItemsWithStartSurface() throws Exception {
         openTabSwitcher();
         TestThreadUtils.runOnUiThreadBlocking(
@@ -188,24 +186,6 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
-    @DisableFeatures({ChromeFeatureList.START_SURFACE_ANDROID})
-    public void testSelectTabsIsEnabled() throws Exception {
-        openTabSwitcher();
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> {
-                    AppMenuTestSupport.showAppMenu(
-                            mActivityTestRule.getAppMenuCoordinator(), null, false);
-                });
-
-        assertNotNull(
-                AppMenuTestSupport.getMenuItemPropertyModel(
-                        mActivityTestRule.getAppMenuCoordinator(), R.id.menu_select_tabs));
-    }
-
-    @Test
-    @SmallTest
-    @Feature({"Browser", "Main"})
-    @EnableFeatures({ChromeFeatureList.START_SURFACE_ANDROID})
     public void testSelectTabsIsEnabledWithStartSurface() throws Exception {
         openTabSwitcher();
         TestThreadUtils.runOnUiThreadBlocking(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillLocalCardEditorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillLocalCardEditorTest.java
index 3142970..0b546ef 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillLocalCardEditorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillLocalCardEditorTest.java
@@ -6,7 +6,14 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import android.os.Bundle;
+import android.view.MenuItem;
 import android.view.View;
 
 import androidx.test.filters.MediumTest;
@@ -18,9 +25,13 @@
 import org.junit.Test;
 import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 
+import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.chrome.browser.autofill.AutofillEditorBase;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
+import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.settings.SettingsActivity;
@@ -32,6 +43,8 @@
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.autofill.VirtualCardEnrollmentState;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.ui.modaldialog.ModalDialogManager;
+import org.chromium.ui.test.util.modaldialog.FakeModalDialogManager;
 
 /** Instrumentation tests for AutofillLocalCardEditor. */
 @RunWith(ChromeJUnit4ClassRunner.class)
@@ -85,10 +98,13 @@
                     /* obfuscatedLastFourDigits= */ "",
                     /* cvc= */ "123");
 
+    @Mock private ObservableSupplierImpl<ModalDialogManager> mModalDialogManagerSupplierMock;
+    @Mock private PersonalDataManager mPersonalDataManagerMock;
     private AutofillTestHelper mAutofillTestHelper;
 
     @Before
     public void setUp() {
+        MockitoAnnotations.initMocks(this);
         mAutofillTestHelper = new AutofillTestHelper();
     }
 
@@ -508,6 +524,78 @@
         assertThat(autofillLocalCardEditorFragment.mDoneButton.isEnabled()).isFalse();
     }
 
+    @Test
+    @MediumTest
+    public void deleteCreditCardConfirmationDialog_deleteEntryCanceled_dialogDismissed()
+            throws Exception {
+        String guid = mAutofillTestHelper.setCreditCard(SAMPLE_LOCAL_CARD);
+        SettingsActivity activity =
+                mSettingsActivityTestRule.startSettingsActivity(fragmentArgs(guid));
+        AutofillLocalCardEditor autofillLocalCardEditorFragment =
+                (AutofillLocalCardEditor) activity.getMainFragment();
+
+        PersonalDataManager.setInstanceForTesting(mPersonalDataManagerMock);
+
+        FakeModalDialogManager fakeModalDialogManager =
+                new FakeModalDialogManager(ModalDialogManager.ModalDialogType.APP);
+        openDeleteCreditCardConfirmationDialog(
+                autofillLocalCardEditorFragment, fakeModalDialogManager);
+
+        // Verify the dialog is open
+        Assert.assertNotNull(fakeModalDialogManager.getShownDialogModel());
+        TestThreadUtils.runOnUiThreadBlocking(() -> fakeModalDialogManager.clickNegativeButton());
+
+        // Verify the dialog is closed
+        Assert.assertNull(fakeModalDialogManager.getShownDialogModel());
+
+        // Verify the card entry is not deleted
+        verify(mPersonalDataManagerMock, never()).deleteCreditCard(guid);
+    }
+
+    @Test
+    @MediumTest
+    public void
+            deleteCreditCardConfirmationDialog_deleteEntryConfirmed_dialogDismissedAndEntryDeleted()
+                    throws Exception {
+        String guid = mAutofillTestHelper.setCreditCard(SAMPLE_LOCAL_CARD);
+        SettingsActivity activity =
+                mSettingsActivityTestRule.startSettingsActivity(fragmentArgs(guid));
+        AutofillLocalCardEditor autofillLocalCardEditorFragment =
+                (AutofillLocalCardEditor) activity.getMainFragment();
+
+        PersonalDataManager.setInstanceForTesting(mPersonalDataManagerMock);
+
+        FakeModalDialogManager fakeModalDialogManager =
+                new FakeModalDialogManager(ModalDialogManager.ModalDialogType.APP);
+        openDeleteCreditCardConfirmationDialog(
+                autofillLocalCardEditorFragment, fakeModalDialogManager);
+
+        // Verify the dialog is open
+        Assert.assertNotNull(fakeModalDialogManager.getShownDialogModel());
+        TestThreadUtils.runOnUiThreadBlocking(() -> fakeModalDialogManager.clickPositiveButton());
+
+        // Verify the dialog is closed
+        Assert.assertNull(fakeModalDialogManager.getShownDialogModel());
+
+        // Verify the card entry is deleted
+        verify(mPersonalDataManagerMock, times(1)).deleteCreditCard(guid);
+    }
+
+    private void openDeleteCreditCardConfirmationDialog(
+            AutofillLocalCardEditor autofillLocalCardEditorFragment,
+            ModalDialogManager modalDialogManager) {
+        when(mModalDialogManagerSupplierMock.get()).thenReturn(modalDialogManager);
+        autofillLocalCardEditorFragment.setModalDialogManagerSupplier(
+                mModalDialogManagerSupplierMock);
+
+        MenuItem deleteButton = mock(MenuItem.class);
+        when(deleteButton.getItemId()).thenReturn(R.id.delete_menu_id);
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    autofillLocalCardEditorFragment.onOptionsItemSelected(deleteButton);
+                });
+    }
+
     private void setExpirationDateOnEditor(
             AutofillLocalCardEditor autofillLocalCardEditorFragment, String date) {
         TestThreadUtils.runOnUiThreadBlocking(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelperTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelperTest.java
index 141bcb0..8f9ac3d8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelperTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelperTest.java
@@ -37,18 +37,8 @@
 @RunWith(StartupPaintPreviewHelperTestRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 @ParameterizedCommandLineFlags({
-    @Switches(
-            "disable-features="
-                    + ChromeFeatureList.START_SURFACE_ANDROID
-                    + ","
-                    + ChromeFeatureList.INSTANT_START),
-    @Switches("enable-features=" + ChromeFeatureList.START_SURFACE_ANDROID),
+    @Switches("disable-features=" + ChromeFeatureList.INSTANT_START),
     @Switches("enable-features=" + ChromeFeatureList.INSTANT_START),
-    @Switches(
-            "enable-features="
-                    + ChromeFeatureList.START_SURFACE_ANDROID
-                    + ","
-                    + ChromeFeatureList.INSTANT_START),
 })
 public class StartupPaintPreviewHelperTest {
     @Rule
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java
index c6613b2..df420d16 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java
@@ -53,7 +53,6 @@
 @Batch(Batch.PER_CLASS)
 @EnableFeatures({
     ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR,
-    ChromeFeatureList.START_SURFACE_ANDROID
 })
 @CommandLineFlags.Add({
     ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java
index d1e9b7ad..21ed9ae 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java
@@ -244,7 +244,10 @@
     // TODO(https://crbug.com/1315676): Remove this test once the Start surface refactor is done.
     // This is because the "secondary_tasks_surface_view" will go away, and testShowAfterHide() will
     // cover the testing of grid tab switcher directly.
-    @DisableFeatures(ChromeFeatureList.START_SURFACE_REFACTOR)
+    @DisableFeatures({
+        ChromeFeatureList.START_SURFACE_REFACTOR,
+        ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID
+    })
     public void testShowAndHideOnStartSurface() {
         TabUiTestHelper.enterTabSwitcher(mActivityTestRule.getActivity());
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilTest.java
index b760dc9..f0a9451 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilTest.java
@@ -56,6 +56,7 @@
 import org.chromium.chrome.test.util.ChromeApplicationTestUtils;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
 import org.chromium.chrome.test.util.ChromeTabUtils;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.net.test.EmbeddedTestServer;
@@ -143,6 +144,7 @@
     @SmallTest
     @Feature({"ReturnToChrome"})
     @CommandLineFlags.Add({BASE_PARAMS})
+    @DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
     @DisableIf.Device(type = {UiDisableIf.TABLET}) // See https://crbug.com/1081754.
     public void testTabSwitcherModeTriggeredWithinThreshold_WarmStart_FromIncognito_NON_V2()
             throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhoneTest.java
index c4870501..12512d4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhoneTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhoneTest.java
@@ -471,7 +471,6 @@
     @Test
     @MediumTest
     @EnableFeatures({
-        ChromeFeatureList.START_SURFACE_ANDROID,
         ChromeFeatureList.TAB_TO_GTS_ANIMATION
     })
     public void testEnterTabSwitcher_toolbarVisibleUntilTransitionEnds_startSurfaceEnabled() {
@@ -511,7 +510,6 @@
     @Test
     @MediumTest
     @EnableFeatures({
-        ChromeFeatureList.START_SURFACE_ANDROID,
         ChromeFeatureList.TAB_TO_GTS_ANIMATION
     })
     @DisableAnimationsTestRule.EnsureAnimationsOn
@@ -605,7 +603,6 @@
     @Test
     @MediumTest
     @EnableFeatures({
-        ChromeFeatureList.START_SURFACE_ANDROID,
         ChromeFeatureList.TAB_TO_GTS_ANIMATION
     })
     @DisableAnimationsTestRule.EnsureAnimationsOn
@@ -676,7 +673,6 @@
     @Test
     @MediumTest
     @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION)
-    @EnableFeatures(ChromeFeatureList.START_SURFACE_ANDROID)
     @DisableAnimationsTestRule.EnsureAnimationsOn
     public void
             testToolbarTabSwitcherButtonNotClickableDuringTransition_startSurfaceEnabled_noAnimation() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java
index 772f036..a73504aa 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java
@@ -161,7 +161,10 @@
     @LargeTest
     @Feature({"StatusBar"})
     @EnableFeatures({ChromeFeatureList.START_SURFACE_REFACTOR})
-    @DisableFeatures({ChromeFeatureList.SURFACE_POLISH})
+    @DisableFeatures({
+        ChromeFeatureList.SURFACE_POLISH,
+        ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID
+    })
     @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE}) // Status bar is always black on tablets
     public void testBrandColorIgnoredInStartSurface() throws Exception {
         ChromeTabbedActivity activity = sActivityTestRule.getActivity();
@@ -222,6 +225,7 @@
     @LargeTest
     @Feature({"StatusBar"})
     @EnableFeatures({ChromeFeatureList.START_SURFACE_REFACTOR, ChromeFeatureList.SURFACE_POLISH})
+    @DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
     @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE}) // Status bar is always black on tablets
     public void testBrandColorNotIgnoredInStartSurfaceWithSurfacePolishEnabled() throws Exception {
         ChromeTabbedActivity activity = sActivityTestRule.getActivity();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillDeleteCreditCardConfirmationDialogTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillDeleteCreditCardConfirmationDialogTest.java
new file mode 100644
index 0000000..0ad9624
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillDeleteCreditCardConfirmationDialogTest.java
@@ -0,0 +1,67 @@
+// 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.
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import org.chromium.base.Callback;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.chrome.browser.autofill.settings.AutofillDeleteCreditCardConfirmationDialog;
+import org.chromium.ui.modaldialog.DialogDismissalCause;
+import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
+import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.test.util.modaldialog.FakeModalDialogManager;
+
+/** Unit tests for {@link AutofillDeleteCreditCardConfirmationDialog}. */
+@RunWith(BaseRobolectricTestRunner.class)
+public class AutofillDeleteCreditCardConfirmationDialogTest {
+    @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
+    @Mock private Callback<Integer> mResultHandlerMock;
+
+    private FakeModalDialogManager mModalDialogManager;
+    private AutofillDeleteCreditCardConfirmationDialog mDialog;
+
+    @Before
+    public void setUp() {
+        mModalDialogManager = new FakeModalDialogManager(ModalDialogType.APP);
+        mDialog =
+                new AutofillDeleteCreditCardConfirmationDialog(
+                        mModalDialogManager,
+                        ApplicationProvider.getApplicationContext(),
+                        mResultHandlerMock);
+        mDialog.show();
+    }
+
+    @Test
+    @SmallTest
+    public void testDeleteButtonPressed_handlesPositiveDialogDismissalCause() {
+        PropertyModel dialogModel = mModalDialogManager.getShownDialogModel();
+        assertThat(dialogModel).isNotNull();
+        mModalDialogManager.clickPositiveButton();
+        assertThat(mModalDialogManager.getShownDialogModel()).isNull();
+        verify(mResultHandlerMock).onResult(DialogDismissalCause.POSITIVE_BUTTON_CLICKED);
+    }
+
+    @Test
+    @SmallTest
+    public void testCancelButtonPressed_handlesNegativeDialogDismissalCause() {
+        PropertyModel dialogModel = mModalDialogManager.getShownDialogModel();
+        assertThat(dialogModel).isNotNull();
+        mModalDialogManager.clickNegativeButton();
+        assertThat(mModalDialogManager.getShownDialogModel()).isNull();
+        verify(mResultHandlerMock).onResult(DialogDismissalCause.NEGATIVE_BUTTON_CLICKED);
+    }
+}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java
index 42055ca2..117f529 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java
@@ -93,6 +93,7 @@
         manifest = Config.NONE,
         shadows = {ShadowHomepageManager.class, ShadowHomepagePolicyManager.class})
 @CommandLineFlags.Add({BaseSwitches.DISABLE_LOW_END_DEVICE_MODE})
+@DisableFeatures({ChromeFeatureList.SHOW_NTP_AT_STARTUP_ANDROID})
 public class ReturnToChromeUtilUnitTest {
     /** Shadow for {@link HomepageManager}. */
     @Implements(HomepageManager.class)
@@ -175,7 +176,6 @@
         Assert.assertEquals(
                 START_SURFACE_RETURN_TIME_SECONDS.getDefaultValue(),
                 START_SURFACE_RETURN_TIME_SECONDS.getValue());
-        Assert.assertFalse(ChromeFeatureList.sStartSurfaceReturnTime.isEnabled());
 
         long returnTimeMs =
                 START_SURFACE_RETURN_TIME_SECONDS.getValue() * DateUtils.SECOND_IN_MILLIS;
@@ -199,7 +199,6 @@
         Assert.assertEquals(
                 START_SURFACE_RETURN_TIME_ON_TABLET_SECONDS.getDefaultValue(),
                 START_SURFACE_RETURN_TIME_ON_TABLET_SECONDS.getValue());
-        Assert.assertFalse(ChromeFeatureList.sStartSurfaceReturnTime.isEnabled());
 
         int updatedReturnTimeMs = 1;
         // Sets the return time on phones arrived.
@@ -233,11 +232,7 @@
 
     @Test
     @SmallTest
-    @EnableFeatures({ChromeFeatureList.START_SURFACE_RETURN_TIME})
     public void testShouldShowTabSwitcherWithStartReturnTimeWithoutUseModel() {
-        Assert.assertTrue(ChromeFeatureList.sStartSurfaceReturnTime.isEnabled());
-        Assert.assertTrue(ChromeFeatureList.sStartSurfaceAndroid.isEnabled());
-        START_SURFACE_RETURN_TIME_USE_MODEL.setForTesting(false);
         Assert.assertFalse(START_SURFACE_RETURN_TIME_USE_MODEL.getValue());
 
         // Set to not shown.
@@ -272,10 +267,7 @@
 
     @Test
     @SmallTest
-    @EnableFeatures({ChromeFeatureList.START_SURFACE_RETURN_TIME})
     public void testShouldShowTabSwitcherWithSegmentationReturnTime() {
-        Assert.assertTrue(ChromeFeatureList.sStartSurfaceReturnTime.isEnabled());
-
         // Verifies that when the preference key isn't stored, return
         // START_SURFACE_RETURN_TIME_SECONDS.getDefaultValue() as default value, i.e., 8 hours.
         Assert.assertEquals(
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd
index c6e7a135..998cd381 100644
--- a/chrome/app/chromium_strings.grd
+++ b/chrome/app/chromium_strings.grd
@@ -1869,6 +1869,14 @@
                  desc="Error message displayed in the main dialog when the user is in a export-restricted country.">
           Installation failed because access is restricted in this country.
         </message>
+        <message name="IDS_OS_NOT_SUPPORTED"
+                 desc="Error message displayed in the main dialog when the OS does not meet the application's requirements.">
+          Installation failed because this version of the operating system is not supported.
+        </message>
+        <message name="IDS_HW_NOT_SUPPORTED"
+                 desc="Error message displayed in the main dialog when the computer does not meet the application's minimum hardware requirements.">
+          Installation failed because your computer does not meet the minimum hardware requirements.
+        </message>
         <message name="IDS_GENERIC_UPDATE_CHECK_ERROR"
                  desc="Error message displayed in the main dialog when the update client returns an error in the update check.">
           Update check error: <ph name="UPDATE_CHECK_ERROR">$1<ex>error-internal</ex></ph>.
diff --git a/chrome/app/chromium_strings_grd/IDS_HW_NOT_SUPPORTED.png.sha1 b/chrome/app/chromium_strings_grd/IDS_HW_NOT_SUPPORTED.png.sha1
new file mode 100644
index 0000000..30d8cc68
--- /dev/null
+++ b/chrome/app/chromium_strings_grd/IDS_HW_NOT_SUPPORTED.png.sha1
@@ -0,0 +1 @@
+0c4592e31e6a66a7b538a59a0c20cb313aa932c9
\ No newline at end of file
diff --git a/chrome/app/chromium_strings_grd/IDS_OS_NOT_SUPPORTED.png.sha1 b/chrome/app/chromium_strings_grd/IDS_OS_NOT_SUPPORTED.png.sha1
new file mode 100644
index 0000000..58ad720
--- /dev/null
+++ b/chrome/app/chromium_strings_grd/IDS_OS_NOT_SUPPORTED.png.sha1
@@ -0,0 +1 @@
+b34f14254e5cb299181f38eeafca743196593c32
\ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 15cda55..7e691909 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -16361,6 +16361,15 @@
     <message name="IDS_PLUS_ADDRESS_MODAL_PROPOSED_PLUS_ADDRESS_AND_COPY" desc="The plus address with some descriptive text around it." translateable="false">
       Use <ph name="PLUS_ADDRESS">$1<ex>plus@plus.plus</ex>?</ph>
     </message>
+    <message name="IDS_PLUS_ADDRESS_MODAL_PLUS_ADDRESS_LINK_TEXT" desc="The text of the link shown on the Plus Address modal." translateable="false">
+      Settings
+    </message>
+    <message name="IDS_PLUS_ADDRESS_MODAL_PLUS_ADDRESS_DESCRIPTION_START" desc="The start of the plus address description that has a placeholder for a link." translateable="false">
+      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua <ph name="LINK">$1</ph>. Ut enim ad minim veniam...
+    </message>
+    <message name="IDS_PLUS_ADDRESS_MODAL_PLUS_ADDRESS_DESCRIPTION_END" desc="The end of the plus address description that has a placeholder for the primary email address." translateable="false">
+      Lorem <ph name="REGULAR_ADDRESS">$1</ph>.
+    </message>
     <message name="IDS_PLUS_ADDRESS_MODAL_ERROR_MESSAGE" desc="The error message shown on the modal." translateable="false">
       Lorem ipsum or whatever
     </message>
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd
index 93931790f..1d8be26 100644
--- a/chrome/app/google_chrome_strings.grd
+++ b/chrome/app/google_chrome_strings.grd
@@ -1897,6 +1897,14 @@
                  desc="Error message displayed in the main dialog when the user is in a export-restricted country.">
           Installation failed because access is restricted in this country.
         </message>
+        <message name="IDS_OS_NOT_SUPPORTED"
+                 desc="Error message displayed in the main dialog when the OS does not meet the application's requirements.">
+          Installation failed because this version of the operating system is not supported.
+        </message>
+        <message name="IDS_HW_NOT_SUPPORTED"
+                 desc="Error message displayed in the main dialog when the computer does not meet the application's minimum hardware requirements.">
+          Installation failed because your computer does not meet the minimum hardware requirements.
+        </message>
         <message name="IDS_GENERIC_UPDATE_CHECK_ERROR"
                  desc="Error message displayed in the main dialog when the update client returns an error in the update check.">
           Update check error: <ph name="UPDATE_CHECK_ERROR">$1<ex>error-internal</ex></ph>.
diff --git a/chrome/app/google_chrome_strings_grd/IDS_HW_NOT_SUPPORTED.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_HW_NOT_SUPPORTED.png.sha1
new file mode 100644
index 0000000..30d8cc68
--- /dev/null
+++ b/chrome/app/google_chrome_strings_grd/IDS_HW_NOT_SUPPORTED.png.sha1
@@ -0,0 +1 @@
+0c4592e31e6a66a7b538a59a0c20cb313aa932c9
\ No newline at end of file
diff --git a/chrome/app/google_chrome_strings_grd/IDS_OS_NOT_SUPPORTED.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_OS_NOT_SUPPORTED.png.sha1
new file mode 100644
index 0000000..58ad720
--- /dev/null
+++ b/chrome/app/google_chrome_strings_grd/IDS_OS_NOT_SUPPORTED.png.sha1
@@ -0,0 +1 @@
+b34f14254e5cb299181f38eeafca743196593c32
\ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 9e1c61b..7e52627 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -8971,10 +8971,9 @@
 #if BUILDFLAG(ENABLE_PDF)
 
 #if !BUILDFLAG(IS_ANDROID)
-    // TODO(https://crbug.com/1443341): Add Windows once library supports it.
     {"pdf-ocr", flag_descriptions::kPdfOcrName,
      flag_descriptions::kPdfOcrDescription,
-     kOsMac | kOsLinux | kOsCrOS | kOsLacros,
+     kOsMac | kOsWin | kOsLinux | kOsCrOS | kOsLacros,
      FEATURE_VALUE_TYPE(features::kPdfOcr)},
 #endif  // !BUILDFLAG(IS_ANDROID)
 
diff --git a/chrome/browser/browser_features.cc b/chrome/browser/browser_features.cc
index 4fe6967..a605354 100644
--- a/chrome/browser/browser_features.cc
+++ b/chrome/browser/browser_features.cc
@@ -312,10 +312,8 @@
              "OmniboxTriggerForNoStatePrefetch",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
 BASE_FEATURE(kPayloadTestComponent,
              "PayloadTestComponent",
              base::FEATURE_DISABLED_BY_DEFAULT);
-#endif
 
 }  // namespace features
diff --git a/chrome/browser/browser_features.h b/chrome/browser/browser_features.h
index 16c2080..be9f2750 100644
--- a/chrome/browser/browser_features.h
+++ b/chrome/browser/browser_features.h
@@ -129,9 +129,7 @@
 
 BASE_DECLARE_FEATURE(kOmniboxTriggerForNoStatePrefetch);
 
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
 BASE_DECLARE_FEATURE(kPayloadTestComponent);
-#endif
 
 }  // namespace features
 
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 24916dba..a5057b9 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -4956,6 +4956,14 @@
   RegisterChromeMojoBinderPoliciesForSameOriginPrerendering(policy_map);
 }
 
+void ChromeContentBrowserClient::RegisterMojoBinderPoliciesForPreview(
+    content::MojoBinderPolicyMap& policy_map) {
+  // Changes to `policy_map` should be made in
+  // RegisterChromeMojoBinderPoliciesForPreview() which requires security
+  // review.
+  RegisterChromeMojoBinderPoliciesForPreview(policy_map);
+}
+
 void ChromeContentBrowserClient::OpenURL(
     content::SiteInstance* site_instance,
     const content::OpenURLParams& params,
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 4b8d0e75..9113ef7 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -521,6 +521,8 @@
       content::WebUIBrowserInterfaceBrokerRegistry& registry) override;
   void RegisterMojoBinderPoliciesForSameOriginPrerendering(
       content::MojoBinderPolicyMap& policy_map) override;
+  void RegisterMojoBinderPoliciesForPreview(
+      content::MojoBinderPolicyMap& policy_map) override;
   void RegisterBrowserInterfaceBindersForServiceWorker(
       content::BrowserContext* browser_context,
       const content::ServiceWorkerVersionBaseInfo& service_worker_version_info,
diff --git a/chrome/browser/chrome_content_browser_client_binder_policies.cc b/chrome/browser/chrome_content_browser_client_binder_policies.cc
index 3e26d330..fc27d258 100644
--- a/chrome/browser/chrome_content_browser_client_binder_policies.cc
+++ b/chrome/browser/chrome_content_browser_client_binder_policies.cc
@@ -58,3 +58,9 @@
   RegisterPoliciesForNonAssociatedInterfaces(policy_map);
   RegisterPoliciesForChannelAssociatedInterfaces(policy_map);
 }
+
+void RegisterChromeMojoBinderPoliciesForPreview(
+    content::MojoBinderPolicyMap& policy_map) {
+  RegisterPoliciesForNonAssociatedInterfaces(policy_map);
+  RegisterPoliciesForChannelAssociatedInterfaces(policy_map);
+}
diff --git a/chrome/browser/chrome_content_browser_client_binder_policies.h b/chrome/browser/chrome_content_browser_client_binder_policies.h
index bfd2f40..7b638459 100644
--- a/chrome/browser/chrome_content_browser_client_binder_policies.h
+++ b/chrome/browser/chrome_content_browser_client_binder_policies.h
@@ -14,4 +14,11 @@
 void RegisterChromeMojoBinderPoliciesForSameOriginPrerendering(
     content::MojoBinderPolicyMap& policy_map);
 
+// Intended to be called only by
+// ChromeContentBrowserClient::RegisterMojoBinderPoliciesForPreview().
+// It is in its own file so that security review can be required by the OWNERS
+// file.
+void RegisterChromeMojoBinderPoliciesForPreview(
+    content::MojoBinderPolicyMap& policy_map);
+
 #endif  // CHROME_BROWSER_CHROME_CONTENT_BROWSER_CLIENT_BINDER_POLICIES_H_
diff --git a/chrome/browser/component_updater/registration.cc b/chrome/browser/component_updater/registration.cc
index a70fc65..411ebcc8 100644
--- a/chrome/browser/component_updater/registration.cc
+++ b/chrome/browser/component_updater/registration.cc
@@ -217,15 +217,14 @@
 
   RegisterTpcdMetadataComponent(cus);
 
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
   // TODO(crbug.com/1490685): Remove this test component once the
   // experiment has concluded.
   if (base::FeatureList::IsEnabled(features::kPayloadTestComponent)) {
     RegisterPayloadTestComponent(cus);
   }
+
   // TODO(crbug.com/1499359): Remove once the experiment has concluded.
   EnsureNetworkQualityObserver();
-#endif
 }
 
 }  // namespace component_updater
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc
index 7647f26..6d89c2e 100644
--- a/chrome/browser/devtools/devtools_window.cc
+++ b/chrome/browser/devtools/devtools_window.cc
@@ -1255,7 +1255,7 @@
   if (browser_connection)
     url += "&browserConnection=true";
 
-#if BUILDFLAG(GOOGLE_CHROME_FOR_TESTING_BRANDING)
+#if BUILDFLAG(CHROME_FOR_TESTING)
   url += "&isChromeForTesting=true";
 #endif
 
diff --git a/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc
index 8d3d0ffb..684c8f5 100644
--- a/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc
+++ b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc
@@ -28,17 +28,17 @@
   // an existing provider.
   const std::string* service_provider_name =
       settings_dict.FindString(kKeyServiceProvider);
-  if (service_provider_name) {
-    service_provider_name_ = *service_provider_name;
-    if (service_provider_config.count(service_provider_name_)) {
-      analysis_config_ =
-          service_provider_config.at(service_provider_name_).analysis;
-    }
-    if (!analysis_config_) {
-      DLOG(ERROR) << "No analysis config for corresponding service provider";
-      return;
-    }
-  } else {
+  if (!service_provider_name) {
+    return;
+  }
+
+  service_provider_name_ = *service_provider_name;
+  if (service_provider_config.count(service_provider_name_)) {
+    analysis_config_ =
+        service_provider_config.at(service_provider_name_).analysis;
+  }
+  if (!analysis_config_) {
+    DLOG(ERROR) << "No analysis config for corresponding service provider";
     return;
   }
 
@@ -145,6 +145,7 @@
     }
   }
 
+#if BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
 #if BUILDFLAG(IS_WIN)
   const char* verification_key = kKeyWindowsVerification;
 #elif BUILDFLAG(IS_MAC)
@@ -153,7 +154,6 @@
   const char* verification_key = kKeyLinuxVerification;
 #endif
 
-#if BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
   const base::Value::Dict& dict = settings_value.GetDict();
   const base::Value::List* signatures =
       dict.FindListByDottedPath(verification_key);
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 4623312..e8d0c85 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -1137,7 +1137,7 @@
 
 BASE_FEATURE(kStartSurfaceReturnTime,
              "StartSurfaceReturnTime",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 BASE_FEATURE(kAccountReauthenticationRecentTimeWindow,
              "AccountReauthenticationRecentTimeWindow",
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 9f06bfa..0cf2dcc 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -623,7 +623,7 @@
     public static final CachedFlag sStartSurfaceRefactor =
             new CachedFlag(START_SURFACE_REFACTOR, true);
     public static final CachedFlag sStartSurfaceReturnTime =
-            new CachedFlag(START_SURFACE_RETURN_TIME, false);
+            new CachedFlag(START_SURFACE_RETURN_TIME, true);
     public static final CachedFlag sAccountReauthenticationRecentTimeWindow =
             new CachedFlag(ACCOUNT_REAUTHENTICATION_RECENT_TIME_WINDOW, true);
     public static final CachedFlag sStartSurfaceWithAccessibility =
diff --git a/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.cc
index 6a9bbb4..b45ef3a 100644
--- a/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.cc
@@ -590,43 +590,40 @@
   }
 
   RecordNormalizedResponsivenessMetrics(
-      subframe_info.responsiveness_metrics_normalization
-          .GetNormalizedResponsivenessMetrics(),
-      builder);
+      subframe_info.responsiveness_metrics_normalization, builder);
   builder.Record(ukm::UkmRecorder::Get());
 }
 
 void AMPPageLoadMetricsObserver::RecordNormalizedResponsivenessMetrics(
-    const page_load_metrics::NormalizedResponsivenessMetrics&
-        normalized_responsiveness_metrics,
+    const page_load_metrics::ResponsivenessMetricsNormalization&
+        responsiveness_metrics_normalization,
     ukm::builders::AmpPageLoad& builder) {
   DCHECK(!GetDelegate().IsInPrerenderingBeforeActivationStart());
 
-  if (!normalized_responsiveness_metrics.num_user_interactions)
+  if (!responsiveness_metrics_normalization.num_user_interactions()) {
     return;
+  }
 
   const std::string histogram_suffix =
       current_main_frame_nav_info_->is_same_document_navigation
           ? ""
           : ".FullNavigation";
-  auto& max_event_durations =
-      normalized_responsiveness_metrics.normalized_max_event_durations;
 
   builder
       .SetSubFrame_InteractiveTiming_WorstUserInteractionLatency_MaxEventDuration2(
-          max_event_durations.worst_latency.InMilliseconds());
+          responsiveness_metrics_normalization.worst_latency()
+              .value()
+              .InMilliseconds());
   base::UmaHistogramCustomTimes(
       std::string(kHistogramPrefix)
           .append(
               kHistogramAMPSubframeWorstUserInteractionLatencyMaxEventDuration)
           .append(histogram_suffix),
-      max_event_durations.worst_latency, base::Milliseconds(1),
-      base::Seconds(60), 50);
+      responsiveness_metrics_normalization.worst_latency().value(),
+      base::Milliseconds(1), base::Seconds(60), 50);
 
-  base::TimeDelta high_percentile2_max_event_duration = page_load_metrics::
-      ResponsivenessMetricsNormalization::ApproximateHighPercentile(
-          normalized_responsiveness_metrics.num_user_interactions,
-          max_event_durations.worst_ten_latencies);
+  base::TimeDelta high_percentile2_max_event_duration =
+      responsiveness_metrics_normalization.ApproximateHighPercentile().value();
 
   builder
       .SetSubFrame_InteractiveTiming_UserInteractionLatency_HighPercentile2_MaxEventDuration(
@@ -634,7 +631,7 @@
 
   builder.SetSubFrame_InteractiveTiming_NumInteractions(
       ukm::GetExponentialBucketMinForCounts1000(
-          normalized_responsiveness_metrics.num_user_interactions));
+          responsiveness_metrics_normalization.num_user_interactions()));
 
   base::UmaHistogramCustomTimes(
       std::string(kHistogramPrefix)
@@ -646,5 +643,5 @@
   base::UmaHistogramCounts1000(
       std::string(kHistogramPrefix)
           .append(kHistogramAMPSubframeNumInteractions),
-      normalized_responsiveness_metrics.num_user_interactions);
+      responsiveness_metrics_normalization.num_user_interactions());
 }
diff --git a/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.h
index 86db418..33dfc39 100644
--- a/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.h
+++ b/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.h
@@ -137,8 +137,8 @@
 
   void MaybeRecordLoadingBehaviorObserved();
   void RecordNormalizedResponsivenessMetrics(
-      const page_load_metrics::NormalizedResponsivenessMetrics&
-          normalized_responsiveness_metrics,
+      const page_load_metrics::ResponsivenessMetricsNormalization&
+          responsiveness_metrics_normalization,
       ukm::builders::AmpPageLoad& builder);
   void ProcessMainFrameNavigation(content::NavigationHandle* navigation_handle);
   void MaybeRecordAmpDocumentMetrics();
diff --git a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc
index 4ef9c5a..6e6bcec5 100644
--- a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc
@@ -689,25 +689,22 @@
     }
   }
 
-  const page_load_metrics::NormalizedResponsivenessMetrics&
-      soft_nav_normalized_responsiveness_metrics =
+  const page_load_metrics::ResponsivenessMetricsNormalization&
+      soft_nav_responsiveness_metrics_normalization =
           GetDelegate()
-              .GetSoftNavigationIntervalNormalizedResponsivenessMetrics();
+              .GetSoftNavigationIntervalResponsivenessMetricsNormalization();
 
-  const auto& max_event_durations =
-      soft_nav_normalized_responsiveness_metrics.normalized_max_event_durations;
-  if (soft_nav_normalized_responsiveness_metrics.num_user_interactions) {
+  if (soft_nav_responsiveness_metrics_normalization.num_user_interactions()) {
     builder
         .SetInteractiveTiming_UserInteractionLatency_HighPercentile2_MaxEventDuration(
-            page_load_metrics::ResponsivenessMetricsNormalization::
-                ApproximateHighPercentile(
-                    soft_nav_normalized_responsiveness_metrics
-                        .num_user_interactions,
-                    max_event_durations.worst_ten_latencies)
-                    .InMilliseconds());
+            soft_nav_responsiveness_metrics_normalization
+                .ApproximateHighPercentile()
+                .value()
+                .InMilliseconds());
     builder.SetInteractiveTiming_NumInteractions(
         ukm::GetExponentialBucketMinForCounts1000(
-            soft_nav_normalized_responsiveness_metrics.num_user_interactions));
+            soft_nav_responsiveness_metrics_normalization
+                .num_user_interactions()));
   }
 
   // Don't report CLS if we were never in the foreground.
@@ -727,25 +724,22 @@
 void UkmPageLoadMetricsObserver::
     RecordResponsivenessMetricsBeforeSoftNavigationForMainFrame() {
   ukm::builders::PageLoad builder(GetDelegate().GetPageUkmSourceId());
-  const page_load_metrics::NormalizedResponsivenessMetrics&
-      normalized_responsiveness_metrics_before_soft_nav =
+  const page_load_metrics::ResponsivenessMetricsNormalization&
+      responsiveness_metrics_normalization_before_soft_nav =
           GetDelegate()
-              .GetSoftNavigationIntervalNormalizedResponsivenessMetrics();
-  auto& max_event_durations = normalized_responsiveness_metrics_before_soft_nav
-                                  .normalized_max_event_durations;
-  if (normalized_responsiveness_metrics_before_soft_nav.num_user_interactions) {
+              .GetSoftNavigationIntervalResponsivenessMetricsNormalization();
+  if (responsiveness_metrics_normalization_before_soft_nav
+          .num_user_interactions()) {
     builder
         .SetInteractiveTimingBeforeSoftNavigation_UserInteractionLatency_HighPercentile2_MaxEventDuration(
-            page_load_metrics::ResponsivenessMetricsNormalization::
-                ApproximateHighPercentile(
-                    normalized_responsiveness_metrics_before_soft_nav
-                        .num_user_interactions,
-                    max_event_durations.worst_ten_latencies)
-                    .InMilliseconds());
+            responsiveness_metrics_normalization_before_soft_nav
+                .ApproximateHighPercentile()
+                .value()
+                .InMilliseconds());
     builder.SetInteractiveTimingBeforeSoftNavigation_NumInteractions(
         ukm::GetExponentialBucketMinForCounts1000(
-            normalized_responsiveness_metrics_before_soft_nav
-                .num_user_interactions));
+            responsiveness_metrics_normalization_before_soft_nav
+                .num_user_interactions()));
   }
   builder.Record(ukm::UkmRecorder::Get());
 }
@@ -1356,28 +1350,22 @@
   DCHECK(!last_time_shown_.is_null());
 
   ukm::builders::PageLoad builder(GetDelegate().GetPageUkmSourceId());
-  const page_load_metrics::NormalizedResponsivenessMetrics&
-      normalized_responsiveness_metrics =
-          GetDelegate().GetNormalizedResponsivenessMetrics();
-  auto& max_event_durations =
-      normalized_responsiveness_metrics.normalized_max_event_durations;
-  if (normalized_responsiveness_metrics.num_user_interactions) {
+  const page_load_metrics::ResponsivenessMetricsNormalization&
+      responsiveness_metrics_normalization =
+          GetDelegate().GetResponsivenessMetricsNormalization();
+  if (responsiveness_metrics_normalization.num_user_interactions()) {
     builder
         .SetInteractiveTiming_UserInteractionLatencyAtFirstOnHidden_HighPercentile2_MaxEventDuration(
-            page_load_metrics::ResponsivenessMetricsNormalization::
-                ApproximateHighPercentile(
-                    normalized_responsiveness_metrics.num_user_interactions,
-                    max_event_durations.worst_ten_latencies)
-                    .InMilliseconds());
+            responsiveness_metrics_normalization.ApproximateHighPercentile()
+                .value()
+                .InMilliseconds());
 
     UmaHistogramCustomTimes(
         "PageLoad.InteractiveTiming.UserInteractionLatencyAtFirstOnHidden."
         "HighPercentile2."
         "MaxEventDuration",
-        page_load_metrics::ResponsivenessMetricsNormalization::
-            ApproximateHighPercentile(
-                normalized_responsiveness_metrics.num_user_interactions,
-                max_event_durations.worst_ten_latencies),
+        responsiveness_metrics_normalization.ApproximateHighPercentile()
+            .value(),
         base::Milliseconds(1), base::Seconds(60), 50);
   }
   builder.Record(ukm::UkmRecorder::Get());
@@ -1567,24 +1555,22 @@
 
 void UkmPageLoadMetricsObserver::RecordResponsivenessMetrics() {
   ukm::builders::PageLoad builder(GetDelegate().GetPageUkmSourceId());
-  const page_load_metrics::NormalizedResponsivenessMetrics&
-      normalized_responsiveness_metrics =
-          GetDelegate().GetNormalizedResponsivenessMetrics();
-  auto& max_event_durations =
-      normalized_responsiveness_metrics.normalized_max_event_durations;
-  if (normalized_responsiveness_metrics.num_user_interactions) {
+  const page_load_metrics::ResponsivenessMetricsNormalization&
+      responsiveness_metrics_normalization =
+          GetDelegate().GetResponsivenessMetricsNormalization();
+  if (responsiveness_metrics_normalization.num_user_interactions()) {
     builder.SetInteractiveTiming_WorstUserInteractionLatency_MaxEventDuration(
-        max_event_durations.worst_latency.InMilliseconds());
+        responsiveness_metrics_normalization.worst_latency()
+            .value()
+            .InMilliseconds());
     builder
         .SetInteractiveTiming_UserInteractionLatency_HighPercentile2_MaxEventDuration(
-            page_load_metrics::ResponsivenessMetricsNormalization::
-                ApproximateHighPercentile(
-                    normalized_responsiveness_metrics.num_user_interactions,
-                    max_event_durations.worst_ten_latencies)
-                    .InMilliseconds());
+            responsiveness_metrics_normalization.ApproximateHighPercentile()
+                .value()
+                .InMilliseconds());
     builder.SetInteractiveTiming_NumInteractions(
         ukm::GetExponentialBucketMinForCounts1000(
-            normalized_responsiveness_metrics.num_user_interactions));
+            responsiveness_metrics_normalization.num_user_interactions()));
   }
   builder.Record(ukm::UkmRecorder::Get());
 }
diff --git a/chrome/browser/readaloud/android/BUILD.gn b/chrome/browser/readaloud/android/BUILD.gn
index 031ae223..c052f962 100644
--- a/chrome/browser/readaloud/android/BUILD.gn
+++ b/chrome/browser/readaloud/android/BUILD.gn
@@ -201,6 +201,7 @@
     "java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuItem.java",
     "java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuSheetContent.java",
     "java/src/org/chromium/chrome/browser/readaloud/player/expanded/OptionsMenuSheetContent.java",
+    "java/src/org/chromium/chrome/browser/readaloud/player/expanded/SpeedMenuSheetContent.java",
     "java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerCoordinator.java",
     "java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerLayout.java",
     "java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerMediator.java",
@@ -241,6 +242,7 @@
     "java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuSheetContentUnitTest.java",
     "java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuUnitTest.java",
     "java/src/org/chromium/chrome/browser/readaloud/player/expanded/OptionsMenuSheetContentUnitTest.java",
+    "java/src/org/chromium/chrome/browser/readaloud/player/expanded/SpeedMenuSheetContentUnitTest.java",
     "java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerCoordinatorUnitTest.java",
     "java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerLayoutUnitTest.java",
     "java/src/org/chromium/chrome/browser/readaloud/player/mini/MiniPlayerMediatorUnitTest.java",
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudPrefs.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudPrefs.java
index ab2e4cc..0c0f52f4 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudPrefs.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudPrefs.java
@@ -7,7 +7,6 @@
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
-import org.chromium.base.Log;
 import org.chromium.components.prefs.PrefService;
 
 import java.util.Collections;
@@ -63,18 +62,8 @@
      * @return Playback speed setting.
      */
     public static float getSpeed(PrefService prefs) {
-        float speed = DEFAULT_SPEED;
-        if (prefs.hasPrefPath(SPEED_PATH)) {
-            try {
-                speed = Float.parseFloat(prefs.getString(SPEED_PATH));
-            } catch (NumberFormatException exception) {
-                Log.e(
-                        TAG,
-                        "Failed to parse speed setting, using default. Details: %s",
-                        exception.getMessage());
-            }
-        }
-        return speed;
+        return (float)
+                (prefs.hasPrefPath(SPEED_PATH) ? prefs.getDouble(SPEED_PATH) : DEFAULT_SPEED);
     }
 
     /**
@@ -84,7 +73,7 @@
      * @param speed Playback speed to store.
      */
     public static void setSpeed(PrefService prefs, float speed) {
-        prefs.setString(SPEED_PATH, Float.toString(speed));
+        prefs.setDouble(SPEED_PATH, (double) speed);
     }
 
     /**
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudPrefsUnitTest.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudPrefsUnitTest.java
index e3a67dce1..520cced 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudPrefsUnitTest.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudPrefsUnitTest.java
@@ -16,8 +16,6 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
@@ -39,10 +37,6 @@
     @Rule public JniMocker mJniMocker = new JniMocker();
     @Mock ReadAloudPrefs.Natives mNativeMock;
 
-    @Captor private ArgumentCaptor<String> mPrefNameCaptor;
-    @Captor private ArgumentCaptor<String> mPrefStringValueCaptor;
-    @Captor private ArgumentCaptor<Boolean> mPrefBooleanValueCaptor;
-
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
@@ -100,14 +94,14 @@
 
     @Test
     public void testGetSpeed() {
-        mPrefService.setString("readaloud.speed", "2.0");
+        mPrefService.setDouble("readaloud.speed", 2d);
         assertEquals(2f, ReadAloudPrefs.getSpeed(mPrefService), /* delta= */ 0f);
     }
 
     @Test
     public void testSetSpeed() {
         ReadAloudPrefs.setSpeed(mPrefService, 2f);
-        verify(mPrefService).setString(eq("readaloud.speed"), eq("2.0"));
+        verify(mPrefService).setDouble(eq("readaloud.speed"), eq(2d));
     }
 
     @Test
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/InteractionHandler.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/InteractionHandler.java
index 299e0d5..de4a4c1 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/InteractionHandler.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/InteractionHandler.java
@@ -48,6 +48,7 @@
 
     /**
      * Called when the user changes the playback speed.
+     *
      * @param newSpeed New speed.
      */
     void onSpeedChange(float newSpeed);
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerCoordinatorUnitTest.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerCoordinatorUnitTest.java
index 294dee62..555dfa6 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerCoordinatorUnitTest.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerCoordinatorUnitTest.java
@@ -46,7 +46,6 @@
 import org.chromium.chrome.modules.readaloud.Player;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.prefs.PrefService;
-import org.chromium.ui.modelutil.PropertyModel;
 
 /** Unit tests for {@link PlayerCoordinator}. */
 @RunWith(BaseRobolectricTestRunner.class)
@@ -74,7 +73,6 @@
     private MockPrefServiceHelper mMockPrefServiceHelper;
 
     private PlayerCoordinator mPlayerCoordinator;
-    private PropertyModel mModel;
 
     @Mock private Player.Delegate mDelegate;
     @Mock private ExpandedPlayerCoordinator mExpandedPlayer;
@@ -131,7 +129,7 @@
         // Mini player should be inflated and attached.
         verify(mMiniPlayerViewStub).inflate();
         // User prefs should be read into the model.
-        verify(prefs).getString(eq("readaloud.speed"));
+        verify(prefs).getDouble(eq("readaloud.speed"));
     }
 
     @Test
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediator.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediator.java
index 1c3d0e0..14b484fe 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediator.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediator.java
@@ -158,8 +158,8 @@
 
     @Override
     public void onSpeedChange(float newSpeed) {
-        // TODO change playback speed
         ReadAloudPrefs.setSpeed(mDelegate.getPrefService(), newSpeed);
+        mPlayback.setRate(newSpeed);
     }
 
     @Override
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediatorUnitTest.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediatorUnitTest.java
index ca5b590..e6c30cc 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediatorUnitTest.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/PlayerMediatorUnitTest.java
@@ -335,6 +335,15 @@
     }
 
     @Test
+    public void testOnSpeedChange() {
+        mMediator.setPlayback(mPlayback);
+        mMediator.onSpeedChange(0.5f);
+        verify(mPlayback).setRate(0.5f);
+        mMediator.onSpeedChange(2f);
+        assertEquals(2f, ReadAloudPrefs.getSpeed(mDelegate.getPrefService()), /* delta= */ 0f);
+    }
+
+    @Test
     public void testOnMiniPlayerExpandClick() {
         mMediator.onMiniPlayerExpandClick();
         verify(mPlayerCoordinator).expand();
@@ -370,12 +379,6 @@
         verify(mPlayback).seek(anyLong());
     }
 
-    @Test
-    public void testOnSpeedChange() {
-        mMediator.onSpeedChange(2f);
-        assertEquals(2f, ReadAloudPrefs.getSpeed(mDelegate.getPrefService()), /* delta= */ 0f);
-    }
-
     private void resetPlayback() {
         reset(mPlayback);
         doReturn(mPlaybackMetadata).when(mPlayback).getMetadata();
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerSheetContent.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerSheetContent.java
index 4ddada7..df9d61c 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerSheetContent.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerSheetContent.java
@@ -18,6 +18,7 @@
 
 import org.chromium.base.Log;
 import org.chromium.chrome.browser.readaloud.player.InteractionHandler;
+import org.chromium.chrome.browser.readaloud.player.PlayerProperties;
 import org.chromium.chrome.browser.readaloud.player.R;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
@@ -37,6 +38,8 @@
     private final SeekBar mSeekBar;
     private View mContentView;
     private OptionsMenuSheetContent mOptionsMenu;
+    private SpeedMenuSheetContent mSpeedMenu;
+    private TextView mSpeedButton;
 
     public ExpandedPlayerSheetContent(
             Context context, BottomSheetController bottomSheetController, PropertyModel model) {
@@ -49,9 +52,11 @@
         mOptionsMenu =
                 new OptionsMenuSheetContent(
                         mContext, /* parent= */ this, mBottomSheetController, mModel);
+        mSpeedMenu =
+                new SpeedMenuSheetContent(
+                        mContext, /* parent= */ this, mBottomSheetController, mModel);
     }
 
-    @SuppressWarnings("SetTextI18n")
     @VisibleForTesting
     ExpandedPlayerSheetContent(
             Context context,
@@ -63,6 +68,7 @@
         mContentView = contentView;
         mModel = model;
         Resources res = mContext.getResources();
+        mSpeedButton = (TextView) mContentView.findViewById(R.id.readaloud_playback_speed);
         mContentView
                 .findViewById(R.id.readaloud_seek_back_button)
                 .setContentDescription(res.getString(R.string.readaloud_replay, BACK_SECONDS));
@@ -114,22 +120,23 @@
         setOnClickListener(R.id.readaloud_seek_back_button, handler::onSeekBackClick);
         setOnClickListener(R.id.readaloud_seek_forward_button, handler::onSeekForwardClick);
         setOnClickListener(R.id.readaloud_expanded_player_publisher, handler::onPublisherClick);
+        setOnClickListener(R.id.readaloud_playback_speed, this::showSpeedMenu);
         setOnClickListener(R.id.readaloud_more_button, this::showOptionsMenu);
 
         SeekBar seekBar =
                 (SeekBar) mContentView.findViewById(R.id.readaloud_expanded_player_seek_bar);
         seekBar.setOnSeekBarChangeListener(handler.getSeekBarChangeListener());
+        mSpeedMenu.setInteractionHandler(handler);
     }
 
-    @SuppressWarnings({"SetTextI18n", "DefaultLocale"})
     public void setSpeed(float speed) {
-        TextView speedButton = (TextView) mContentView.findViewById(R.id.readaloud_playback_speed);
-        speedButton.setText(String.format("%.1fx", speed));
-        speedButton.setContentDescription(
+        mModel.set(PlayerProperties.SPEED, speed);
+        String speedString = SpeedMenuSheetContent.speedFormatter(speed);
+        mSpeedButton.setText(
+                mContext.getResources().getString(R.string.readaloud_speed, speedString));
+        mSpeedButton.setContentDescription(
                 mContext.getResources()
-                        .getString(
-                                R.string.readaloud_speed_menu_button,
-                                String.format("%.1f", speed)));
+                        .getString(R.string.readaloud_speed_menu_button, speedString));
     }
 
     public void setPlaying(boolean playing) {
@@ -168,6 +175,11 @@
         mOptionsMenu.notifySheetClosed();
     }
 
+    public void showSpeedMenu() {
+        mBottomSheetController.hideContent(this, /* animate= */ false);
+        mBottomSheetController.requestShowContent(mSpeedMenu, /* animate= */ true);
+    }
+
     // BottomSheetContent implementation
 
     @Override
@@ -270,7 +282,12 @@
     }
 
     @VisibleForTesting
-    public void setOptionsMenu(OptionsMenuSheetContent optionsMenu) {
+    public void setOptionsMenuSheetContent(OptionsMenuSheetContent optionsMenu) {
         mOptionsMenu = optionsMenu;
     }
+
+    @VisibleForTesting
+    public void setSpeedMenuSheetContent(SpeedMenuSheetContent speedMenu) {
+        mSpeedMenu = speedMenu;
+    }
 }
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerSheetContentUnitTest.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerSheetContentUnitTest.java
index ea2e5e9..0a904a0 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerSheetContentUnitTest.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerSheetContentUnitTest.java
@@ -35,6 +35,8 @@
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.ui.modelutil.PropertyModel;
 
+import java.util.Locale;
+
 /** Unit tests for {@link ExpandedPlayerSheetContent}. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
@@ -43,6 +45,7 @@
     @Mock private InteractionHandler mInteractionHandler;
     @Mock private PropertyModel mModel;
     @Mock private OptionsMenuSheetContent mOptionsMenu;
+    @Mock private SpeedMenuSheetContent mSpeedMenu;
     @Mock private View.OnClickListener mOnClickListener;
 
     private Context mContext;
@@ -76,6 +79,7 @@
         mTitleView = (TextView) mContentView.findViewById(R.id.readaloud_expanded_player_title);
         mPublisherView =
                 (TextView) mContentView.findViewById(R.id.readaloud_expanded_player_publisher);
+        mSpeedView = (TextView) mContentView.findViewById(R.id.readaloud_playback_speed);
         mBackButton = (ImageView) mContentView.findViewById(R.id.readaloud_seek_back_button);
         mForwardButton = (ImageView) mContentView.findViewById(R.id.readaloud_seek_forward_button);
         mPlayPauseButton = (ImageView) mContentView.findViewById(R.id.readaloud_play_pause_button);
@@ -83,13 +87,14 @@
         mContent =
                 new ExpandedPlayerSheetContent(
                         mContext, mBottomSheetController, mContentView, mModel);
-        mContent.setOptionsMenu(mOptionsMenu);
+        mContent.setOptionsMenuSheetContent(mOptionsMenu);
+        mContent.setSpeedMenuSheetContent(mSpeedMenu);
     }
 
     @Test
     public void verifyInitialA11yStrings() {
-        assertEquals("1.0x", mSpeedView.getText());
-        assertEquals("Playback speed: 1.0. Click to change.", mSpeedView.getContentDescription());
+        assertEquals("1x", mSpeedView.getText());
+        assertEquals("Playback speed: 1. Click to change.", mSpeedView.getContentDescription());
         assertEquals("Back 10 seconds", mBackButton.getContentDescription());
         assertEquals("Forward 30 seconds", mForwardButton.getContentDescription());
     }
@@ -156,12 +161,19 @@
     @Test
     public void testSetSpeed() {
         mContent.setSpeed(0.5f);
-        assertEquals("0.5x", mSpeedView.getText());
+        assertEquals("0.5x", mSpeedView.getText().toString());
         assertEquals("Playback speed: 0.5. Click to change.", mSpeedView.getContentDescription());
 
         mContent.setSpeed(2f);
-        assertEquals("2.0x", mSpeedView.getText());
-        assertEquals("Playback speed: 2.0. Click to change.", mSpeedView.getContentDescription());
+        assertEquals("2x", mSpeedView.getText());
+        assertEquals("Playback speed: 2. Click to change.", mSpeedView.getContentDescription());
+    }
+
+    @Test
+    public void testSetSpeed_languages() {
+        Locale.setDefault(new Locale("es", "ES"));
+        mContent.setSpeed(0.5f);
+        assertEquals("0,5x", mSpeedView.getText().toString());
     }
 
     @Test
@@ -203,7 +215,14 @@
     public void testShowOptionsMenu() {
         mContent.showOptionsMenu();
         verify(mBottomSheetController).hideContent(mContent, false);
-        verify(mBottomSheetController).requestShowContent(mContent.getOptionsMenu(), true);
+        verify(mBottomSheetController).requestShowContent(mOptionsMenu, true);
+    }
+
+    @Test
+    public void testShowSpeedMenu() {
+        mContent.showSpeedMenu();
+        verify(mBottomSheetController).hideContent(mContent, false);
+        verify(mBottomSheetController).requestShowContent(mSpeedMenu, true);
     }
 
     @Test
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/Menu.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/Menu.java
index 0846728..d6b4a0b9 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/Menu.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/Menu.java
@@ -107,6 +107,12 @@
     }
 
     void onRadioButtonSelected(int itemId) {
+        for (Map.Entry<Integer, Integer> itemIndex : mItemIdToIndex.entrySet()) {
+            if (itemIndex.getKey() != itemId) {
+                MenuItem item = (MenuItem) mItemsContainer.getChildAt(itemIndex.getValue());
+                item.setValue(false);
+            }
+        }
         if (mRadioTrueHandler != null) {
             mRadioTrueHandler.onResult(itemId);
         }
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuItem.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuItem.java
index 8338075..d2ab414 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuItem.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuItem.java
@@ -110,7 +110,6 @@
                         });
                 setEndView(layout, radioButton);
                 break;
-
             case Action.NONE:
             default:
                 break;
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuSheetContent.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuSheetContent.java
index 254844d..2e202fb 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuSheetContent.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuSheetContent.java
@@ -22,7 +22,7 @@
 class MenuSheetContent implements BottomSheetContent {
     private static final String TAG = "ReadAloudMenu";
     private final BottomSheetController mBottomSheetController;
-    private final BottomSheetContent mParent;
+    protected final BottomSheetContent mParent;
     private boolean mOpeningSubmenu;
     protected final Menu mMenu;
 
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuUnitTest.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuUnitTest.java
index 26c0f17..d8d30165 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuUnitTest.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuUnitTest.java
@@ -176,7 +176,17 @@
     @Test
     public void testOnRadioButtonSelected() {
         mMenu.setRadioTrueHandler(mHandler);
+        for (int i = 0; i < 3; i++) {
+            mMenu.addItem(i, 0, "test item", Action.RADIO);
+        }
+        mMenu.onRadioButtonSelected(0);
         mMenu.onRadioButtonSelected(1);
         verify(mHandler).onResult(1);
+        assertFalse(
+                ((RadioButton) mMenu.getItem(0).findViewById(R.id.readaloud_radio_button))
+                        .isChecked());
+        assertFalse(
+                ((RadioButton) mMenu.getItem(2).findViewById(R.id.readaloud_radio_button))
+                        .isChecked());
     }
 }
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/SpeedMenuSheetContent.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/SpeedMenuSheetContent.java
new file mode 100644
index 0000000..1859411
--- /dev/null
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/SpeedMenuSheetContent.java
@@ -0,0 +1,83 @@
+// 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.
+
+package org.chromium.chrome.browser.readaloud.player.expanded;
+
+import android.content.Context;
+
+import androidx.annotation.VisibleForTesting;
+
+import org.chromium.chrome.browser.readaloud.player.InteractionHandler;
+import org.chromium.chrome.browser.readaloud.player.PlayerProperties;
+import org.chromium.chrome.browser.readaloud.player.R;
+import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
+import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
+import org.chromium.ui.modelutil.PropertyModel;
+
+/** Bottom sheet content for Read Aloud expanded player speed options menu. */
+class SpeedMenuSheetContent extends MenuSheetContent {
+    private static final String TAG = "ReadAloudSpeed";
+    private final Context mContext;
+    private final PropertyModel mModel;
+    private InteractionHandler mInteractionHandler;
+    private float[] mSpeeds = {0.5f, 0.8f, 1.0f, 1.2f, 1.5f, 2.0f, 3.0f, 4.0f};
+
+    SpeedMenuSheetContent(
+            Context context,
+            BottomSheetContent parent,
+            BottomSheetController bottomSheetController,
+            PropertyModel model) {
+        super(context, parent, bottomSheetController, R.string.readaloud_options_menu_title);
+        mContext = context;
+        mModel = model;
+        setUp();
+    }
+
+    @VisibleForTesting
+    SpeedMenuSheetContent(
+            Context context,
+            BottomSheetContent parent,
+            BottomSheetController bottomSheetController,
+            Menu menu,
+            PropertyModel model) {
+        super(context, parent, bottomSheetController, R.string.readaloud_options_menu_title, menu);
+        mContext = context;
+        mModel = model;
+        setUp();
+    }
+
+    private void setUp() {
+        float currentSpeed = mModel.get(PlayerProperties.SPEED);
+        for (int i = 0; i < mSpeeds.length; i++) {
+            String speedString = speedFormatter(mSpeeds[i]);
+            MenuItem item =
+                    mMenu.addItem(
+                            i,
+                            0,
+                            mContext.getResources()
+                                    .getString(R.string.readaloud_speed, speedString),
+                            MenuItem.Action.RADIO);
+            if (mSpeeds[i] == currentSpeed && item != null) {
+                item.setValue(true);
+            }
+        }
+        mMenu.setItemClickHandler(this::onClick);
+    }
+
+    private void onClick(int itemId) {
+        ((ExpandedPlayerSheetContent) mParent).setSpeed(mSpeeds[itemId]);
+    }
+
+    void setInteractionHandler(InteractionHandler handler) {
+        mInteractionHandler = handler;
+        mMenu.setRadioTrueHandler(
+                (itemId) -> {
+                    handler.onSpeedChange(mSpeeds[itemId]);
+                });
+    }
+
+    public static String speedFormatter(float speed) {
+        return String.format(((speed % 1 < 0.01) ? "%.0f" : "%.1f"), speed);
+    }
+}
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/SpeedMenuSheetContentUnitTest.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/SpeedMenuSheetContentUnitTest.java
new file mode 100644
index 0000000..9e6b00d
--- /dev/null
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/SpeedMenuSheetContentUnitTest.java
@@ -0,0 +1,86 @@
+// 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.
+
+package org.chromium.chrome.browser.readaloud.player.expanded;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.verify;
+
+import android.app.Activity;
+import android.content.Context;
+import android.widget.TextView;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.chrome.browser.readaloud.player.InteractionHandler;
+import org.chromium.chrome.browser.readaloud.player.PlayerProperties;
+import org.chromium.chrome.browser.readaloud.player.R;
+import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
+import org.chromium.ui.modelutil.PropertyModel;
+
+/** Unit tests for {@link SpeedMenuSheetContent}. */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class SpeedMenuSheetContentUnitTest {
+    @Mock private BottomSheetController mBottomSheetController;
+    @Mock private ExpandedPlayerSheetContent mBottomSheetContent;
+    @Mock private InteractionHandler mHandler;
+    private PropertyModel mModel;
+    private Activity mActivity;
+    private Context mContext;
+    private Menu mMenu;
+    private SpeedMenuSheetContent mContent;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = ApplicationProvider.getApplicationContext();
+        mActivity = Robolectric.buildActivity(AppCompatActivity.class).setup().get();
+        // Need to set theme before inflating layout.
+        mActivity.setTheme(R.style.Theme_BrowserUI_DayNight);
+        mMenu = (Menu) mActivity.getLayoutInflater().inflate(R.layout.readaloud_menu, null);
+        mModel = new PropertyModel.Builder(PlayerProperties.ALL_KEYS).build();
+        mModel.set(PlayerProperties.SPEED, 1.0f);
+        mContent =
+                new SpeedMenuSheetContent(
+                        mContext, mBottomSheetContent, mBottomSheetController, mMenu, mModel);
+    }
+
+    @Test
+    public void testSetup() {
+        assertEquals(
+                ((TextView) mMenu.getItem(0).findViewById(R.id.item_label)).getText().toString(),
+                "0.5x");
+        assertEquals(
+                ((TextView) mMenu.getItem(7).findViewById(R.id.item_label)).getText().toString(),
+                "4x");
+    }
+
+    @Test
+    public void testOnClick() {
+        assertTrue(mMenu.getItem(0).getChildAt(0).performClick());
+        verify(mBottomSheetContent).setSpeed(0.5f);
+
+        assertTrue(mMenu.getItem(7).getChildAt(0).performClick());
+        verify(mBottomSheetContent).setSpeed(4.0f);
+    }
+
+    @Test
+    public void testSetInteractionHandler() {
+        mContent.setInteractionHandler(mHandler);
+        assertTrue(mMenu.getItem(0).getChildAt(0).performClick());
+        verify(mHandler).onSpeedChange(0.5f);
+    }
+}
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/testing/MockPrefServiceHelper.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/testing/MockPrefServiceHelper.java
index a0a6e61..b2108b2 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/testing/MockPrefServiceHelper.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/testing/MockPrefServiceHelper.java
@@ -6,6 +6,7 @@
 
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.anyDouble;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
 
@@ -26,8 +27,10 @@
         doAnswer(this::contains).when(mPrefService).hasPrefPath(any());
         doAnswer(invocation -> (String) get(invocation)).when(mPrefService).getString(any());
         doAnswer(invocation -> (Boolean) get(invocation)).when(mPrefService).getBoolean(any());
+        doAnswer(invocation -> (Double) get(invocation)).when(mPrefService).getDouble(any());
         doAnswer(this::set).when(mPrefService).setString(any(), any());
         doAnswer(this::set).when(mPrefService).setBoolean(any(), anyBoolean());
+        doAnswer(this::set).when(mPrefService).setDouble(any(), anyDouble());
         mStorage = new HashMap<>();
     }
 
diff --git a/chrome/browser/readaloud/android/resources/android_readaloud_strings.grd b/chrome/browser/readaloud/android/resources/android_readaloud_strings.grd
index dd3c63db0..5394ead 100644
--- a/chrome/browser/readaloud/android/resources/android_readaloud_strings.grd
+++ b/chrome/browser/readaloud/android/resources/android_readaloud_strings.grd
@@ -201,6 +201,9 @@
       <message name="IDS_READALOUD_PAUSE" desc="Accessibility string for the 'Listen to this page' pause button.">
         Pause
       </message>
+      <message name="IDS_READALOUD_SPEED" desc="Strings for the playback speed options menu so the user can select playback speed.">
+       <ph name="PLAYBACK_SPEED">%1$s<ex>1.5</ex>x</ph>
+      </message>
       <message name="IDS_READALOUD_SPEED_MENU_BUTTON" desc="Accessibility string for the 'Listen to this page' playback speed menu button.">
         Playback speed: <ph name="PLAYBACK_SPEED">%1$s<ex>1.0</ex></ph>. Click to change.
       </message>
diff --git a/chrome/browser/readaloud/android/resources/android_readaloud_strings_grd/IDS_READALOUD_SPEED.png.sha1 b/chrome/browser/readaloud/android/resources/android_readaloud_strings_grd/IDS_READALOUD_SPEED.png.sha1
new file mode 100644
index 0000000..c179e216
--- /dev/null
+++ b/chrome/browser/readaloud/android/resources/android_readaloud_strings_grd/IDS_READALOUD_SPEED.png.sha1
@@ -0,0 +1 @@
+f96edf0c7476d71ec891cb7c934e077aa0520a1f
\ No newline at end of file
diff --git a/chrome/browser/resources/dlp_internals/BUILD.gn b/chrome/browser/resources/dlp_internals/BUILD.gn
index dc025be..1bc7a255c 100644
--- a/chrome/browser/resources/dlp_internals/BUILD.gn
+++ b/chrome/browser/resources/dlp_internals/BUILD.gn
@@ -9,6 +9,7 @@
 
   static_files = [ "index.html" ]
   web_component_files = [ "dlp_internals_ui.ts" ]
+  non_web_component_files = [ "dlp_utils.ts" ]
   mojo_files = [ "$root_gen_dir/chrome/browser/ui/webui/dlp_internals/dlp_internals.mojom-webui.ts" ]
   mojo_files_deps =
       [ "//chrome/browser/ui/webui/dlp_internals:mojo_bindings_ts__generator" ]
diff --git a/chrome/browser/resources/dlp_internals/dlp_internals_ui.html b/chrome/browser/resources/dlp_internals/dlp_internals_ui.html
index e5bd2dab..3a7894d 100644
--- a/chrome/browser/resources/dlp_internals/dlp_internals_ui.html
+++ b/chrome/browser/resources/dlp_internals/dlp_internals_ui.html
@@ -17,6 +17,14 @@
     flex: 1;
     position: relative;
   }
+
+  table,
+  th,
+  td {
+    border: 1px solid black;
+    border-collapse: collapse;
+    padding: 3px;
+  }
 </style>
 
 <template is="dom-if" if="[[isOtr_]]">
@@ -39,6 +47,33 @@
 
     <div class="tabpanel" id="oncontent"></div>
 
-    <div class="tabpanel" id="reporting"></div>
+    <div class="tabpanel" id="reporting">
+      <table>
+        <tr>
+          <th>Source Pattern</th>
+          <th>Destination</th>
+          <th>Restriction</th>
+          <th>Mode</th>
+          <th>User Type</th>
+          <th>Content Name</th>
+          <th>Rule Name</th>
+          <th>Rule ID</th>
+          <th>Timestamp (micro)</th>
+        </tr>
+        <template is="dom-repeat" items="[[reportingEvents_]]">
+          <tr>
+            <td>[[item.sourcePattern]]</td>
+            <td>[[destinationToString(item.destination)]]</td>
+            <td>[[restrictionToString(item.restriction)]]</td>
+            <td>[[modeToString(item.mode)]]</td>
+            <td>[[userTypeToString(item.userType)]]</td>
+            <td>[[item.contentName]]</td>
+            <td>[[item.triggeredRuleName]]</td>
+            <td>[[item.triggeredRuleId]]</td>
+            <td>[[timestampToString(item.timestampMicro)]]</td>
+          </tr>
+        </template>
+      </table>
+    </div>
   </iron-pages>
 </template>
diff --git a/chrome/browser/resources/dlp_internals/dlp_internals_ui.ts b/chrome/browser/resources/dlp_internals/dlp_internals_ui.ts
index 378be6b..9627e9a 100644
--- a/chrome/browser/resources/dlp_internals/dlp_internals_ui.ts
+++ b/chrome/browser/resources/dlp_internals/dlp_internals_ui.ts
@@ -9,20 +9,9 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {DataTransferEndpoint, DlpEvent, EndpointType, PageHandler, PageHandlerInterface, ReportingObserverReceiver} from './dlp_internals.mojom-webui.js';
+import {DataTransferEndpoint, DlpEvent, DlpEvent_Mode, DlpEvent_Restriction, DlpEvent_UserType, EndpointType, EventDestination, PageHandler, PageHandlerInterface, ReportingObserverReceiver} from './dlp_internals.mojom-webui.js';
 import {getTemplate} from './dlp_internals_ui.html.js';
-
-const EndpointTypeMap = {
-  [EndpointType.kDefault]: 'Default',
-  [EndpointType.kUrl]: 'URL',
-  [EndpointType.kClipboardHistory]: 'Clipboard History',
-  [EndpointType.kUnknownVm]: 'Unknown VM',
-  [EndpointType.kArc]: 'Arc',
-  [EndpointType.kBorealis]: 'Borealis',
-  [EndpointType.kCrostini]: 'Crostini',
-  [EndpointType.kPluginVm]: 'Plugin VM',
-  [EndpointType.kLacros]: 'Lacros',
-};
+import {DestinationComponentMap, EndpointTypeMap, EventModeMap, EventRestrictionMap, EventUserTypeMap} from './dlp_utils.js';
 
 // Polymer element DLP Internals UI.
 class DlpInternalsUi extends PolymerElement {
@@ -43,6 +32,7 @@
       tabNames_: Array,
       clipboardSourceType_: String,
       clipboardSourceUrl_: String,
+      reportingEvents_: Array,
     };
   }
 
@@ -77,6 +67,8 @@
   // Clipboard source url.
   private clipboardSourceUrl_: string;
 
+  private reportingEvents_: DlpEvent[] = [];
+
   private readonly pageHandler_: PageHandlerInterface;
   private readonly reportingObserver_: ReportingObserverReceiver;
 
@@ -131,8 +123,57 @@
 
   /** Implements ReportingObserverInterface */
   onReportEvent(event: DlpEvent): void {
-    // TODO(ayaelattar): Show it in the html page.
-    console.warn(JSON.stringify(event));
+    this.reportingEvents_.push(event);
+    this.notifySplices('reportingEvents_', [{
+                         index: this.reportingEvents_.length - 1,
+                         addedCount: 1,
+                         object: this.reportingEvents_,
+                         type: 'splice',
+                         removed: [],
+                       }]);
+  }
+
+  destinationToString(destination: EventDestination|null|undefined): string {
+    if (destination) {
+      if (destination.urlPattern) {
+        return destination.urlPattern;
+      }
+      if (destination.component) {
+        return DestinationComponentMap[destination.component];
+      }
+    }
+    return 'undefined';
+  }
+
+  restrictionToString(restriction: DlpEvent_Restriction|null|
+                      undefined): string {
+    if (restriction) {
+      return EventRestrictionMap[restriction];
+    }
+    return 'undefined';
+  }
+
+  modeToString(mode: DlpEvent_Mode|null|undefined): string {
+    if (mode) {
+      return EventModeMap[mode];
+    }
+    return 'undefined';
+  }
+
+  userTypeToString(userType: DlpEvent_UserType|null|undefined): string {
+    if (userType) {
+      return EventUserTypeMap[userType];
+    }
+    return 'undefined';
+  }
+
+  timestampToString(timestampMicro: bigint): string {
+    if (timestampMicro) {
+      const timestampMilli: number = Number(timestampMicro) / 1000;
+      const timestamp: Date = new Date(timestampMilli);
+      return timestamp.toLocaleString();
+    }
+    return 'undefined';
   }
 }
 
diff --git a/chrome/browser/resources/dlp_internals/dlp_utils.ts b/chrome/browser/resources/dlp_internals/dlp_utils.ts
new file mode 100644
index 0000000..838622f
--- /dev/null
+++ b/chrome/browser/resources/dlp_internals/dlp_utils.ts
@@ -0,0 +1,52 @@
+// 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.
+
+import {DlpEvent_Mode, DlpEvent_Restriction, DlpEvent_UserType, EndpointType, EventDestination_Component} from './dlp_internals.mojom-webui.js';
+
+export const EndpointTypeMap = {
+  [EndpointType.kDefault]: 'Default',
+  [EndpointType.kUrl]: 'URL',
+  [EndpointType.kClipboardHistory]: 'Clipboard History',
+  [EndpointType.kUnknownVm]: 'Unknown VM',
+  [EndpointType.kArc]: 'Arc',
+  [EndpointType.kBorealis]: 'Borealis',
+  [EndpointType.kCrostini]: 'Crostini',
+  [EndpointType.kPluginVm]: 'Plugin VM',
+  [EndpointType.kLacros]: 'Lacros',
+};
+
+export const DestinationComponentMap = {
+  [EventDestination_Component.kUndefinedComponent]: 'Undefined Component',
+  [EventDestination_Component.kArc]: 'ARC',
+  [EventDestination_Component.kCrostini]: 'Crostini',
+  [EventDestination_Component.kPluginVm]: 'PluginVm',
+  [EventDestination_Component.kUsb]: 'USB',
+  [EventDestination_Component.kDrive]: 'GoogleDrive',
+  [EventDestination_Component.kOnedrive]: 'OneDrive',
+};
+
+export const EventRestrictionMap = {
+  [DlpEvent_Restriction.kUndefinedRestriction]: 'Undefined Restriction',
+  [DlpEvent_Restriction.kClipboard]: 'Clipboard',
+  [DlpEvent_Restriction.kScreenshot]: 'Screenshot',
+  [DlpEvent_Restriction.kScreencast]: 'Screencast',
+  [DlpEvent_Restriction.kPrinting]: 'Printing',
+  [DlpEvent_Restriction.kEprivacy]: 'ePrivacy',
+  [DlpEvent_Restriction.kFiles]: 'Files',
+};
+
+export const EventModeMap = {
+  [DlpEvent_Mode.kUndefinedMode]: 'Undefined Mode',
+  [DlpEvent_Mode.kBlock]: 'Block',
+  [DlpEvent_Mode.kReport]: 'Report',
+  [DlpEvent_Mode.kWarn]: 'Warning',
+  [DlpEvent_Mode.kWarnProceed]: 'Warning Proceeded',
+};
+
+export const EventUserTypeMap = {
+  [DlpEvent_UserType.kUndefinedUserType]: 'Undefined User',
+  [DlpEvent_UserType.kRegular]: 'Regular',
+  [DlpEvent_UserType.kManagedGuest]: 'Managed Guest',
+  [DlpEvent_UserType.kKiosk]: 'Kiosk',
+};
diff --git a/chrome/browser/resources/settings/a11y_page/a11y_page.html b/chrome/browser/resources/settings/a11y_page/a11y_page.html
index f077105..3fd8c5f6 100644
--- a/chrome/browser/resources/settings/a11y_page/a11y_page.html
+++ b/chrome/browser/resources/settings/a11y_page/a11y_page.html
@@ -51,7 +51,7 @@
 </if>
         <settings-toggle-button
             class="hr"
-            hidden$="[[!showAccessibilityLabelsSetting_]]"
+            hidden$="[[!hasScreenReader_]]"
             pref="{{prefs.settings.a11y.enable_accessibility_image_labels}}"
             on-change="onA11yImageLabelsChange_"
             label="$i18n{accessibleImageLabelsTitle}"
@@ -62,9 +62,9 @@
             class="hr"
             hidden$="[[!showPdfOcrToggle_]]"
             pref="{{prefs.settings.a11y.pdf_ocr_always_active}}"
-            on-change="onPdfOcrChange_"
             label="$i18n{pdfOcrTitle}"
-            sub-label="$i18n{pdfOcrSubtitle}">
+            sub-label="[[getPdfOcrToggleSublabel_(
+                pdfOcrStatus_, pdfOcrProgress_)]]">
         </settings-toggle-button>
 </if>
 <if expr="is_win or is_linux">
diff --git a/chrome/browser/resources/settings/a11y_page/a11y_page.ts b/chrome/browser/resources/settings/a11y_page/a11y_page.ts
index 96287ce7..2346cb9c 100644
--- a/chrome/browser/resources/settings/a11y_page/a11y_page.ts
+++ b/chrome/browser/resources/settings/a11y_page/a11y_page.ts
@@ -25,10 +25,11 @@
 // </if>
 // clang-format on
 import {SettingsToggleButtonElement} from '/shared/settings/controls/settings_toggle_button.js';
+import {PrefsMixin} from 'chrome://resources/cr_components/settings_prefs/prefs_mixin.js';
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {BaseMixin} from '../base_mixin.js';
 import {loadTimeData} from '../i18n_setup.js';
 import {routes} from '../route.js';
 import {Router} from '../router.js';
@@ -43,13 +44,28 @@
 // </if>
 // clang-format on
 
+// TODO(crbug.com/1442928): Encapsulate all PDF OCR toggle logic to a dedicated
+// pdf-ocr-toggle-button element.
+// <if expr="is_win or is_linux or is_macosx">
+/**
+ * Numerical values should not be changed because they must stay in sync with
+ * screen_ai::ScreenAIInstallState::State defined in screen_ai_install_state.h.
+ */
+enum ScreenAiInstallStatus {
+  NOT_DOWNLOADED = 0,
+  DOWNLOADING = 1,
+  FAILED = 2,
+  DOWNLOADED = 3,
+  READY = 4,
+}
+// </if>
 
 const SettingsA11yPageElementBase =
-    WebUiListenerMixin(BaseMixin(PolymerElement));
+    PrefsMixin(WebUiListenerMixin(I18nMixin(PolymerElement)));
 
-class SettingsA11yPageElement extends SettingsA11yPageElementBase {
+export class SettingsA11yPageElement extends SettingsA11yPageElementBase {
   static get is() {
-    return 'settings-a11y-page';
+    return 'settings-a11y-page' as const;
   }
 
   static get template() {
@@ -106,26 +122,34 @@
       // </if>
 
       /**
-       * Whether to show accessibility labels settings.
+       * Indicate whether a screen reader is enabled. Also, determine whether
+       * to show accessibility labels settings.
        */
-      showAccessibilityLabelsSetting_: {
+      hasScreenReader_: {
         type: Boolean,
         value: false,
       },
 
+      // <if expr="is_win or is_linux or is_macosx">
+      /**
+       * `pdfOcrProgress_` stores the downloading progress in percentage of
+       * the ScreenAI library, which ranges from 0.0 to 100.0.
+       */
+      pdfOcrProgress_: Number,
+
+      /**
+       * `pdfOcrStatus_` stores the ScreenAI library install state.
+       */
+      pdfOcrStatus_: Number,
+
       /**
        * Whether to show pdf ocr settings.
        */
       showPdfOcrToggle_: {
         type: Boolean,
-        value: function() {
-          let isPdfOcrEnabled = false;
-          // <if expr="is_win or is_linux or is_macosx">
-          isPdfOcrEnabled = loadTimeData.getBoolean('pdfOcrEnabled');
-          // </if>
-          return isPdfOcrEnabled;
-        },
+        computed: 'computeShowPdfOcrToggle_(hasScreenReader_)',
       },
+      // </if>
 
       focusConfig_: {
         type: Object,
@@ -185,33 +209,40 @@
   private showFocusHighlightOption_: boolean;
   // </if>
 
-  private showAccessibilityLabelsSetting_: boolean;
-  private showPdfOcrToggle_: boolean;
   private captionSettingsOpensExternally_: boolean;
+  private hasScreenReader_: boolean;
   private showOverscrollHistoryNavigationToggle_: boolean;
 
+  // <if expr="is_win or is_linux or is_macosx">
+  private pdfOcrProgress_: number;
+  private pdfOcrStatus_: ScreenAiInstallStatus;
+  private showPdfOcrToggle_: boolean;
+  // </if>
 
   override ready() {
     super.ready();
 
     this.addWebUiListener(
-        'screen-reader-state-changed',
-        (hasScreenReader: boolean) =>
-            this.onScreenReaderStateChanged_(hasScreenReader));
+        'screen-reader-state-changed', (hasScreenReader: boolean) => {
+          this.hasScreenReader_ = hasScreenReader;
+        });
+    // <if expr="is_win or is_linux or is_macosx">
+    if (loadTimeData.getBoolean('pdfOcrEnabled')) {
+      this.addWebUiListener(
+          'pdf-ocr-state-changed', (pdfOcrState: ScreenAiInstallStatus) => {
+            this.pdfOcrStatus_ = pdfOcrState;
+          });
+      this.addWebUiListener(
+          'pdf-ocr-downloading-progress-changed', (progress: number) => {
+            this.pdfOcrProgress_ = progress;
+          });
+    }
+    // </if>
 
     // Enables javascript and gets the screen reader state.
     chrome.send('a11yPageReady');
   }
 
-  /**
-   * @param hasScreenReader Whether a screen reader is enabled.
-   */
-  private onScreenReaderStateChanged_(hasScreenReader: boolean) {
-    this.showAccessibilityLabelsSetting_ = hasScreenReader;
-    this.showPdfOcrToggle_ =
-        hasScreenReader && loadTimeData.getBoolean('pdfOcrEnabled');
-  }
-
   private onA11yCaretBrowsingChange_(event: Event) {
     if ((event.target as SettingsToggleButtonElement).checked) {
       chrome.metricsPrivate.recordUserAction(
@@ -230,14 +261,36 @@
     }
   }
 
-  private onPdfOcrChange_(event: Event) {
-    const pdfOcrOn = (event.target as SettingsToggleButtonElement).checked;
-    if (pdfOcrOn) {
-      console.error(
-          'Need to check a pdf ocr model and download it if necessary');
+  // <if expr="is_win or is_linux or is_macosx">
+  private getPdfOcrToggleSublabel_(): string {
+    switch (this.pdfOcrStatus_) {
+      case ScreenAiInstallStatus.DOWNLOADING:
+        return this.pdfOcrProgress_ > 0 && this.pdfOcrProgress_ < 100 ?
+            this.i18n('pdfOcrDownloadProgressLabel', this.pdfOcrProgress_) :
+            this.i18n('pdfOcrDownloadingLabel');
+      case ScreenAiInstallStatus.FAILED:
+        return this.i18n('pdfOcrDownloadErrorLabel');
+      case ScreenAiInstallStatus.DOWNLOADED:
+        return this.i18n('pdfOcrDownloadCompleteLabel');
+      case ScreenAiInstallStatus.READY:  // fallthrough
+      case ScreenAiInstallStatus.NOT_DOWNLOADED:
+        // No subtitle update, so show a generic subtitle describing PDF OCR.
+        return this.i18n('pdfOcrSubtitle');
     }
   }
 
+  /**
+   * Return whether to show a PDF OCR toggle button based on:
+   *    1. A PDF OCR feature flag is enabled.
+   *    2. Whether a screen reader is enabled.
+   * Note: on ChromeOS, the PDF OCR toggle is shown on a different settings
+   * page; i.e. Settings > Accessibility > Text-to-Speech.
+   */
+  private computeShowPdfOcrToggle_(): boolean {
+    return loadTimeData.getBoolean('pdfOcrEnabled') && this.hasScreenReader_;
+  }
+  // </if>
+
   // <if expr="not is_chromeos">
   private onFocusHighlightChange_(event: Event) {
     chrome.metricsPrivate.recordBoolean(
@@ -283,4 +336,10 @@
   // </if>
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    [SettingsA11yPageElement.is]: SettingsA11yPageElement;
+  }
+}
+
 customElements.define(SettingsA11yPageElement.is, SettingsA11yPageElement);
diff --git a/chrome/browser/resources/settings/lazy_load.ts b/chrome/browser/resources/settings/lazy_load.ts
index d0d2cc91..f208552e 100644
--- a/chrome/browser/resources/settings/lazy_load.ts
+++ b/chrome/browser/resources/settings/lazy_load.ts
@@ -105,6 +105,8 @@
 export {IronCollapseElement} from 'chrome://resources/polymer/v3_0/iron-collapse/iron-collapse.js';
 export {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 export {PaperTooltipElement} from 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js';
+export {AccessibilityBrowserProxy, AccessibilityBrowserProxyImpl} from './a11y_page/a11y_browser_proxy.js';
+export {SettingsA11yPageElement} from './a11y_page/a11y_page.js';
 // <if expr="not is_chromeos">
 export {SettingsLiveCaptionElement} from './a11y_page/live_caption_section.js';
 export {SettingsLiveTranslateElement} from './a11y_page/live_translate_section.js';
diff --git a/chrome/browser/resources/settings/metrics_browser_proxy.ts b/chrome/browser/resources/settings/metrics_browser_proxy.ts
index 0c8665f..0794e67 100644
--- a/chrome/browser/resources/settings/metrics_browser_proxy.ts
+++ b/chrome/browser/resources/settings/metrics_browser_proxy.ts
@@ -444,7 +444,7 @@
   recordSafetyHubCardStateClicked(
       histogramName: string, state: SafetyHubCardState) {
     chrome.send(
-        'metricsHandler:recordHistogram',
+        'metricsHandler:recordInHistogram',
         [histogramName, state, SafetyHubCardState.MAX_VALUE]);
   }
 
diff --git a/chrome/browser/signin/signin_features.cc b/chrome/browser/signin/signin_features.cc
index 67a0cb6..9af444d8 100644
--- a/chrome/browser/signin/signin_features.cc
+++ b/chrome/browser/signin/signin_features.cc
@@ -79,6 +79,15 @@
 #endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_ANDROID)
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+// Enables the generation of pseudo-stable per-user per-device device
+// identifiers. This identifier can be reset by the user by powerwashing the
+// device.
+BASE_FEATURE(kStableDeviceId,
+             "StableDeviceId",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
 // Enables the client-side processing of the HTTP response header
 // Google-Accounts-RemoveLocalAccount.
 BASE_FEATURE(kProcessGaiaRemoveLocalAccountHeader,
diff --git a/chrome/browser/signin/signin_features.h b/chrome/browser/signin/signin_features.h
index 7f074c9..c7dd282e 100644
--- a/chrome/browser/signin/signin_features.h
+++ b/chrome/browser/signin/signin_features.h
@@ -47,6 +47,10 @@
 #endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_ANDROID)
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+BASE_DECLARE_FEATURE(kStableDeviceId);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
 BASE_DECLARE_FEATURE(kProcessGaiaRemoveLocalAccountHeader);
 
 BASE_DECLARE_FEATURE(kShowEnterpriseDialogForAllManagedAccountsSignin);
diff --git a/chrome/browser/supervised_user/supervised_user_service_factory.cc b/chrome/browser/supervised_user/supervised_user_service_factory.cc
index 249ff60..42a8474a 100644
--- a/chrome/browser/supervised_user/supervised_user_service_factory.cc
+++ b/chrome/browser/supervised_user/supervised_user_service_factory.cc
@@ -76,7 +76,7 @@
       *profile->GetPrefs(),
       *SupervisedUserSettingsServiceFactory::GetInstance()->GetForKey(
           profile->GetProfileKey()),
-      *SyncServiceFactory::GetInstance()->GetForProfile(profile),
+      SyncServiceFactory::GetInstance()->GetForProfile(profile),
       base::BindRepeating(supervised_user::IsSupportedChromeExtensionURL),
       std::make_unique<FilterDelegateImpl>(),
       /*can_show_first_time_interstitial_banner=*/!profile->IsNewProfile());
diff --git a/chrome/browser/themes/browser_theme_pack.cc b/chrome/browser/themes/browser_theme_pack.cc
index 3cb80b5..5c64a01a 100644
--- a/chrome/browser/themes/browser_theme_pack.cc
+++ b/chrome/browser/themes/browser_theme_pack.cc
@@ -12,7 +12,7 @@
 #include <utility>
 
 #include "base/containers/contains.h"
-#include "base/containers/flat_set.h"
+#include "base/containers/fixed_flat_set.h"
 #include "base/files/file.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/metrics/histogram_macros.h"
@@ -967,36 +967,32 @@
 }
 
 bool BrowserThemePack::GetColor(int id, SkColor* color) const {
-  static const base::NoDestructor<
-      base::flat_set<TP::OverwritableByUserThemeProperty>>
-      kOpaqueColors(
-          // Explicitly creating a base::flat_set here is not strictly
-          // necessary according to C++, but we do so to work around
-          // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84849.
-          base::flat_set<TP::OverwritableByUserThemeProperty>({
-              // Background tabs must be opaque since the tabstrip expects to be
-              // able to render text opaquely atop them.
-              TP::COLOR_TAB_BACKGROUND_INACTIVE_FRAME_ACTIVE,
-              TP::COLOR_TAB_BACKGROUND_INACTIVE_FRAME_INACTIVE,
-              TP::COLOR_TAB_BACKGROUND_INACTIVE_FRAME_ACTIVE_INCOGNITO,
-              TP::COLOR_TAB_BACKGROUND_INACTIVE_FRAME_INACTIVE_INCOGNITO,
-              // The frame colors will be used for background tabs when not
-              // otherwise overridden and thus must be opaque as well.
-              TP::COLOR_FRAME_ACTIVE,
-              TP::COLOR_FRAME_INACTIVE,
-              TP::COLOR_FRAME_ACTIVE_INCOGNITO,
-              TP::COLOR_FRAME_INACTIVE_INCOGNITO,
-              // The toolbar is used as the foreground tab color, so it must be
-              // opaque just like background tabs.
-              TP::COLOR_TOOLBAR,
-          }));
+  static constexpr auto kOpaqueColors =
+      base::MakeFixedFlatSet<TP::OverwritableByUserThemeProperty>({
+          // Background tabs must be opaque since the tabstrip expects to be
+          // able to render text opaquely atop them.
+          TP::COLOR_TAB_BACKGROUND_INACTIVE_FRAME_ACTIVE,
+          TP::COLOR_TAB_BACKGROUND_INACTIVE_FRAME_INACTIVE,
+          TP::COLOR_TAB_BACKGROUND_INACTIVE_FRAME_ACTIVE_INCOGNITO,
+          TP::COLOR_TAB_BACKGROUND_INACTIVE_FRAME_INACTIVE_INCOGNITO,
+          // The frame colors will be used for background tabs when not
+          // otherwise overridden and thus must be opaque as well.
+          TP::COLOR_FRAME_ACTIVE,
+          TP::COLOR_FRAME_INACTIVE,
+          TP::COLOR_FRAME_ACTIVE_INCOGNITO,
+          TP::COLOR_FRAME_INACTIVE_INCOGNITO,
+          // The toolbar is used as the foreground tab color, so it must be
+          // opaque just like background tabs.
+          TP::COLOR_TOOLBAR,
+      });
 
   if (colors_) {
     for (size_t i = 0; i < kColorsArrayLength; ++i) {
       if (colors_[i].id == id) {
         *color = colors_[i].color;
-        if (base::Contains(*kOpaqueColors, id))
+        if (base::Contains(kOpaqueColors, id)) {
           *color = SkColorSetA(*color, SK_AlphaOPAQUE);
+        }
         return true;
       }
     }
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 9ee54abf..b35c61dd 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -3463,9 +3463,6 @@
       "webui/nearby_share/nearby_share_dialog_ui.h",
       "webui/nearby_share/shared_resources.cc",
       "webui/nearby_share/shared_resources.h",
-
-      # TODO(crbug.com/1442928): Move to under `enable_screen_ai_service` when
-      # PDF OCR becomes available on windows, macOS, and linux.
       "webui/ash/settings/pages/a11y/pdf_ocr_handler.cc",
       "webui/ash/settings/pages/a11y/pdf_ocr_handler.h",
       "webui/ash/settings/pages/a11y/select_to_speak_handler.cc",
@@ -4726,9 +4723,7 @@
       "commerce/price_tracking/shopping_list_ui_tab_helper.h",
       "dialogs/outdated_upgrade_bubble.cc",
       "dialogs/outdated_upgrade_bubble.h",
-      "plus_addresses/plus_address_creation_controller_desktop.cc",
       "plus_addresses/plus_address_creation_controller_desktop.h",
-      "plus_addresses/plus_address_creation_dialog_view.h",
       "qrcode_generator/qrcode_generator_bubble_controller.cc",
       "qrcode_generator/qrcode_generator_bubble_controller.h",
       "qrcode_generator/qrcode_generator_bubble_view.h",
@@ -5581,7 +5576,9 @@
       "views/permissions/permission_prompt_quiet_icon.cc",
       "views/permissions/permission_prompt_quiet_icon.h",
       "views/permissions/permission_prompt_style.h",
-      "views/plus_addresses/plus_address_creation_dialog_view.cc",
+      "views/plus_addresses/plus_address_creation_controller_desktop.cc",
+      "views/plus_addresses/plus_address_creation_dialog_delegate.cc",
+      "views/plus_addresses/plus_address_creation_dialog_delegate.h",
       "views/profiles/avatar_toolbar_button.cc",
       "views/profiles/avatar_toolbar_button.h",
       "views/profiles/avatar_toolbar_button_delegate.cc",
diff --git a/chrome/browser/ui/android/page_insights/java/src/org/chromium/chrome/browser/page_insights/PageInsightsDataLoader.java b/chrome/browser/ui/android/page_insights/java/src/org/chromium/chrome/browser/page_insights/PageInsightsDataLoader.java
index 63d825e..57d5773 100644
--- a/chrome/browser/ui/android/page_insights/java/src/org/chromium/chrome/browser/page_insights/PageInsightsDataLoader.java
+++ b/chrome/browser/ui/android/page_insights/java/src/org/chromium/chrome/browser/page_insights/PageInsightsDataLoader.java
@@ -28,6 +28,7 @@
     private static final int LRU_CACHE_SIZE = 10;
     private LruCache<GURL, PageInsightsMetadata> mCache =
             new LruCache<GURL, PageInsightsMetadata>(LRU_CACHE_SIZE);
+    private boolean mIsDestroyed;
 
     PageInsightsDataLoader() {}
 
@@ -50,6 +51,7 @@
                                 ? RequestContext.CONTEXT_PAGE_INSIGHTS_HUB
                                 : RequestContext.CONTEXT_NON_PERSONALIZED_PAGE_INSIGHTS_HUB,
                         (gurl, optimizationType, decision, metadata) -> {
+                            if (mIsDestroyed) return;
                             try {
                                 if (decision != OptimizationGuideDecision.TRUE) {
                                     return;
@@ -77,6 +79,10 @@
         mCache = new LruCache<GURL, PageInsightsMetadata>(LRU_CACHE_SIZE);
     }
 
+    void destroy() {
+        mIsDestroyed = true;
+    }
+
     // Lazy initialization of OptimizationGuideBridgeFactory
     private static class OptimizationGuideBridgeFactoryHolder {
         private static final OptimizationGuideBridgeFactory sOptimizationGuideBridgeFactory;
diff --git a/chrome/browser/ui/android/page_insights/java/src/org/chromium/chrome/browser/page_insights/PageInsightsDataLoaderTest.java b/chrome/browser/ui/android/page_insights/java/src/org/chromium/chrome/browser/page_insights/PageInsightsDataLoaderTest.java
index 83b5408..4f2267f 100644
--- a/chrome/browser/ui/android/page_insights/java/src/org/chromium/chrome/browser/page_insights/PageInsightsDataLoaderTest.java
+++ b/chrome/browser/ui/android/page_insights/java/src/org/chromium/chrome/browser/page_insights/PageInsightsDataLoaderTest.java
@@ -6,6 +6,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
@@ -83,6 +84,19 @@
     }
 
     @Test
+    public void testLoadInsightsData_destroyed_callbackNotExecuted() {
+        mPageInsightsDataLoader.clearCacheForTesting();
+
+        mPageInsightsDataLoader.destroy();
+        mPageInsightsDataLoader.loadInsightsData(
+                mUrl,
+                /* shouldAttachGaiaToRequest= */ true,
+                (data) -> {
+                    fail("Callback should not have been called after loader destroyed.");
+                });
+    }
+
+    @Test
     public void testLoadInsightsData_optimizationGuideDecisionFalse_returnsNull() {
         mPageInsightsDataLoader.clearCacheForTesting();
         mockOptimizationGuideResponse(
diff --git a/chrome/browser/ui/android/page_insights/java/src/org/chromium/chrome/browser/page_insights/PageInsightsMediator.java b/chrome/browser/ui/android/page_insights/java/src/org/chromium/chrome/browser/page_insights/PageInsightsMediator.java
index 92d4c42..6c08a76 100644
--- a/chrome/browser/ui/android/page_insights/java/src/org/chromium/chrome/browser/page_insights/PageInsightsMediator.java
+++ b/chrome/browser/ui/android/page_insights/java/src/org/chromium/chrome/browser/page_insights/PageInsightsMediator.java
@@ -615,6 +615,9 @@
     void destroy() {
         resetAutoTriggerTimer();
         mBottomUiController.removeObserver(mBottomUiObserver);
+        if (mPageInsightsDataLoader != null) {
+            mPageInsightsDataLoader.destroy();
+        }
     }
 
     float getCornerRadiusForTesting() {
diff --git a/chrome/browser/ui/plus_addresses/plus_address_creation_controller_desktop.h b/chrome/browser/ui/plus_addresses/plus_address_creation_controller_desktop.h
index 3fe1e05..5cc5a9569 100644
--- a/chrome/browser/ui/plus_addresses/plus_address_creation_controller_desktop.h
+++ b/chrome/browser/ui/plus_addresses/plus_address_creation_controller_desktop.h
@@ -13,6 +13,8 @@
 
 namespace plus_addresses {
 
+class PlusAddressCreationDialogDelegate;
+
 class PlusAddressCreationControllerDesktop
     : public PlusAddressCreationController,
       public content::WebContentsUserData<
@@ -44,13 +46,13 @@
       PlusAddressCreationControllerDesktop>;
 
   // Populates `plus_profile_` with `maybe_plus_profile` if it's not an error.
-  void OnPlusAddressReserved(const std::string& primary_email_address,
-                             const PlusProfileOrError& maybe_plus_profile);
+  void OnPlusAddressReserved(const PlusProfileOrError& maybe_plus_profile);
   // Autofills `plus_address` in the targeted field by running callback_.
   void OnPlusAddressConfirmed(const PlusProfileOrError& maybe_plus_profile);
 
   base::WeakPtr<PlusAddressCreationControllerDesktop> GetWeakPtr();
 
+  std::unique_ptr<PlusAddressCreationDialogDelegate> dialog_delegate_;
   url::Origin relevant_origin_;
   PlusAddressCallback callback_;
   bool ui_modal_showing_ = false;
diff --git a/chrome/browser/ui/plus_addresses/plus_address_creation_dialog_view.h b/chrome/browser/ui/plus_addresses/plus_address_creation_dialog_view.h
deleted file mode 100644
index 08db4013..0000000
--- a/chrome/browser/ui/plus_addresses/plus_address_creation_dialog_view.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_PLUS_ADDRESSES_PLUS_ADDRESS_CREATION_DIALOG_VIEW_H_
-#define CHROME_BROWSER_UI_PLUS_ADDRESSES_PLUS_ADDRESS_CREATION_DIALOG_VIEW_H_
-
-#include "base/memory/weak_ptr.h"
-#include "chrome/browser/ui/plus_addresses/plus_address_creation_controller.h"
-
-namespace content {
-class WebContents;
-}  // namespace content
-
-namespace plus_addresses {
-
-// Shows a modal dialog that, if confirmed, creates and fills a plus address.
-void ShowPlusAddressCreationDialogView(
-    content::WebContents* web_contents,
-    base::WeakPtr<PlusAddressCreationController> controller,
-    const std::string& primary_email_address,
-    const std::string& plus_address);
-
-}  // namespace plus_addresses
-
-#endif  // CHROME_BROWSER_UI_PLUS_ADDRESSES_PLUS_ADDRESS_CREATION_DIALOG_VIEW_H_
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 1e01148..c334aa8 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -2584,19 +2584,28 @@
   GetWidget()->OnSizeConstraintsChanged();
 }
 
-void BrowserView::OnWidgetSizeConstraintsChanged(views::Widget* widget) {
+void BrowserView::SynchronizeRenderWidgetHostVisualPropertiesForMainFrame() {
   content::WebContents* web_contents = GetActiveWebContents();
   if (!web_contents || !web_contents->GetPrimaryMainFrame()) {
     return;
   }
-  // This will update `resizable` @media feature value in renderer whenever the
-  // widget's resizability has changed.
+
   if (content::RenderWidgetHost* render_widget_host =
           web_contents->GetPrimaryMainFrame()->GetRenderWidgetHost()) {
     render_widget_host->SynchronizeVisualProperties();
   }
 }
 
+void BrowserView::OnWidgetSizeConstraintsChanged(views::Widget* widget) {
+  // `resizable` @media feature value in renderer needs to be updated.
+  SynchronizeRenderWidgetHostVisualPropertiesForMainFrame();
+}
+
+void BrowserView::OnWidgetShowStateChanged(views::Widget* widget) {
+  // `display-state` @media feature value in renderer needs to be updated.
+  SynchronizeRenderWidgetHostVisualPropertiesForMainFrame();
+}
+
 void BrowserView::PrimaryPageChanged(content::Page& page) {
   auto can_resize = GetCanResizeFromWebAPI();
   if (cached_can_resize_from_web_api_ == can_resize) {
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index bade01dd..222a1f1 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -719,6 +719,7 @@
                              const gfx::Rect& new_bounds) override;
   void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) override;
   void OnWidgetSizeConstraintsChanged(views::Widget* widget) override;
+  void OnWidgetShowStateChanged(views::Widget* widget) override;
 
   // content::WebContentsObserver:
   void PrimaryPageChanged(content::Page& page) override;
@@ -915,6 +916,8 @@
                          ExclusiveAccessBubbleType bubble_type,
                          int64_t display_id);
 
+  void SynchronizeRenderWidgetHostVisualPropertiesForMainFrame();
+
   // Returns whether immmersive fullscreen should replace fullscreen. This
   // should only occur for "browser-fullscreen" for tabbed-typed windows (not
   // for tab-fullscreen and not for app/popup type windows).
diff --git a/chrome/browser/ui/views/payments/contact_info_editor_view_controller.cc b/chrome/browser/ui/views/payments/contact_info_editor_view_controller.cc
index b485c4a..585c3df 100644
--- a/chrome/browser/ui/views/payments/contact_info_editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/contact_info_editor_view_controller.cc
@@ -100,8 +100,11 @@
     std::move(on_edited_).Run();
     on_added_.Reset();
   } else {
+    // There are no address fields in this form, therefore we create the profile
+    // with an empty country.
     std::unique_ptr<autofill::AutofillProfile> profile =
-        std::make_unique<autofill::AutofillProfile>();
+        std::make_unique<autofill::AutofillProfile>(
+            autofill::i18n_model_definition::kLegacyHierarchyCountryCode);
     PopulateProfile(profile.get());
     if (!is_incognito())
       state()->GetPersonalDataManager()->AddProfile(*profile);
diff --git a/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc
index 05269c4..ef1ee24 100644
--- a/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc
+++ b/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc
@@ -236,7 +236,8 @@
   autofill::PersonalDataManager* personal_data_manager = GetDataManager();
   personal_data_manager->AddObserver(&personal_data_observer_);
 
-  autofill::AutofillProfile incomplete_profile;
+  autofill::AutofillProfile incomplete_profile(
+      autofill::i18n_model_definition::kLegacyHierarchyCountryCode);
   incomplete_profile.SetInfo(autofill::NAME_FULL, kNameFull, GetLocale());
   AddAutofillProfile(incomplete_profile);
 
@@ -296,7 +297,8 @@
   autofill::PersonalDataManager* personal_data_manager = GetDataManager();
   personal_data_manager->AddObserver(&personal_data_observer_);
 
-  autofill::AutofillProfile incomplete_profile;
+  autofill::AutofillProfile incomplete_profile(
+      autofill::i18n_model_definition::kLegacyHierarchyCountryCode);
   incomplete_profile.SetInfo(autofill::NAME_FULL, kNameFull, GetLocale());
   AddAutofillProfile(incomplete_profile);
 
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
index 0fa3ea4a..75aa58c 100644
--- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
@@ -87,8 +87,11 @@
 }
 
 bool ShippingAddressEditorViewController::ValidateModelAndSave() {
-  // To validate the profile first, we use a temporary object.
-  autofill::AutofillProfile profile;
+  // To validate the profile first, we use a temporary object. Note that the
+  // address country gets set first during `SaveFieldsToProfile()`, therefore it
+  // is okay to initially build this profile with an empty country.
+  autofill::AutofillProfile profile(
+      autofill::i18n_model_definition::kLegacyHierarchyCountryCode);
   if (!SaveFieldsToProfile(&profile, /*ignore_errors=*/false))
     return false;
   if (!profile_to_edit_) {
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
index 04ff31d..3b03d5d 100644
--- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
+++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/ui/views/payments/payment_request_dialog_view_ids.h"
 #include "chrome/browser/ui/views/payments/validating_textfield.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
+#include "components/autofill/core/browser/country_type.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "components/autofill/core/browser/geo/autofill_country.h"
 #include "components/autofill/core/browser/geo/test_region_data_loader.h"
@@ -542,11 +543,9 @@
                        SelectingIncompleteAddress) {
   NavigateTo("/payment_request_dynamic_shipping_test.html");
   // Add incomplete address.
-  autofill::AutofillProfile profile;
+  autofill::AutofillProfile profile(
+      AddressCountryCode(base::UTF16ToUTF8(kCountryWithoutStatesCode)));
   profile.SetInfo(autofill::NAME_FULL, kNameFull, kLocale);
-  // Also set non-default country, to make sure proper fields will be used.
-  profile.SetInfo(autofill::ADDRESS_HOME_COUNTRY, kCountryWithoutStates,
-                  kLocale);
   AddAutofillProfile(profile);
 
   InvokePaymentRequestUI();
@@ -649,7 +648,8 @@
                        MAYBE_FocusFirstInvalidField_NotName) {
   NavigateTo("/payment_request_dynamic_shipping_test.html");
   // Add address with only the name set, so that another view takes focus.
-  autofill::AutofillProfile profile;
+  autofill::AutofillProfile profile(
+      autofill::i18n_model_definition::kLegacyHierarchyCountryCode);
   profile.SetInfo(autofill::NAME_FULL, kNameFull, "fr_CA");
   AddAutofillProfile(profile);
 
diff --git a/chrome/browser/ui/plus_addresses/plus_address_creation_controller_desktop.cc b/chrome/browser/ui/views/plus_addresses/plus_address_creation_controller_desktop.cc
similarity index 82%
rename from chrome/browser/ui/plus_addresses/plus_address_creation_controller_desktop.cc
rename to chrome/browser/ui/views/plus_addresses/plus_address_creation_controller_desktop.cc
index e9e5a2c..664c3ebe 100644
--- a/chrome/browser/ui/plus_addresses/plus_address_creation_controller_desktop.cc
+++ b/chrome/browser/ui/views/plus_addresses/plus_address_creation_controller_desktop.cc
@@ -5,7 +5,8 @@
 #include "chrome/browser/ui/plus_addresses/plus_address_creation_controller_desktop.h"
 #include "base/notreached.h"
 #include "chrome/browser/plus_addresses/plus_address_service_factory.h"
-#include "chrome/browser/ui/plus_addresses/plus_address_creation_dialog_view.h"
+#include "chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_delegate.h"
+#include "components/constrained_window/constrained_window_views.h"
 #include "components/plus_addresses/plus_address_metrics.h"
 #include "components/plus_addresses/plus_address_service.h"
 #include "components/plus_addresses/plus_address_types.h"
@@ -27,7 +28,7 @@
 void PlusAddressCreationControllerDesktop::OfferCreation(
     const url::Origin& main_frame_origin,
     PlusAddressCallback callback) {
-  if (ui_modal_showing_) {
+  if (dialog_delegate_) {
     return;
   }
   PlusAddressService* plus_address_service =
@@ -49,18 +50,25 @@
   relevant_origin_ = main_frame_origin;
   callback_ = std::move(callback);
 
+  PlusAddressMetrics::RecordModalEvent(
+      PlusAddressMetrics::PlusAddressModalEvent::kModalShown);
+  if (!suppress_ui_for_testing_) {
+    dialog_delegate_ = std::make_unique<PlusAddressCreationDialogDelegate>(
+        GetWeakPtr(), maybe_email.value());
+    constrained_window::ShowWebModalDialogViews(dialog_delegate_.get(),
+                                                &GetWebContents());
+  }
+
   plus_address_service->ReservePlusAddress(
       relevant_origin_,
       base::BindOnce(
           &PlusAddressCreationControllerDesktop::OnPlusAddressReserved,
-          GetWeakPtr(), maybe_email.value()));
+          GetWeakPtr()));
 }
 
 void PlusAddressCreationControllerDesktop::OnConfirmed() {
-  if (!plus_profile_.has_value()) {
-    // The UI should prevent any attempt to Confirm if Reserve() had failed.
-    NOTREACHED_NORETURN();
-  }
+  // The UI prevents any attempt to Confirm if Reserve() had failed.
+  CHECK(plus_profile_.has_value());
   PlusAddressMetrics::RecordModalEvent(
       PlusAddressMetrics::PlusAddressModalEvent::kModalConfirmed);
 
@@ -85,7 +93,7 @@
       PlusAddressMetrics::PlusAddressModalEvent::kModalCanceled);
 }
 void PlusAddressCreationControllerDesktop::OnDialogDestroyed() {
-  ui_modal_showing_ = false;
+  dialog_delegate_.reset();
   plus_profile_.reset();
 }
 
@@ -105,20 +113,19 @@
 }
 
 void PlusAddressCreationControllerDesktop::OnPlusAddressReserved(
-    const std::string& primary_email_address,
     const PlusProfileOrError& maybe_plus_profile) {
   if (!maybe_plus_profile.has_value()) {
     // TODO: crbug.com/1467623 - Handle error case.
+    if (dialog_delegate_) {
+      dialog_delegate_->OnRequestError();
+    }
     return;
   }
   plus_profile_ = maybe_plus_profile.value();
-  PlusAddressMetrics::RecordModalEvent(
-      PlusAddressMetrics::PlusAddressModalEvent::kModalShown);
-  if (!suppress_ui_for_testing_ && !ui_modal_showing_) {
-    ShowPlusAddressCreationDialogView(&GetWebContents(), GetWeakPtr(),
-                                      primary_email_address,
-                                      maybe_plus_profile->plus_address);
-    ui_modal_showing_ = true;
+  if (!suppress_ui_for_testing_) {
+    if (dialog_delegate_) {
+      dialog_delegate_->OnModalReadyForUse(maybe_plus_profile->plus_address);
+    }
   }
 }
 
diff --git a/chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_browsertest.cc b/chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_browsertest.cc
index 01a24417..dd35b38 100644
--- a/chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_browsertest.cc
+++ b/chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_browsertest.cc
@@ -106,6 +106,7 @@
 IN_PROC_BROWSER_TEST_F(PlusAddressCreationDialogTest, DoubleInit) {
   // First, show the UI normally.
   ShowUi(std::string());
+  VerifyUi();
   base::test::TestFuture<const std::string&> future;
 
   // Then, manually re-trigger the UI, while the modal is still open, passing
@@ -116,8 +117,8 @@
           browser()->tab_strip_model()->GetActiveWebContents());
   controller->OfferCreation(url::Origin::Create(GURL("https://test.example")),
                             future.GetCallback());
-
   controller->OnConfirmed();
+  DismissUi();
   EXPECT_FALSE(future.IsReady());
 }
 
diff --git a/chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_delegate.cc b/chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_delegate.cc
new file mode 100644
index 0000000..f5cea8c07
--- /dev/null
+++ b/chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_delegate.cc
@@ -0,0 +1,194 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_delegate.h"
+
+#include "base/memory/raw_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/ui/plus_addresses/plus_address_creation_controller.h"
+#include "chrome/browser/ui/plus_addresses/plus_address_creation_controller_desktop.h"
+#include "chrome/browser/ui/views/chrome_layout_provider.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/grit/theme_resources.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/color/color_id.h"
+#include "ui/gfx/text_constants.h"
+#include "ui/views/background.h"
+#include "ui/views/controls/image_view.h"
+#include "ui/views/controls/styled_label.h"
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/box_layout_view.h"
+#include "ui/views/layout/layout_provider.h"
+#include "ui/views/style/typography.h"
+#include "ui/views/view_class_properties.h"
+#include "ui/views/widget/widget.h"
+
+namespace plus_addresses {
+
+namespace {
+const float kDescriptionWidthPercent = 0.8;
+const int kPlusAddressLabelTopMargin = 10;
+}  // namespace
+
+PlusAddressCreationDialogDelegate::PlusAddressCreationDialogDelegate(
+    base::WeakPtr<PlusAddressCreationController> controller,
+    const std::string& primary_email_address)
+    : views::BubbleDialogDelegate(/*anchor_view=*/nullptr,
+                                  views::BubbleBorder::Arrow::NONE) {
+  // This delegate is owned & deleted by the PlusAddressCreationController.
+  SetOwnedByWidget(false);
+  RegisterDeleteDelegateCallback(base::BindOnce(
+      [](base::WeakPtr<PlusAddressCreationController> controller) {
+        controller->OnDialogDestroyed();
+      },
+      controller));
+  SetModalType(ui::MODAL_TYPE_CHILD);
+  set_fixed_width(views::LayoutProvider::Get()->GetDistanceMetric(
+      views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH));
+
+  std::unique_ptr<views::View> primary_view =
+      views::Builder<views::BoxLayoutView>()
+          .SetOrientation(views::BoxLayout::Orientation::kVertical)
+          .Build();
+
+  // Create hero image.
+  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
+  primary_view->AddChildView(
+      views::Builder<views::ImageView>()
+          .SetImage(ui::ImageModel::FromImageSkia(
+              // TODO(crbug.com/1467623) - Replace this placeholder image.
+              *bundle.GetImageSkiaNamed(IDR_TAILORED_SECURITY_CONSENTED)))
+          .Build());
+
+  // Add title view.
+  primary_view->AddChildView(
+      views::Builder<views::StyledLabel>()
+          .SetHorizontalAlignment(gfx::ALIGN_CENTER)
+          .SetTextContext(views::style::STYLE_PRIMARY)
+          .SetText(l10n_util::GetStringUTF16(IDS_PLUS_ADDRESS_MODAL_TITLE))
+          .SetTextContext(views::style::CONTEXT_DIALOG_TITLE)
+          .SetDefaultTextStyle(views::style::STYLE_BODY_1_BOLD)
+          .Build());
+
+  views::StyledLabel* description_paragraph = primary_view->AddChildView(
+      views::Builder<views::StyledLabel>()
+          .SetHorizontalAlignment(gfx::ALIGN_CENTER)
+          .SetTextContext(views::style::CONTEXT_DIALOG_BODY_TEXT)
+          .Build());
+
+  // Split the difference on both sides of the description.
+  int horizontal_margin = (1 - kDescriptionWidthPercent) *
+                          ChromeLayoutProvider::Get()->GetDistanceMetric(
+                              views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) /
+                          2;
+  description_paragraph->SetProperty(
+      views::kMarginsKey,
+      gfx::Insets::TLBR(0, horizontal_margin, 0, horizontal_margin));
+
+  // Set the description text & update the styling.
+  std::vector<size_t> description_offsets;
+  // Prepend the settings link text with a newline to render it on one line.
+  std::u16string settings_text =
+      base::StrCat({u"\n", l10n_util::GetStringUTF16(
+                               IDS_PLUS_ADDRESS_MODAL_PLUS_ADDRESS_LINK_TEXT)});
+  description_paragraph->SetText(l10n_util::GetStringFUTF16(
+      IDS_PLUS_ADDRESS_MODAL_PLUS_ADDRESS_DESCRIPTION_START, {settings_text},
+      &description_offsets));
+
+  gfx::Range settings_text_range(
+      description_offsets[0], description_offsets[0] + settings_text.length());
+  views::StyledLabel::RangeStyleInfo settings_text_style;
+  settings_text_style.text_style = views::style::TextStyle::STYLE_LINK;
+  description_paragraph->AddStyleRange(settings_text_range,
+                                       settings_text_style);
+
+  // Add the primary email address separately to avoid width constriction.
+  views::StyledLabel* primary_email_address_view = primary_view->AddChildView(
+      views::Builder<views::StyledLabel>()
+          .SetHorizontalAlignment(gfx::ALIGN_CENTER)
+          .SetTextContext(views::style::CONTEXT_DIALOG_BODY_TEXT)
+          .Build());
+
+  // Set the primary email address  & update the styling.
+  std::vector<size_t> email_address_offsets;
+  std::u16string u16_primary_email_address =
+      base::UTF8ToUTF16(primary_email_address);
+  primary_email_address_view->SetText(l10n_util::GetStringFUTF16(
+      IDS_PLUS_ADDRESS_MODAL_PLUS_ADDRESS_DESCRIPTION_END,
+      {u16_primary_email_address}, &email_address_offsets));
+
+  views::StyledLabel::RangeStyleInfo email_address_style;
+  email_address_style.text_style = views::style::TextStyle::STYLE_EMPHASIZED;
+  primary_email_address_view->AddStyleRange(
+      gfx::Range(email_address_offsets[0],
+                 email_address_offsets[0] + u16_primary_email_address.length()),
+      email_address_style);
+
+  // Create a bubble for the plus address to be displayed in.
+  ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
+  const int kRectangleRadius =
+      provider->GetCornerRadiusMetric(views::ShapeContextTokens::kDialogRadius);
+
+  std::unique_ptr<views::Background> background =
+      views::CreateThemedRoundedRectBackground(
+          // TODO(crbug.com/1467623) - Replace with color from the mocks.
+          ui::kColorSubtleEmphasisBackground, kRectangleRadius);
+  plus_address_label_ = primary_view->AddChildView(
+      views::Builder<views::Label>()
+          .SetText(l10n_util::GetStringUTF16(
+              IDS_PLUS_ADDRESS_MODAL_PROPOSED_PLUS_ADDRESS_PLACEHOLDER))
+          .SetTextContext(views::style::CONTEXT_DIALOG_BODY_TEXT)
+          .SetTextStyle(views::style::STYLE_PRIMARY)
+          .SetBackground(std::move(background))
+          .Build());
+  plus_address_label_->SetProperty(
+      views::kMarginsKey,
+      gfx::Insets::TLBR(kPlusAddressLabelTopMargin, 0, 0, 0));
+  plus_address_label_->SetSelectable(true);
+  plus_address_label_->SetLineHeight(2 * plus_address_label_->GetLineHeight());
+
+  // Initialize buttons.
+  SetDefaultButton(ui::DIALOG_BUTTON_OK);
+  SetButtonLabel(ui::DIALOG_BUTTON_OK,
+                 l10n_util::GetStringUTF16(IDS_PLUS_ADDRESS_MODAL_OK_TEXT));
+  SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
+                 l10n_util::GetStringUTF16(IDS_PLUS_ADDRESS_MODAL_CANCEL_TEXT));
+  SetButtonEnabled(ui::DialogButton::DIALOG_BUTTON_OK, false);
+  SetAcceptCallback(
+      base::BindOnce(&PlusAddressCreationController::OnConfirmed, controller));
+  SetCancelCallback(
+      base::BindOnce(&PlusAddressCreationController::OnCanceled, controller));
+  SetCloseCallback(
+      base::BindOnce(&PlusAddressCreationController::OnCanceled, controller));
+
+  SetContentsView(std::move(primary_view));
+}
+
+PlusAddressCreationDialogDelegate::~PlusAddressCreationDialogDelegate() {
+  plus_address_label_ = nullptr;
+}
+
+bool PlusAddressCreationDialogDelegate::ShouldShowCloseButton() const {
+  return true;
+}
+
+void PlusAddressCreationDialogDelegate::OnModalReadyForUse(
+    const std::string& plus_address) {
+  if (plus_address_label_) {
+    plus_address_label_->SetText(base::UTF8ToUTF16(plus_address));
+  }
+  SetButtonEnabled(ui::DialogButton::DIALOG_BUTTON_OK, true);
+}
+
+void PlusAddressCreationDialogDelegate::OnRequestError() {
+  if (plus_address_label_) {
+    plus_address_label_->SetText(
+        l10n_util::GetStringUTF16(IDS_PLUS_ADDRESS_MODAL_ERROR_MESSAGE));
+  }
+  SetButtonEnabled(ui::DialogButton::DIALOG_BUTTON_OK, false);
+}
+
+}  // namespace plus_addresses
diff --git a/chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_delegate.h b/chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_delegate.h
new file mode 100644
index 0000000..0ad966a
--- /dev/null
+++ b/chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_delegate.h
@@ -0,0 +1,46 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_PLUS_ADDRESSES_PLUS_ADDRESS_CREATION_DIALOG_DELEGATE_H_
+#define CHROME_BROWSER_UI_VIEWS_PLUS_ADDRESSES_PLUS_ADDRESS_CREATION_DIALOG_DELEGATE_H_
+
+#include "base/memory/weak_ptr.h"
+#include "ui/views/bubble/bubble_dialog_delegate_view.h"
+
+namespace views {
+class Label;
+}  // namespace views
+
+namespace plus_addresses {
+
+class PlusAddressCreationController;
+
+//  A delegate that creates and updates the PlusAddresses dialog.
+class PlusAddressCreationDialogDelegate : public views::BubbleDialogDelegate {
+ public:
+  PlusAddressCreationDialogDelegate(
+      base::WeakPtr<PlusAddressCreationController> controller,
+      const std::string& primary_email_address);
+  PlusAddressCreationDialogDelegate(const PlusAddressCreationDialogDelegate&) =
+      delete;
+  PlusAddressCreationDialogDelegate& operator=(
+      const PlusAddressCreationDialogDelegate&) = delete;
+  ~PlusAddressCreationDialogDelegate() override;
+
+  // WidgetDelegate:
+  bool ShouldShowCloseButton() const override;
+
+  // Updates the modal to show `plus_address` and enables the OK button for use.
+  void OnModalReadyForUse(const std::string& plus_address);
+
+  // Displays an error message indicating that something went wrong.
+  void OnRequestError();
+
+ private:
+  raw_ptr<views::Label> plus_address_label_ = nullptr;
+};
+
+}  // namespace plus_addresses
+
+#endif  // CHROME_BROWSER_UI_VIEWS_PLUS_ADDRESSES_PLUS_ADDRESS_CREATION_DIALOG_DELEGATE_H_
diff --git a/chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_view.cc b/chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_view.cc
deleted file mode 100644
index 0bde6cf..0000000
--- a/chrome/browser/ui/views/plus_addresses/plus_address_creation_dialog_view.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/plus_addresses/plus_address_creation_dialog_view.h"
-
-#include "base/functional/callback.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/ui/plus_addresses/plus_address_creation_controller.h"
-#include "chrome/browser/ui/plus_addresses/plus_address_creation_controller_desktop.h"
-#include "chrome/grit/generated_resources.h"
-#include "components/constrained_window/constrained_window_views.h"
-#include "content/public/browser/web_contents.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/models/dialog_model.h"
-#include "ui/views/widget/widget.h"
-
-namespace plus_addresses {
-
-// static
-// TODO(crbug.com/1467623): Flesh out the modal content, etc.
-void ShowPlusAddressCreationDialogView(
-    content::WebContents* web_contents,
-    base::WeakPtr<PlusAddressCreationController> controller,
-    const std::string& primary_email_address,
-    const std::string& plus_address) {
-  CHECK(controller);
-
-  auto dialog_model =
-      ui::DialogModel::Builder(std::make_unique<ui::DialogModelDelegate>())
-          .SetTitle(l10n_util::GetStringUTF16(IDS_PLUS_ADDRESS_MODAL_TITLE))
-          .AddParagraph(ui::DialogModelLabel(
-              ui::DialogModelLabel(l10n_util::GetStringUTF16(
-                  IDS_PLUS_ADDRESS_MODAL_PLUS_ADDRESS_LABEL))))
-          .AddParagraph(ui::DialogModelLabel(
-              ui::DialogModelLabel(l10n_util::GetStringFUTF16(
-                  IDS_PLUS_ADDRESS_MODAL_PROPOSED_PLUS_ADDRESS_AND_COPY,
-                  base::UTF8ToUTF16(plus_address)))))
-          .AddParagraph(ui::DialogModelLabel(
-                            ui::DialogModelLabel(l10n_util::GetStringFUTF16(
-                                IDS_PLUS_ADDRESS_MODAL_REGULAR_ADDRESS_LABEL,
-                                base::UTF8ToUTF16(primary_email_address))))
-                            .set_is_secondary())
-          .AddParagraph(ui::DialogModelLabel(
-              ui::DialogModelLabel(l10n_util::GetStringUTF16(
-                  IDS_PLUS_ADDRESS_MODAL_PLUS_ADDRESS_DESCRIPTION))))
-          .AddOkButton(
-              base::BindOnce(&PlusAddressCreationController::OnConfirmed,
-                             controller),
-              ui::DialogModelButton::Params().SetLabel(
-                  l10n_util::GetStringUTF16(IDS_PLUS_ADDRESS_MODAL_OK_TEXT)))
-          .AddCancelButton(
-              base::BindOnce(&PlusAddressCreationController::OnCanceled,
-                             controller),
-              ui::DialogModelButton::Params().SetLabel(
-                  l10n_util::GetStringUTF16(
-                      IDS_PLUS_ADDRESS_MODAL_CANCEL_TEXT)))
-          .SetDialogDestroyingCallback(base::BindOnce(
-              &PlusAddressCreationController::OnDialogDestroyed, controller))
-          .Build();
-  constrained_window::ShowWebModal(std::move(dialog_model), web_contents);
-}
-
-}  // namespace plus_addresses
diff --git a/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.cc b/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.cc
index c1414bdb..b194fca0 100644
--- a/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.cc
+++ b/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/functional/callback_forward.h"
 #include "base/functional/callback_helpers.h"
@@ -22,6 +23,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/signin/signin_features.h"
+#include "chrome/browser/ui/views/profiles/profile_management_flow_controller.h"
 #include "chrome/browser/ui/views/profiles/profile_management_flow_controller_impl.h"
 #include "chrome/browser/ui/views/profiles/profile_management_step_controller.h"
 #include "chrome/browser/ui/views/profiles/profile_management_types.h"
@@ -478,7 +480,6 @@
     PostHostClearedCallback post_host_cleared_callback,
     bool is_continue_callback) {
   CHECK(post_host_cleared_callback_->is_null());
-
   post_host_cleared_callback_ = std::move(post_host_cleared_callback);
 
   if (is_continue_callback) {
@@ -486,32 +487,7 @@
     return;
   }
 
-  auto step_finished_callback =
-      base::BindOnce(&FirstRunFlowControllerDice::MaybeShowDefaultBrowserStep,
-                     base::Unretained(this));
-
-#if BUILDFLAG(ENABLE_SEARCH_ENGINE_CHOICE)
-    RegisterStep(
-        Step::kSearchEngineChoice,
-        ProfileManagementStepController::CreateForSearchEngineChoice(
-            host(), SearchEngineChoiceServiceFactory::GetForProfile(profile_),
-            std::move(step_finished_callback)));
-    SwitchToStep(Step::kSearchEngineChoice, /*reset_state=*/true);
-#else
-    NOTREACHED();
-#endif
-}
-
-void FirstRunFlowControllerDice::MaybeShowDefaultBrowserStep() {
-  auto step_finished_callback =
-      base::BindOnce(&FirstRunFlowControllerDice::FinishFlowAndRunInBrowser,
-                     // Unretained ok: the step is owned by `this`.
-                     base::Unretained(this), base::Unretained(profile_),
-                     std::move(post_host_cleared_callback_));
-  RegisterStep(Step::kDefaultBrowser,
-               std::make_unique<DefaultBrowserStepController>(
-                   host(), std::move(step_finished_callback)));
-  SwitchToStep(Step::kDefaultBrowser, /*reset_state=*/true);
+  SwitchToPostIdentitySteps();
 }
 
 std::unique_ptr<ProfilePickerDiceSignInProvider>
@@ -533,3 +509,40 @@
                      // the `this` will own and outlive.
                      base::Unretained(this)));
 }
+
+base::queue<ProfileManagementFlowController::Step>
+FirstRunFlowControllerDice::RegisterPostIdentitySteps() {
+  base::queue<ProfileManagementFlowController::Step> post_identity_steps;
+#if BUILDFLAG(ENABLE_SEARCH_ENGINE_CHOICE)
+  auto search_engine_choice_step_completed =
+      base::BindOnce(&FirstRunFlowControllerDice::AdvanceToNextPostIdentityStep,
+                     base::Unretained(this));
+  RegisterStep(
+      Step::kSearchEngineChoice,
+      ProfileManagementStepController::CreateForSearchEngineChoice(
+          host(), SearchEngineChoiceServiceFactory::GetForProfile(profile_),
+          std::move(search_engine_choice_step_completed)));
+  post_identity_steps.emplace(
+      ProfileManagementFlowController::Step::kSearchEngineChoice);
+#endif
+
+  auto default_browser_promo_step_completed =
+      base::BindOnce(&FirstRunFlowControllerDice::AdvanceToNextPostIdentityStep,
+                     base::Unretained(this));
+  RegisterStep(Step::kDefaultBrowser,
+               std::make_unique<DefaultBrowserStepController>(
+                   host(), std::move(default_browser_promo_step_completed)));
+  post_identity_steps.emplace(
+      ProfileManagementFlowController::Step::kDefaultBrowser);
+
+  RegisterStep(
+      Step::kFinishFlow,
+      ProfileManagementStepController::CreateForFinishFlowAndRunInBrowser(
+          host(),
+          base::BindOnce(&FirstRunFlowControllerDice::FinishFlowAndRunInBrowser,
+                         base::Unretained(this), base::Unretained(profile_),
+                         std::move(post_host_cleared_callback_))));
+  post_identity_steps.emplace(
+      ProfileManagementFlowController::Step::kFinishFlow);
+  return post_identity_steps;
+}
diff --git a/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.h b/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.h
index 0236378..8b766716 100644
--- a/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.h
+++ b/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.h
@@ -13,6 +13,7 @@
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/shell_integration.h"
 #include "chrome/browser/ui/profiles/profile_picker.h"
+#include "chrome/browser/ui/views/profiles/profile_management_flow_controller.h"
 #include "chrome/browser/ui/views/profiles/profile_management_flow_controller_impl.h"
 #include "chrome/browser/ui/views/profiles/profile_management_types.h"
 #include "chrome/browser/ui/views/profiles/profile_picker_web_contents_host.h"
@@ -43,17 +44,18 @@
   void CancelPostSignInFlow() override;
 
  protected:
+  // ProfileManagementFlowControllerImpl
   bool PreFinishWithBrowser() override;
-
   std::unique_ptr<ProfilePickerDiceSignInProvider> CreateDiceSignInProvider()
       override;
-
   // `account_info` may not be set as the primary account yet.
   std::unique_ptr<ProfilePickerSignedInFlowController>
   CreateSignedInFlowController(
       Profile* signed_in_profile,
       const CoreAccountInfo& account_info,
       std::unique_ptr<content::WebContents> contents) override;
+  base::queue<ProfileManagementFlowController::Step> RegisterPostIdentitySteps()
+      override;
 
  private:
   void HandleIntroSigninChoice(IntroChoice choice);
@@ -68,8 +70,6 @@
       PostHostClearedCallback post_host_cleared_callback,
       bool is_continue_callback = false);
 
-  void MaybeShowDefaultBrowserStep();
-
   const raw_ptr<Profile> profile_;
   ProfilePicker::FirstRunExitedCallback first_run_exited_callback_;
 
diff --git a/chrome/browser/ui/views/profiles/profile_management_flow_controller.h b/chrome/browser/ui/views/profiles/profile_management_flow_controller.h
index c007cea..136b77c 100644
--- a/chrome/browser/ui/views/profiles/profile_management_flow_controller.h
+++ b/chrome/browser/ui/views/profiles/profile_management_flow_controller.h
@@ -62,6 +62,8 @@
     // Renders the search engine choice screen.
     kSearchEngineChoice,
 #endif
+
+    kFinishFlow,
   };
 
   // Creates a flow controller that will start showing UI when `Init()`-ed.
diff --git a/chrome/browser/ui/views/profiles/profile_management_flow_controller_impl.cc b/chrome/browser/ui/views/profiles/profile_management_flow_controller_impl.cc
index c064ebbe9..50f28ab6 100644
--- a/chrome/browser/ui/views/profiles/profile_management_flow_controller_impl.cc
+++ b/chrome/browser/ui/views/profiles/profile_management_flow_controller_impl.cc
@@ -11,6 +11,8 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/signin_features.h"
 #include "chrome/browser/signin/signin_util.h"
+#include "chrome/browser/ui/autofill/popup_controller_common.h"
+#include "chrome/browser/ui/views/profiles/profile_management_flow_controller.h"
 #include "chrome/browser/ui/views/profiles/profile_management_step_controller.h"
 #include "chrome/browser/ui/views/profiles/profile_management_types.h"
 #include "chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.h"
@@ -26,6 +28,11 @@
     ClearHostClosure clear_host_callback)
     : ProfileManagementFlowController(host, std::move(clear_host_callback)) {}
 
+base::queue<ProfileManagementFlowController::Step>
+ProfileManagementFlowControllerImpl::RegisterPostIdentitySteps() {
+  return {};
+}
+
 ProfileManagementFlowControllerImpl::~ProfileManagementFlowControllerImpl() =
     default;
 
@@ -130,3 +137,18 @@
   UnregisterStep(Step::kAccountSelection);
 }
 #endif
+
+void ProfileManagementFlowControllerImpl::SwitchToPostIdentitySteps() {
+  post_identity_steps_ = RegisterPostIdentitySteps();
+  AdvanceToNextPostIdentityStep();
+}
+
+void ProfileManagementFlowControllerImpl::AdvanceToNextPostIdentityStep() {
+  if (post_identity_steps_.empty()) {
+    return;
+  }
+
+  Step next_step = post_identity_steps_.front();
+  post_identity_steps_.pop();
+  SwitchToStep(next_step, /*reset_state=*/true);
+}
diff --git a/chrome/browser/ui/views/profiles/profile_management_flow_controller_impl.h b/chrome/browser/ui/views/profiles/profile_management_flow_controller_impl.h
index 9ad6b2894..2e97eb6 100644
--- a/chrome/browser/ui/views/profiles/profile_management_flow_controller_impl.h
+++ b/chrome/browser/ui/views/profiles/profile_management_flow_controller_impl.h
@@ -6,7 +6,7 @@
 #define CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_MANAGEMENT_FLOW_CONTROLLER_IMPL_H_
 
 #include <memory>
-
+#include "base/containers/queue.h"
 #include "chrome/browser/ui/views/profiles/profile_management_flow_controller.h"
 #include "chrome/browser/ui/views/profiles/profile_management_types.h"
 
@@ -40,12 +40,25 @@
       std::unique_ptr<content::WebContents> contents,
       StepSwitchFinishedCallback step_switch_finished_callback);
 
+  // Move to the steps that come after the identity step.
+  void SwitchToPostIdentitySteps();
+
   virtual std::unique_ptr<ProfilePickerSignedInFlowController>
   CreateSignedInFlowController(
       Profile* signed_in_profile,
       const CoreAccountInfo& account_info,
       std::unique_ptr<content::WebContents> contents) = 0;
 
+  // Register the steps that will be shown after the identity step. The steps
+  // should be registered and pushed to the queue in the order in which they
+  // should be displayed.
+  virtual base::queue<ProfileManagementFlowController::Step>
+  RegisterPostIdentitySteps();
+
+  // Switches to the step at the front of the `post_identity_steps_` queue if it
+  // is not empty.
+  void AdvanceToNextPostIdentityStep();
+
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
   // Creates, registers and switches to steps to implement the identity flow
   // (signing in then doing the post sign in, which are driven by `Delegate`).
@@ -73,6 +86,13 @@
                              const CoreAccountInfo& account_info,
                              std::unique_ptr<content::WebContents> contents);
 #endif
+
+  // The list of steps that are added to the flow.
+  // It is populated by the return value of `RegisterPostIdentitySteps` that
+  // should be overridden by the derived class.
+  // `post_identity_steps` being empty would mean that we either don't have any
+  // steps in the flow or that the flow is done.
+  base::queue<ProfileManagementFlowController::Step> post_identity_steps_;
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_MANAGEMENT_FLOW_CONTROLLER_IMPL_H_
diff --git a/chrome/browser/ui/views/profiles/profile_management_step_controller.cc b/chrome/browser/ui/views/profiles/profile_management_step_controller.cc
index 1c504b30..8588468 100644
--- a/chrome/browser/ui/views/profiles/profile_management_step_controller.cc
+++ b/chrome/browser/ui/views/profiles/profile_management_step_controller.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/profiles/profile_management_step_controller.h"
 
+#include "base/functional/callback_forward.h"
 #include "base/memory/raw_ptr.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/delete_profile_helper.h"
@@ -252,8 +253,38 @@
   base::WeakPtrFactory<PostSignInStepController> weak_ptr_factory_{this};
 };
 
-#if BUILDFLAG(ENABLE_SEARCH_ENGINE_CHOICE)
+class FinishFlowAndRunInBrowserStepController
+    : public ProfileManagementStepController {
+ public:
+  FinishFlowAndRunInBrowserStepController(
+      ProfilePickerWebContentsHost* host,
+      base::OnceClosure finish_flow_and_run_in_browser_callback)
+      : ProfileManagementStepController(host),
+        finish_flow_and_run_in_browser_callback_(
+            std::move(finish_flow_and_run_in_browser_callback)) {
+    CHECK(finish_flow_and_run_in_browser_callback_);
+  }
 
+  void Show(base::OnceCallback<void(bool success)> step_shown_callback,
+            bool reset_state) override {
+    CHECK(reset_state);
+
+    if (step_shown_callback) {
+      std::move(step_shown_callback).Run(true);
+    }
+    std::move(finish_flow_and_run_in_browser_callback_).Run();
+  }
+
+  void OnNavigateBackRequested() override {
+    // Do nothing, navigating back is not allowed.
+    NOTREACHED_NORETURN();
+  }
+
+ private:
+  base::OnceClosure finish_flow_and_run_in_browser_callback_;
+};
+
+#if BUILDFLAG(ENABLE_SEARCH_ENGINE_CHOICE)
 class SearchEngineChoiceStepController
     : public ProfileManagementStepController {
  public:
@@ -275,6 +306,10 @@
             search_engines::ChoicePromo::kFre);
 
     if (!should_show_search_engine_choice_step) {
+      if (step_shown_callback) {
+        std::move(step_shown_callback).Run(false);
+      }
+
       std::move(step_completed_callback_).Run();
       return;
     }
@@ -323,7 +358,6 @@
   // Callback to be executed when the step is completed.
   base::OnceClosure step_completed_callback_;
 };
-
 #endif  // BUILDFLAG(ENABLE_SEARCH_ENGINE_CHOICE)
 
 }  // namespace
@@ -383,6 +417,15 @@
 }
 #endif
 
+// static
+std::unique_ptr<ProfileManagementStepController>
+ProfileManagementStepController::CreateForFinishFlowAndRunInBrowser(
+    ProfilePickerWebContentsHost* host,
+    base::OnceClosure finish_flow_and_run_in_browser_callback) {
+  return std::make_unique<FinishFlowAndRunInBrowserStepController>(
+      host, std::move(finish_flow_and_run_in_browser_callback));
+}
+
 ProfileManagementStepController::ProfileManagementStepController(
     ProfilePickerWebContentsHost* host)
     : host_(host) {}
diff --git a/chrome/browser/ui/views/profiles/profile_management_step_controller.h b/chrome/browser/ui/views/profiles/profile_management_step_controller.h
index 8e07401d..41f3a49e 100644
--- a/chrome/browser/ui/views/profiles/profile_management_step_controller.h
+++ b/chrome/browser/ui/views/profiles/profile_management_step_controller.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_MANAGEMENT_STEP_CONTROLLER_H_
 
 #include "base/functional/callback.h"
+#include "base/functional/callback_forward.h"
 #include "chrome/browser/ui/views/profiles/profile_management_types.h"
 #include "components/signin/public/base/signin_buildflags.h"
 #include "url/gurl.h"
@@ -71,6 +72,12 @@
       base::OnceClosure callback);
 #endif
 
+  // Creates the step that will finish the flow and launch the browser.
+  static std::unique_ptr<ProfileManagementStepController>
+  CreateForFinishFlowAndRunInBrowser(
+      ProfilePickerWebContentsHost* host,
+      base::OnceClosure finish_flow_and_run_in_browser_callback);
+
   explicit ProfileManagementStepController(ProfilePickerWebContentsHost* host);
   virtual ~ProfileManagementStepController();
 
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index d64af41..26801c0 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -1146,6 +1146,7 @@
     GURL(chrome::kChromeUIDiagnosticsAppURL),
     GURL(chrome::kChromeUIDriveInternalsUrl),
     GURL(chrome::kChromeUIEmojiPickerURL),
+    GURL(chrome::kChromeUIEnterpriseReportingURL),
     GURL(chrome::kChromeUIFirmwareUpdaterAppURL),
     GURL(chrome::kChromeUIHealthdInternalsURL),
     GURL(chrome::kChromeUIHumanPresenceInternalsURL),
diff --git a/chrome/browser/ui/webui/settings/accessibility_main_handler.cc b/chrome/browser/ui/webui/settings/accessibility_main_handler.cc
index 816c10bb..1a66a22 100644
--- a/chrome/browser/ui/webui/settings/accessibility_main_handler.cc
+++ b/chrome/browser/ui/webui/settings/accessibility_main_handler.cc
@@ -19,6 +19,10 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+#include "ui/accessibility/accessibility_features.h"
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+
 namespace settings {
 
 AccessibilityMainHandler::AccessibilityMainHandler() = default;
@@ -44,14 +48,44 @@
           &AccessibilityMainHandler::OnAccessibilityStatusChanged,
           base::Unretained(this)));
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+  if (features::IsPdfOcrEnabled()) {
+    CHECK(!component_ready_observer_.IsObserving());
+    component_ready_observer_.Observe(
+        screen_ai::ScreenAIInstallState::GetInstance());
+  }
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
 }
 
 void AccessibilityMainHandler::OnJavascriptDisallowed() {
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   accessibility_subscription_ = {};
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+  if (features::IsPdfOcrEnabled()) {
+    component_ready_observer_.Reset();
+  }
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
 }
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+void AccessibilityMainHandler::DownloadProgressChanged(double progress) {
+  CHECK_GE(progress, 0.0);
+  CHECK_LE(progress, 1.0);
+  const int progress_num = progress * 100;
+  FireWebUIListener("pdf-ocr-downloading-progress-changed",
+                    base::Value(progress_num));
+}
+
+void AccessibilityMainHandler::StateChanged(
+    screen_ai::ScreenAIInstallState::State state) {
+  base::Value state_value = base::Value(static_cast<int>(state));
+  FireWebUIListener("pdf-ocr-state-changed", state_value);
+}
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+
 void AccessibilityMainHandler::HandleA11yPageReady(
     const base::Value::List& args) {
   AllowJavascript();
diff --git a/chrome/browser/ui/webui/settings/accessibility_main_handler.h b/chrome/browser/ui/webui/settings/accessibility_main_handler.h
index 913d3e70..b2e2a95 100644
--- a/chrome/browser/ui/webui/settings/accessibility_main_handler.h
+++ b/chrome/browser/ui/webui/settings/accessibility_main_handler.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_ACCESSIBILITY_MAIN_HANDLER_H_
 #define CHROME_BROWSER_UI_WEBUI_SETTINGS_ACCESSIBILITY_MAIN_HANDLER_H_
 
+#include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
 
@@ -12,11 +13,22 @@
 #include "chrome/browser/ash/accessibility/accessibility_manager.h"
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+#include "base/scoped_observation.h"
+#include "chrome/browser/screen_ai/screen_ai_install_state.h"
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+
 namespace settings {
 
 // Settings handler for the main accessibility settings page,
 // chrome://settings/accessibility.
-class AccessibilityMainHandler : public ::settings::SettingsPageUIHandler {
+class AccessibilityMainHandler
+    : public ::settings::SettingsPageUIHandler
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+    ,
+      public screen_ai::ScreenAIInstallState::Observer
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+{
  public:
   AccessibilityMainHandler();
   ~AccessibilityMainHandler() override;
@@ -28,6 +40,12 @@
   void OnJavascriptAllowed() override;
   void OnJavascriptDisallowed() override;
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+  // screen_ai::ScreenAIInstallState::Observer:
+  void DownloadProgressChanged(double progress) override;
+  void StateChanged(screen_ai::ScreenAIInstallState::State state) override;
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+
   void HandleA11yPageReady(const base::Value::List& args);
   void HandleCheckAccessibilityImageLabels(const base::Value::List& args);
 
@@ -40,6 +58,12 @@
 
   base::CallbackListSubscription accessibility_subscription_;
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+  base::ScopedObservation<screen_ai::ScreenAIInstallState,
+                          screen_ai::ScreenAIInstallState::Observer>
+      component_ready_observer_{this};
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
 };
 
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/accessibility_main_handler_unittest.cc b/chrome/browser/ui/webui/settings/accessibility_main_handler_unittest.cc
new file mode 100644
index 0000000..6dd47c7
--- /dev/null
+++ b/chrome/browser/ui/webui/settings/accessibility_main_handler_unittest.cc
@@ -0,0 +1,223 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/settings/accessibility_main_handler.h"
+
+#include <memory>
+
+#include "base/memory/raw_ptr.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/screen_ai/screen_ai_install_state.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_task_environment.h"
+#include "content/public/test/test_web_ui.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/accessibility/accessibility_features.h"
+
+namespace settings {
+
+namespace {
+
+const char kA11yPageReadyCallback[] = "a11yPageReady";
+const char kPdfOcrDownloadingProgressChangedEventName[] =
+    "pdf-ocr-downloading-progress-changed";
+const char kPdfOcrStateChangedEventName[] = "pdf-ocr-state-changed";
+const char kWebUIListenerCall[] = "cr.webUIListenerCallback";
+
+class TestScreenAIInstallState : public screen_ai::ScreenAIInstallState {
+ public:
+  TestScreenAIInstallState() = default;
+
+  TestScreenAIInstallState(const TestScreenAIInstallState&) = delete;
+  TestScreenAIInstallState& operator=(const TestScreenAIInstallState&) = delete;
+
+  ~TestScreenAIInstallState() override = default;
+
+  // screen_ai::ScreenAIInstallState:
+  void SetLastUsageTime() override {}
+  void DownloadComponentInternal() override {}
+};
+
+class TestAccessibilityMainHandler : public AccessibilityMainHandler {
+ public:
+  explicit TestAccessibilityMainHandler(
+      TestScreenAIInstallState* screen_ai_install_state)
+      : test_screen_ai_install_state_(screen_ai_install_state) {}
+
+  ~TestAccessibilityMainHandler() override = default;
+
+  // Make public for testing.
+  using AccessibilityMainHandler::AllowJavascript;
+  using AccessibilityMainHandler::set_web_ui;
+
+ private:
+  raw_ptr<TestScreenAIInstallState, ExperimentalAsh>
+      test_screen_ai_install_state_ = nullptr;
+  base::ScopedObservation<screen_ai::ScreenAIInstallState,
+                          screen_ai::ScreenAIInstallState::Observer>
+      component_ready_observer_{this};
+};
+
+}  // namespace
+
+class AccessibilityMainHandlerTest : public testing::Test {
+ public:
+  AccessibilityMainHandlerTest() : features_({features::kPdfOcr}) {}
+
+  AccessibilityMainHandlerTest(const AccessibilityMainHandlerTest&) = delete;
+  AccessibilityMainHandlerTest& operator=(const AccessibilityMainHandlerTest&) =
+      delete;
+
+  ~AccessibilityMainHandlerTest() override = default;
+
+  // testing::Test:
+  void SetUp() override {
+    TestingProfile::Builder builder;
+    profile_ = builder.Build();
+    web_contents_ = content::WebContents::Create(
+        content::WebContents::CreateParams(profile_.get()));
+
+    test_web_ui_ = std::make_unique<content::TestWebUI>();
+    test_web_ui_->set_web_contents(web_contents_.get());
+
+    test_screen_ai_install_state_ =
+        std::make_unique<TestScreenAIInstallState>();
+
+    handler_ = std::make_unique<TestAccessibilityMainHandler>(
+        test_screen_ai_install_state_.get());
+    handler_->set_web_ui(test_web_ui_.get());
+    handler_->RegisterMessages();
+    handler_->AllowJavascript();
+    ASSERT_TRUE(handler_->IsJavascriptAllowed());
+
+    base::Value::List empty_args;
+    test_web_ui()->HandleReceivedMessage(kA11yPageReadyCallback, empty_args);
+
+    // Run until idle so the handler picks up initial screen ai install state,
+    // which is screen_ai::ScreenAIInstallState::State::kNotDownloaded.
+    browser_task_environment_.RunUntilIdle();
+  }
+
+  void TearDown() override { handler_.reset(); }
+
+  void ExpectCallToWebUI(const std::string& type,
+                         const std::string& func_name,
+                         const int expected_arg,
+                         size_t call_count) {
+    EXPECT_EQ(test_web_ui()->call_data().size(), call_count);
+    // Get the last call data based on the given call_count value.
+    const content::TestWebUI::CallData& call_data =
+        *test_web_ui()->call_data()[call_count - 1];
+    EXPECT_EQ(call_data.function_name(), type);
+    EXPECT_EQ(call_data.arg1()->GetString(), func_name);
+    EXPECT_EQ(call_data.arg2()->GetInt(), expected_arg);
+  }
+
+  void SimulateSetDownloadProgress(double progress) {
+    test_screen_ai_install_state_->SetDownloadProgress(progress);
+  }
+
+  void SimulateSetState(screen_ai::ScreenAIInstallState::State state) {
+    test_screen_ai_install_state_->SetState(state);
+  }
+
+  content::TestWebUI* test_web_ui() const { return test_web_ui_.get(); }
+  TestAccessibilityMainHandler* handler() const { return handler_.get(); }
+
+ protected:
+  base::test::ScopedFeatureList features_;
+  content::BrowserTaskEnvironment browser_task_environment_;
+
+  std::unique_ptr<TestAccessibilityMainHandler> handler_;
+  std::unique_ptr<TestingProfile> profile_;
+  std::unique_ptr<TestScreenAIInstallState> test_screen_ai_install_state_;
+  std::unique_ptr<content::TestWebUI> test_web_ui_;
+  std::unique_ptr<content::WebContents> web_contents_;
+};
+
+TEST_F(AccessibilityMainHandlerTest, MessageForScreenAIDownloadingState) {
+  size_t call_data_count_before_call = test_web_ui()->call_data().size();
+
+  screen_ai::ScreenAIInstallState::State state =
+      screen_ai::ScreenAIInstallState::State::kDownloading;
+  SimulateSetState(state);
+  ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName,
+                    /*expected_arg=*/static_cast<int>(state),
+                    /*call_count=*/call_data_count_before_call + 1u);
+}
+
+TEST_F(AccessibilityMainHandlerTest, MessageForScreenAIDownloadingProgress) {
+  // State needs to be `kDownloading` before updating the download progress.
+  size_t call_data_count_before_call = test_web_ui()->call_data().size();
+
+  screen_ai::ScreenAIInstallState::State state =
+      screen_ai::ScreenAIInstallState::State::kDownloading;
+  SimulateSetState(state);
+  ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName,
+                    /*expected_arg=*/static_cast<int>(state),
+                    /*call_count=*/++call_data_count_before_call);
+
+  const double progress = 0.3;
+  SimulateSetDownloadProgress(progress);
+  // `progress` is expected to be converted into percentage in a message.
+  const int expected_progress_in_percentage = progress * 100;
+  ExpectCallToWebUI(kWebUIListenerCall,
+                    kPdfOcrDownloadingProgressChangedEventName,
+                    /*expected_arg=*/expected_progress_in_percentage,
+                    /*call_count=*/call_data_count_before_call + 1u);
+}
+
+TEST_F(AccessibilityMainHandlerTest, MessageForScreenAIDownloadedState) {
+  size_t call_data_count_before_call = test_web_ui()->call_data().size();
+
+  screen_ai::ScreenAIInstallState::State state =
+      screen_ai::ScreenAIInstallState::State::kDownloaded;
+  SimulateSetState(state);
+  ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName,
+                    /*expected_arg=*/static_cast<int>(state),
+                    /*call_count=*/call_data_count_before_call + 1u);
+}
+
+TEST_F(AccessibilityMainHandlerTest, MessageForScreenAIDownloadFailedState) {
+  size_t call_data_count_before_call = test_web_ui()->call_data().size();
+
+  screen_ai::ScreenAIInstallState::State state =
+      screen_ai::ScreenAIInstallState::State::kFailed;
+  SimulateSetState(state);
+  ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName,
+                    /*expected_arg=*/static_cast<int>(state),
+                    /*call_count=*/call_data_count_before_call + 1u);
+}
+
+TEST_F(AccessibilityMainHandlerTest, MessageForScreenAIReadyState) {
+  size_t call_data_count_before_call = test_web_ui()->call_data().size();
+
+  screen_ai::ScreenAIInstallState::State state =
+      screen_ai::ScreenAIInstallState::State::kReady;
+  SimulateSetState(state);
+  ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName,
+                    /*expected_arg=*/static_cast<int>(state),
+                    /*call_count=*/call_data_count_before_call + 1u);
+}
+
+TEST_F(AccessibilityMainHandlerTest, MessageForScreenAINotDownloadedState) {
+  size_t call_data_count_before_call = test_web_ui()->call_data().size();
+
+  // Either `kReady` or `kFailed` needs to be set for testing `kNotDownloaded`.
+  screen_ai::ScreenAIInstallState::State state =
+      screen_ai::ScreenAIInstallState::State::kReady;
+  SimulateSetState(state);
+  ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName,
+                    /*expected_arg=*/static_cast<int>(state),
+                    /*call_count=*/++call_data_count_before_call);
+
+  state = screen_ai::ScreenAIInstallState::State::kNotDownloaded;
+  SimulateSetState(state);
+  ExpectCallToWebUI(kWebUIListenerCall, kPdfOcrStateChangedEventName,
+                    /*expected_arg=*/static_cast<int>(state),
+                    /*call_count=*/call_data_count_before_call + 1u);
+}
+
+}  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index 47a6b922..9cdf226 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -280,8 +280,6 @@
     {"accessibleImageLabelsTitle", IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_TITLE},
     {"accessibleImageLabelsSubtitle",
      IDS_SETTINGS_ACCESSIBLE_IMAGE_LABELS_SUBTITLE},
-    {"pdfOcrTitle", IDS_SETTINGS_PDF_OCR_TITLE},
-    {"pdfOcrSubtitle", IDS_SETTINGS_PDF_OCR_SUBTITLE},
     {"settingsSliderRoleDescription",
      IDS_SETTINGS_SLIDER_MIN_MAX_ARIA_ROLE_DESCRIPTION},
     {"caretBrowsingTitle", IDS_SETTINGS_ENABLE_CARET_BROWSING_TITLE},
@@ -298,7 +296,13 @@
      IDS_SETTINGS_OVERSCROLL_HISTORY_NAVIGATION_TITLE},
     {"overscrollHistoryNavigationSubtitle",
      IDS_SETTINGS_OVERSCROLL_HISTORY_NAVIGATION_SUBTITLE},
-#endif
+    {"pdfOcrDownloadCompleteLabel", IDS_SETTINGS_PDF_OCR_DOWNLOAD_COMPLETE},
+    {"pdfOcrDownloadErrorLabel", IDS_SETTINGS_PDF_OCR_DOWNLOAD_ERROR},
+    {"pdfOcrDownloadProgressLabel", IDS_SETTINGS_PDF_OCR_DOWNLOAD_PROGRESS},
+    {"pdfOcrDownloadingLabel", IDS_SETTINGS_PDF_OCR_DOWNLOADING},
+    {"pdfOcrTitle", IDS_SETTINGS_PDF_OCR_TITLE},
+    {"pdfOcrSubtitle", IDS_SETTINGS_PDF_OCR_SUBTITLE},
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
   };
   html_source->AddLocalizedStrings(kLocalizedStrings);
 
diff --git a/chrome/browser/upgrade_detector/upgrade_detector_impl.cc b/chrome/browser/upgrade_detector/upgrade_detector_impl.cc
index 75f3e51..5646aa3f 100644
--- a/chrome/browser/upgrade_detector/upgrade_detector_impl.cc
+++ b/chrome/browser/upgrade_detector/upgrade_detector_impl.cc
@@ -28,6 +28,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/buildflags.h"
 #include "chrome/browser/google/google_brand.h"
+#include "chrome/browser/obsolete_system/obsolete_system.h"
 #include "chrome/browser/upgrade_detector/build_state.h"
 #include "chrome/browser/upgrade_detector/get_installed_version.h"
 #include "chrome/common/chrome_switches.h"
@@ -203,6 +204,13 @@
   if (!base::FeatureList::IsEnabled(kOutdatedBuildDetector))
     return;
 
+  // Don't detect outdated builds for obsolete operating systems when new builds
+  // are no longer available.
+  if (ObsoleteSystem::IsObsoleteNowOrSoon() &&
+      ObsoleteSystem::IsEndOfTheLine()) {
+    return;
+  }
+
   // Don't show the bubble if we have a brand code that is NOT organic, unless
   // an outdated build is being simulated by command line switches.
   if (!simulating_outdated_) {
diff --git a/chrome/build/lacros64.pgo.txt b/chrome/build/lacros64.pgo.txt
index 8bb09c1..3677f4c2 100644
--- a/chrome/build/lacros64.pgo.txt
+++ b/chrome/build/lacros64.pgo.txt
@@ -1 +1 @@
-chrome-chromeos-amd64-generic-main-1699530963-25ecc58188cf446da90bff6314bc1b74e3eedd19.profdata
+chrome-chromeos-amd64-generic-main-1699617335-126d3a1e2d62791769c7ceea31424541468bd818.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index ad97e25..825a17d 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1699595874-50828f87e8b822c4a8f5bae6680990f71e47efca.profdata
+chrome-linux-main-1699617335-4c8cb818a0e64cf3f6be28ae9818a5ef4c753a2e.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 3d96815..5c6c924 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1699606438-933476800caa5b555b93c109913fa8901b99c7fa.profdata
+chrome-win32-main-1699617335-0fa79041b68c431efe0fefe14e2df1e3ad1ec4d2.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index c88b0a6..9c7885a 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1699606438-c37c23cd7bced425aa0c0f96745fb77b4e9d51cd.profdata
+chrome-win64-main-1699617335-5f24a637de8699773c3e15281857d225782b9b45.profdata
diff --git a/chrome/common/extensions/api/cookies.json b/chrome/common/extensions/api/cookies.json
index 8cee368..dc8388e 100644
--- a/chrome/common/extensions/api/cookies.json
+++ b/chrome/common/extensions/api/cookies.json
@@ -90,7 +90,7 @@
       {
         "name": "getAll",
         "type": "function",
-        "description": "Retrieves all cookies from a single cookie store that match the given information.  The cookies returned will be sorted, with those with the longest path first.  If multiple cookies have the same path length, those with the earliest creation time will be first.",
+        "description": "Retrieves all cookies from a single cookie store that match the given information.  The cookies returned will be sorted, with those with the longest path first.  If multiple cookies have the same path length, those with the earliest creation time will be first. Only retrieves cookies for domains which the extension has host permissions to",
         "parameters": [
           {
             "type": "object",
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index e368062..6525a2e5 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -7985,6 +7985,12 @@
           [ "../browser/webauthn/local_credential_management_win_unittest.cc" ]
     }
 
+    if (is_linux || is_mac || is_win) {
+      sources += [
+        "../browser/ui/webui/settings/accessibility_main_handler_unittest.cc",
+      ]
+    }
+
     sources += [
       # Badging isn't supported on Android.
       "../browser/badging/badge_manager_unittest.cc",
@@ -10099,7 +10105,7 @@
     ]
   }
 
-  if (is_win || is_mac || is_linux || is_chromeos) {
+  if (enterprise_data_controls) {
     deps += [ "../browser/enterprise/data_controls:unit_tests" ]
   }
 
diff --git a/chrome/test/chromedriver/js/get_element_region_test.html b/chrome/test/chromedriver/js/get_element_region_test.html
index 13c94f2..cd08c84 100644
--- a/chrome/test/chromedriver/js/get_element_region_test.html
+++ b/chrome/test/chromedriver/js/get_element_region_test.html
@@ -14,7 +14,7 @@
 }
 
 function testElementWithFirstClientRect() {
-  var region = getElementRegion(document.getElementById('a'));
+  const region = getElementRegion(document.getElementById('a'));
   assertEquals(0, region.left);
   assertEquals(0, region.top);
   assertEquals(100, region.width);
@@ -22,15 +22,29 @@
 }
 
 function testSvgElement() {
-  var region = getElementRegion(document.getElementById('e'));
+  const ellipse = document.getElementById('e');
+  const region = getElementRegion(ellipse);
   assertEquals(0, region.left);
   assertEquals(0, region.top);
-  assertEquals(90, region.width);
-  assertEquals(40, region.height);
+
+  const boundingRect = ellipse.getBoundingClientRect();
+  const visualViewport = window.visualViewport;
+
+  assert(0 <= region.width);
+  assert(region.width <= 90);
+  if (region.width > 0 && region.width < 90) {
+    assertEquals(boundingRect.left + region.width, visualViewport.width);
+  }
+
+  assert(0 <= region.height);
+  assert(region.height <= 40);
+  if (region.height > 0 && region.height < 40) {
+    assertEquals(boundingRect.top + region.height, visualViewport.height);
+  }
 }
 
 function testAreaPoly() {
-  var region = getElementRegion(document.getElementById('poly'));
+  const region = getElementRegion(document.getElementById('poly'));
   assertEquals(20, region.left);
   assertEquals(10, region.top);
   assertEquals(40, region.width);
@@ -38,7 +52,7 @@
 }
 
 function testAreaRect() {
-  var region = getElementRegion(document.getElementById('rect'));
+  const region = getElementRegion(document.getElementById('rect'));
   assertEquals(120, region.left);
   assertEquals(100, region.top);
   assertEquals(20, region.width);
@@ -46,7 +60,7 @@
 }
 
 function testAreaCircle() {
-  var region = getElementRegion(document.getElementById('circle'));
+  const region = getElementRegion(document.getElementById('circle'));
   assertEquals(175, region.left);
   assertEquals(165, region.top);
   assertEquals(10, region.width);
@@ -54,18 +68,32 @@
 }
 
 function testPartialOutOfView() {
-  var region = getElementRegion(document.getElementById('partial-out-of-view'));
+  let element = document.getElementById('partial-out-of-view');
+  let region = getElementRegion(element);
   assertEquals(50, region.left);
   assertEquals(0, region.top);
-  assertEquals(50, region.width);
-  assertEquals(100, region.height);
+
+  const boundingRect = element.getBoundingClientRect();
+  const visualViewport = window.visualViewport;
+
+  assert(0 <= region.width);
+  assert(region.width <= 50);
+  if (region.width > 0 && region.width < 50) {
+    assertEquals(boundingRect.left + region.width, visualViewport.width);
+  }
+
+  assert(0 <= region.height);
+  assert(region.height <= 100);
+  if (region.height > 0 && region.height < 100) {
+    assertEquals(boundingRect.top + region.height, visualViewport.height);
+  }
 }
 
 function testScrolledOutOfView() {
   // Scroll to an offset to make element with id=a partially visible.
-  var elemRect = document.getElementById("a").getBoundingClientRect();
+  const elemRect = document.getElementById("a").getBoundingClientRect();
   window.scrollTo(elemRect.left + 50, elemRect.top + 100);
-  var region = getElementRegion(document.getElementById("a"));
+  const region = getElementRegion(document.getElementById("a"));
   assertEquals(50, region.left);
   assertEquals(100, region.top);
   assertEquals(50, region.width);
@@ -77,12 +105,12 @@
   // Scroll to an offset to make element with id=a partially visible.
   document.body.style.paddingTop = '0.25px';
   document.body.style.paddingLeft = '0.25px';
-  var elem = document.getElementById("check");
+  const elem = document.getElementById("check");
   window.scrollTo(
     elem.offsetLeft + elem.offsetWidth,
     elem.offsetTop + elem.offsetHeight,
   );
-  var region = getElementRegion(elem);
+  const region = getElementRegion(elem);
   assertEquals(0, region.left);
   assertEquals(0, region.top);
   assertEquals(elem.offsetWidth, region.width);
@@ -93,7 +121,7 @@
 }
 
 function testFullOutOfView() {
-  var region = getElementRegion(document.getElementById('out-of-view'));
+  const region = getElementRegion(document.getElementById('out-of-view'));
   assertEquals(0, region.left);
   assertEquals(0, region.top);
   assertEquals(100, region.width);
@@ -101,7 +129,7 @@
 }
 
 function testFullOutOfViewRect() {
-  var region = getElementRegion(document.getElementById('out-of-view-rect'));
+  const region = getElementRegion(document.getElementById('out-of-view-rect'));
   assertEquals(120, region.left);
   assertEquals(100, region.top);
   assertEquals(20, region.width);
@@ -109,7 +137,7 @@
 }
 
 function testFullOutOfViewCircle() {
-  var region = getElementRegion(document.getElementById('out-of-view-circle'));
+  const region = getElementRegion(document.getElementById('out-of-view-circle'));
   assertEquals(175, region.left);
   assertEquals(165, region.top);
   assertEquals(10, region.width);
@@ -117,7 +145,7 @@
 }
 
 function testPartialOutOfViewRect() {
-  var region = getElementRegion(document.getElementById('partial-rect'));
+  const region = getElementRegion(document.getElementById('partial-rect'));
   assertEquals(120, region.left);
   assertEquals(10, region.top);
   assertEquals(10, region.width);
@@ -126,7 +154,7 @@
 }
 
 function testPartialOutOfViewCircle() {
-  var region = getElementRegion(document.getElementById('partial-circle'));
+  const region = getElementRegion(document.getElementById('partial-circle'));
   assertEquals(30, region.left);
   assertEquals(0, region.top);
   // Area is treated as if it is fully in-view or fully out-of-view.
@@ -135,7 +163,7 @@
 }
 
 function testNegativeDimensions() {
-  var region = getElementRegion(document.getElementById('negative-dims'));
+  const region = getElementRegion(document.getElementById('negative-dims'));
   assertEquals(0, region.left);
   assertEquals(0, region.top);
   // Negative dimensions appear as 0, so region is 0x0.
diff --git a/chrome/test/data/webui/settings/BUILD.gn b/chrome/test/data/webui/settings/BUILD.gn
index 978701d0..d4cb4cba 100644
--- a/chrome/test/data/webui/settings/BUILD.gn
+++ b/chrome/test/data/webui/settings/BUILD.gn
@@ -168,6 +168,7 @@
 
   if (!is_chromeos) {
     files += [
+      "a11y_page_test.ts",
       "live_caption_section_test.ts",
       "live_translate_section_test.ts",
       "test_captions_browser_proxy.ts",
diff --git a/chrome/test/data/webui/settings/a11y_page_test.ts b/chrome/test/data/webui/settings/a11y_page_test.ts
new file mode 100644
index 0000000..b96fe90f
--- /dev/null
+++ b/chrome/test/data/webui/settings/a11y_page_test.ts
@@ -0,0 +1,117 @@
+// 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.
+
+import 'chrome://settings/lazy_load.js';
+
+// <if expr="is_win or is_linux or is_macosx">
+import {webUIListenerCallback} from 'chrome://resources/js/cr.js';
+// </if>
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {AccessibilityBrowserProxy, AccessibilityBrowserProxyImpl, SettingsA11yPageElement} from 'chrome://settings/lazy_load.js';
+import {CrSettingsPrefs, loadTimeData, SettingsPrefsElement} from 'chrome://settings/settings.js';
+// <if expr="is_win or is_linux or is_macosx">
+import {SettingsToggleButtonElement} from 'chrome://settings/settings.js';
+import {assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
+// </if>
+import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
+// <if expr="is_win or is_linux or is_macosx">
+import {isVisible} from 'chrome://webui-test/test_util.js';
+// </if>
+
+class TestAccessibilityBrowserProxy extends TestBrowserProxy implements
+    AccessibilityBrowserProxy {
+  constructor() {
+    super([
+      'openTrackpadGesturesSettings',
+      'recordOverscrollHistoryNavigationChanged',
+    ]);
+  }
+
+  openTrackpadGesturesSettings() {
+    this.methodCalled('openTrackpadGesturesSettings');
+  }
+
+  recordOverscrollHistoryNavigationChanged(enabled: boolean) {
+    this.methodCalled('recordOverscrollHistoryNavigationChanged', enabled);
+  }
+}
+
+suite('A11yPage', () => {
+  let a11yPage: SettingsA11yPageElement;
+  let settingsPrefs: SettingsPrefsElement;
+  let browserProxy: TestAccessibilityBrowserProxy;
+
+  suiteSetup(function() {
+    loadTimeData.overrideValues({
+      pdfOcrEnabled: true,
+    });
+  });
+
+  setup(async function() {
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    a11yPage = document.createElement('settings-a11y-page');
+    settingsPrefs = document.createElement('settings-prefs');
+    document.body.appendChild(settingsPrefs);
+    await CrSettingsPrefs.initialized;
+
+    a11yPage.prefs = settingsPrefs.prefs;
+    document.body.appendChild(a11yPage);
+
+    // Set up test browser proxy.
+    browserProxy = new TestAccessibilityBrowserProxy();
+    AccessibilityBrowserProxyImpl.setInstance(browserProxy);
+
+    flush();
+  });
+
+  // <if expr="is_win or is_linux or is_macosx">
+  test('check pdf ocr toggle visibility', async () => {
+    assertTrue(loadTimeData.getBoolean('pdfOcrEnabled'));
+
+    // Disable a screen reader to hide the PDF OCR toggle.
+    webUIListenerCallback('screen-reader-state-changed', false);
+
+    const pdfOcrToggle =
+        a11yPage.shadowRoot!.querySelector<SettingsToggleButtonElement>(
+            '#pdfOcrToggle');
+    assertTrue(!!pdfOcrToggle);
+    await flushTasks();
+    assertFalse(isVisible(pdfOcrToggle));
+
+    // Enable screen reader to show the PDF OCR toggle.
+    webUIListenerCallback('screen-reader-state-changed', true);
+
+    await flushTasks();
+    assertTrue(isVisible(pdfOcrToggle));
+  });
+
+  test('test pdf ocr toggle and pref', async () => {
+    assertTrue(loadTimeData.getBoolean('pdfOcrEnabled'));
+    // Enable screen reader to show the PDF OCR toggle.
+    webUIListenerCallback('screen-reader-state-changed', true);
+
+    const pdfOcrToggle =
+        a11yPage.shadowRoot!.querySelector<SettingsToggleButtonElement>(
+            '#pdfOcrToggle');
+    assertTrue(!!pdfOcrToggle);
+    await flushTasks();
+
+    // The PDF OCR pref is on by default, so the button should be toggled on.
+    assertTrue(
+        a11yPage.getPref('settings.a11y.pdf_ocr_always_active').value,
+        'pdf ocr pref should be on by default');
+    assertTrue(pdfOcrToggle.checked);
+
+    pdfOcrToggle.click();
+    flush();
+    assertFalse(
+        a11yPage.getPref('settings.a11y.pdf_ocr_always_active').value,
+        'pdf ocr pref should be off');
+    assertFalse(pdfOcrToggle.checked);
+  });
+  // </if>
+
+  // TODO(crbug.com/1499996): Add more test cases to improve code coverage.
+});
diff --git a/chrome/test/data/webui/settings/settings_browsertest.cc b/chrome/test/data/webui/settings/settings_browsertest.cc
index 5e8f9cf2..08271be 100644
--- a/chrome/test/data/webui/settings/settings_browsertest.cc
+++ b/chrome/test/data/webui/settings/settings_browsertest.cc
@@ -26,6 +26,12 @@
 
 // Note: Keep tests below in alphabetical ordering.
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+IN_PROC_BROWSER_TEST_F(SettingsTest, A11yPage) {
+  RunTest("settings/a11y_page_test.js", "mocha.run()");
+}
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
+
 // Copied from Polymer 2 test:
 // Times out on debug builders because the Settings page can take several
 // seconds to load in a Release build and several times that in a Debug build.
diff --git a/chrome/updater/mac/signing/pipeline.py b/chrome/updater/mac/signing/pipeline.py
index 54c841b..20fbf75 100644
--- a/chrome/updater/mac/signing/pipeline.py
+++ b/chrome/updater/mac/signing/pipeline.py
@@ -111,6 +111,8 @@
         os.path.join(paths.input, config.packaging_dir, 'signing'),
         '--sign',
         config.installer_identity,
+        '--keychain',
+        os.environ["INSTALLER_KEYCHAIN"],
         '--timestamp',
         pkg_path,
     ])
diff --git a/chrome/updater/test/integration_tests.cc b/chrome/updater/test/integration_tests.cc
index e2017260..b93bb15 100644
--- a/chrome/updater/test/integration_tests.cc
+++ b/chrome/updater/test/integration_tests.cc
@@ -2521,6 +2521,30 @@
             base::StrCat({"{\"appid\":\"", IntegrationTestMsi::kMsiAppId,
                           "\",\"status\":\"error-unknownApplication\"}"}),
         },
+
+        // Interactive install via the command line,
+        // `update_client::ProtocolError::OS_NOT_SUPPORTED` error.
+        {
+            true,
+            "INSTALLER_RESULT=0",
+            static_cast<int>(update_client::ProtocolError::OS_NOT_SUPPORTED),
+            base::WideToUTF8(GetLocalizedString(IDS_OS_NOT_SUPPORTED_BASE)),
+            {},
+            base::StrCat({"{\"appid\":\"", IntegrationTestMsi::kMsiAppId,
+                          "\",\"status\":\"error-osnotsupported\"}"}),
+        },
+
+        // Interactive install via the command line,
+        // `update_client::ProtocolError::HW_NOT_SUPPORTED` error.
+        {
+            true,
+            "INSTALLER_RESULT=0",
+            static_cast<int>(update_client::ProtocolError::HW_NOT_SUPPORTED),
+            base::WideToUTF8(GetLocalizedString(IDS_HW_NOT_SUPPORTED_BASE)),
+            {},
+            base::StrCat({"{\"appid\":\"", IntegrationTestMsi::kMsiAppId,
+                          "\",\"status\":\"error-hwnotsupported\"}"}),
+        },
     }));
 
 TEST_P(IntegrationInstallerResultsTest, TestCases) {
diff --git a/chrome/updater/update_service_impl.cc b/chrome/updater/update_service_impl.cc
index ccda2dc..7a2b9e18 100644
--- a/chrome/updater/update_service_impl.cc
+++ b/chrome/updater/update_service_impl.cc
@@ -356,6 +356,12 @@
     case static_cast<int>(update_client::ProtocolError::RESTRICTED_APPLICATION):
       return GetLocalizedString(IDS_RESTRICTED_RESPONSE_FROM_SERVER_BASE);
 
+    case static_cast<int>(update_client::ProtocolError::OS_NOT_SUPPORTED):
+      return GetLocalizedString(IDS_OS_NOT_SUPPORTED_BASE);
+
+    case static_cast<int>(update_client::ProtocolError::HW_NOT_SUPPORTED):
+      return GetLocalizedString(IDS_HW_NOT_SUPPORTED_BASE);
+
     // Http Status Code `401` Unauthorized.
     case 401:
       return GetLocalizedString(IDS_ERROR_HTTPSTATUS_UNAUTHORIZED_BASE);
diff --git a/chrome/updater/win/ui/resources/create_metainstaller_string_rc.py b/chrome/updater/win/ui/resources/create_metainstaller_string_rc.py
index aeac75a..6158fb7 100755
--- a/chrome/updater/win/ui/resources/create_metainstaller_string_rc.py
+++ b/chrome/updater/win/ui/resources/create_metainstaller_string_rc.py
@@ -40,6 +40,8 @@
     'IDS_ERROR_HTTPSTATUS_PROXY_AUTH_REQUIRED',
     'IDS_UNKNOWN_APPLICATION',
     'IDS_RESTRICTED_RESPONSE_FROM_SERVER',
+    'IDS_OS_NOT_SUPPORTED',
+    'IDS_HW_NOT_SUPPORTED',
     'IDS_GENERIC_UPDATE_CHECK_ERROR',
     'IDS_DOWNLOAD_HASH_MISMATCH',
     'IDS_GENERIC_DOWNLOAD_ERROR',
diff --git a/chromeos/ash/components/audio/audio_device.cc b/chromeos/ash/components/audio/audio_device.cc
index 8b8ec4ae..c555e2e 100644
--- a/chromeos/ash/components/audio/audio_device.cc
+++ b/chromeos/ash/components/audio/audio_device.cc
@@ -182,6 +182,8 @@
   base::StringAppendF(&result, "display_name = %s ", display_name.c_str());
   base::StringAppendF(&result, "device_name = %s ", device_name.c_str());
   base::StringAppendF(&result, "type = %s ", GetTypeString(type).c_str());
+  base::StringAppendF(&result, "priority = %d ", priority);
+  base::StringAppendF(&result, "user_priority = %d ", user_priority);
   base::StringAppendF(&result, "active = %s ", active ? "true" : "false");
   base::StringAppendF(&result, "plugged_time = %s ",
                       base::NumberToString(plugged_time).c_str());
diff --git a/chromeos/ash/components/audio/cras_audio_handler.cc b/chromeos/ash/components/audio/cras_audio_handler.cc
index 7239b4a..1917cfc 100644
--- a/chromeos/ash/components/audio/cras_audio_handler.cc
+++ b/chromeos/ash/components/audio/cras_audio_handler.cc
@@ -1036,23 +1036,27 @@
   SetInputMute(mute_on, InputMuteChangeMethod::kOther);
 }
 
+void CrasAudioHandler::RecordUserSwitchAudioDevice(bool is_input) const {
+  if (is_input) {
+    base::RecordAction(base::UserMetricsAction(kUserActionSwitchInput));
+    if (!input_device_selected_by_user_) {
+      base::RecordAction(
+          base::UserMetricsAction(kUserActionSwitchInputOverridden));
+    }
+  } else {
+    base::RecordAction(base::UserMetricsAction(kUserActionSwitchOutput));
+    if (!output_device_selected_by_user_) {
+      base::RecordAction(
+          base::UserMetricsAction(kUserActionSwitchOutputOverridden));
+    }
+  }
+}
+
 void CrasAudioHandler::SetActiveDevice(const AudioDevice& active_device,
                                        bool notify,
                                        DeviceActivateType activate_by) {
   if (activate_by == ACTIVATE_BY_USER) {
-    if (active_device.is_input) {
-      base::RecordAction(base::UserMetricsAction(kUserActionSwitchInput));
-      if (!input_device_selected_by_user_) {
-        base::RecordAction(
-            base::UserMetricsAction(kUserActionSwitchInputOverridden));
-      }
-    } else {
-      base::RecordAction(base::UserMetricsAction(kUserActionSwitchOutput));
-      if (!output_device_selected_by_user_) {
-        base::RecordAction(
-            base::UserMetricsAction(kUserActionSwitchOutputOverridden));
-      }
-    }
+    RecordUserSwitchAudioDevice(active_device.is_input);
   }
 
   // Update *_selected_by_user_.
diff --git a/chromeos/ash/components/audio/cras_audio_handler.h b/chromeos/ash/components/audio/cras_audio_handler.h
index ba333fe3..577af430 100644
--- a/chromeos/ash/components/audio/cras_audio_handler.h
+++ b/chromeos/ash/components/audio/cras_audio_handler.h
@@ -940,6 +940,9 @@
   void HandleGetNumStreamIgnoreUiGains(
       absl::optional<int32_t> num_stream_ignore_ui_gains);
 
+  // Record metrics when user switches audio device.
+  void RecordUserSwitchAudioDevice(bool is_input) const;
+
   // Static helper function to abstract the |AudioSurvey| from input
   // |survey_specific_data|.
   static std::unique_ptr<CrasAudioHandler::AudioSurvey> AbstractAudioSurvey(
diff --git a/clank b/clank
index 12e8454..b0a7c7b 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 12e84541a2d44aa5535caf8b1a073fa64376c0c6
+Subproject commit b0a7c7b4fab38799037256bba133600deda76ca8
diff --git a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillManagerWrapper.java b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillManagerWrapper.java
index 5a5c1e5..f5f5328e 100644
--- a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillManagerWrapper.java
+++ b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillManagerWrapper.java
@@ -12,7 +12,6 @@
 import android.view.autofill.AutofillManager;
 import android.view.autofill.AutofillValue;
 
-import androidx.annotation.RequiresApi;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.CollectionUtil;
@@ -25,7 +24,6 @@
 /**
  * The class to call Android's AutofillManager.
  */
-@RequiresApi(Build.VERSION_CODES.O)
 public class AutofillManagerWrapper {
     // Don't change TAG, it is used for runtime log.
     // NOTE: As a result of the above, the tag below still references the name of this class from
diff --git a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillProvider.java b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillProvider.java
index 56c05731..0028c91 100644
--- a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillProvider.java
+++ b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillProvider.java
@@ -16,7 +16,6 @@
 import android.view.ViewStructure;
 import android.view.autofill.AutofillValue;
 
-import androidx.annotation.RequiresApi;
 import androidx.annotation.VisibleForTesting;
 
 import org.jni_zero.CalledByNative;
@@ -37,21 +36,18 @@
 import org.chromium.ui.display.DisplayAndroid;
 
 /**
- * This class works with Android autofill service to fill web form, it doesn't use chrome's
- * autofill service or suggestion UI. All methods are supposed to be called in UI thread.
+ * This class works with Android autofill service to fill web form, it doesn't use Chrome's autofill
+ * service or suggestion UI. All methods are supposed to be called in UI thread.
  *
- * AutofillProvider handles one autofill session at time, each call of
- * queryFormFieldAutofill cancels previous session and starts a new one, the
- * calling of other methods shall associate with current session.
+ * <p>AutofillProvider handles one autofill session at time, each call of startAutofillSession
+ * cancels previous session and starts a new one, the calling of other methods shall associate with
+ * current session.
  *
- * This class doesn't have 1:1 mapping to native AutofillProviderAndroid; the
- * normal ownership model is that this object is owned by the embedder-specific
- * Java WebContents wrapper (e.g., AwContents.java in //android_webview), and
- * AutofillProviderAndroid is owned by the embedder-specific C++ WebContents
- * wrapper (e.g., native AwContents in //android_webview).
- *
+ * <p>This class doesn't have 1:1 mapping to native AutofillProviderAndroid; the normal ownership
+ * model is that this object is owned by the embedder-specific Java WebContents wrapper (e.g.,
+ * AwContents.java in //android_webview), and AutofillProviderAndroid is owned by the
+ * embedder-specific C++ WebContents wrapper (e.g., native AwContents in //android_webview).
  */
-@RequiresApi(Build.VERSION_CODES.O)
 @JNINamespace("autofill")
 public class AutofillProvider {
     /**
@@ -85,7 +81,6 @@
         mWebContents = webContents;
         mProviderName = providerName;
         try (ScopedSysTraceEvent e = ScopedSysTraceEvent.scoped("AutofillProvider.constructor")) {
-            assert Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
             if (sAutofillManagerFactoryForTesting != null) {
                 mAutofillManager = sAutofillManagerFactoryForTesting.create(context);
             } else {
@@ -590,7 +585,7 @@
         if (mRequest == null) return;
         mRequest.onQueryDone(success);
         mAutofillUMA.onServerTypeAvailable(
-                success ? mRequest.getForm() : null, /*afterSessionStarted*/ true);
+                success ? mRequest.getForm() : null, /* afterSessionStarted= */ true);
         mAutofillManager.onQueryDone(success);
     }
 
diff --git a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillRequest.java b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillRequest.java
index 895afdec..7e33a30 100644
--- a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillRequest.java
+++ b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillRequest.java
@@ -6,14 +6,11 @@
 
 import android.graphics.Rect;
 import android.graphics.RectF;
-import android.os.Build;
 import android.util.SparseArray;
 import android.view.View;
 import android.view.ViewStructure;
 import android.view.autofill.AutofillValue;
 
-import androidx.annotation.RequiresApi;
-
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
 import org.chromium.components.autofill_public.ViewType;
@@ -28,7 +25,6 @@
  * - {@link #fillViewStructure}: Translates the FormData in this object into a ViewStructure.
  * - {@link #autofill}: Verifies that the autofill request by the framework is valid.
  */
-@RequiresApi(Build.VERSION_CODES.O)
 public class AutofillRequest {
     /**
      * A simple class representing the field that is currently focused by the user.
@@ -100,8 +96,13 @@
 
             RectF bounds = field.getBoundsInContainerViewCoordinates();
             // Field has no scroll.
-            child.setDimens((int) bounds.left, (int) bounds.top, 0 /* scrollX*/, 0 /* scrollY */,
-                    (int) bounds.width(), (int) bounds.height());
+            child.setDimens(
+                    (int) bounds.left,
+                    (int) bounds.top,
+                    /* scrollX= */ 0,
+                    /* scrollY= */ 0,
+                    (int) bounds.width(),
+                    (int) bounds.height());
             child.setVisibility(field.getVisible() ? View.VISIBLE : View.INVISIBLE);
 
             ViewStructure.HtmlInfo.Builder builder =
diff --git a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillSelectionMenuItemProvider.java b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillSelectionMenuItemProvider.java
index 1f41edc..fc586be7 100644
--- a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillSelectionMenuItemProvider.java
+++ b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillSelectionMenuItemProvider.java
@@ -39,19 +39,17 @@
     @Override
     public List<SelectionMenuItem> getItems() {
         List<SelectionMenuItem> autofillItems = new ArrayList<>();
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            if (mAutofillMenuItemTitle != 0 && mAutofillProvider.shouldQueryAutofillSuggestion()) {
-                SelectionMenuItem autofillItem =
-                        new SelectionMenuItem.Builder(mAutofillMenuItemTitle)
-                                .setId(android.R.id.autofill)
-                                .setOrderInCategory(Menu.CATEGORY_SECONDARY)
-                                .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_NEVER
-                                        | MenuItem.SHOW_AS_ACTION_WITH_TEXT)
-                                .setClickListener(v -> mAutofillProvider.queryAutofillSuggestion())
-                                .build();
-                autofillItems.add(autofillItem);
-            }
+        if (mAutofillMenuItemTitle == 0 || !mAutofillProvider.shouldQueryAutofillSuggestion()) {
+            return autofillItems;
         }
+        autofillItems.add(
+                new SelectionMenuItem.Builder(mAutofillMenuItemTitle)
+                        .setId(android.R.id.autofill)
+                        .setOrderInCategory(Menu.CATEGORY_SECONDARY)
+                        .setShowAsActionFlags(
+                                MenuItem.SHOW_AS_ACTION_NEVER | MenuItem.SHOW_AS_ACTION_WITH_TEXT)
+                        .setClickListener(v -> mAutofillProvider.queryAutofillSuggestion())
+                        .build());
         return autofillItems;
     }
 
diff --git a/components/android_autofill/browser/test_support/java/src/org/chromium/components/autofill/AutofillProviderTestHelper.java b/components/android_autofill/browser/test_support/java/src/org/chromium/components/autofill/AutofillProviderTestHelper.java
index 16be10d92..6080b6d 100644
--- a/components/android_autofill/browser/test_support/java/src/org/chromium/components/autofill/AutofillProviderTestHelper.java
+++ b/components/android_autofill/browser/test_support/java/src/org/chromium/components/autofill/AutofillProviderTestHelper.java
@@ -4,10 +4,6 @@
 
 package org.chromium.components.autofill;
 
-import android.os.Build;
-
-import androidx.annotation.RequiresApi;
-
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
@@ -16,7 +12,6 @@
 /**
  * The help class for Autofill Provider test to access the native code.
  */
-@RequiresApi(Build.VERSION_CODES.O)
 @JNINamespace("autofill")
 public class AutofillProviderTestHelper {
     /**
diff --git a/components/autofill/core/browser/autofill_external_delegate.cc b/components/autofill/core/browser/autofill_external_delegate.cc
index fa6eb47..bad17d4 100644
--- a/components/autofill/core/browser/autofill_external_delegate.cc
+++ b/components/autofill/core/browser/autofill_external_delegate.cc
@@ -424,12 +424,12 @@
       break;
     case PopupItemId::kEditAddressProfile: {
       ShowEditAddressProfileDialog(
-          suggestion.GetPayload<Suggestion::BackendId>().value());
+          suggestion.GetBackendId<Suggestion::Guid>().value());
       break;
     }
     case PopupItemId::kDeleteAddressProfile:
       ShowDeleteAddressProfileDialog(
-          suggestion.GetPayload<Suggestion::BackendId>().value());
+          suggestion.GetBackendId<Suggestion::Guid>().value());
       break;
     case PopupItemId::kClearForm:
       // This serves as a clear form or undo autofill suggestion, depending on
@@ -838,7 +838,8 @@
                  : mojom::ActionPersistence::kFill;
 
   PersonalDataManager* pdm = manager_->client().GetPersonalDataManager();
-  if (CreditCard* credit_card = pdm->GetCreditCardByGUID(backend_id.value())) {
+  if (CreditCard* credit_card = pdm->GetCreditCardByGUID(
+          absl::get<Suggestion::Guid>(backend_id).value())) {
     if (popup_item_id == PopupItemId::kVirtualCreditCardEntry) {
       // Virtual credit cards are not persisted in Chrome, modify record type
       // locally.
@@ -851,8 +852,8 @@
                                             query_field_, credit_card,
                                             trigger_details);
     }
-  } else if (const AutofillProfile* profile =
-                 pdm->GetProfileByGUID(backend_id.value())) {
+  } else if (const AutofillProfile* profile = pdm->GetProfileByGUID(
+                 absl::get<Suggestion::Guid>(backend_id).value())) {
     manager_->FillOrPreviewProfileForm(action_persistence, query_form_,
                                        query_field_, *profile, trigger_details);
   }
diff --git a/components/autofill/core/browser/autofill_external_delegate_unittest.cc b/components/autofill/core/browser/autofill_external_delegate_unittest.cc
index b5d692f..8e30c91 100644
--- a/components/autofill/core/browser/autofill_external_delegate_unittest.cc
+++ b/components/autofill/core/browser/autofill_external_delegate_unittest.cc
@@ -368,7 +368,7 @@
   EXPECT_CALL(autofill_client_, ShowEditAddressProfileDialog).Times(0);
 
   auto suggestion = Suggestion(PopupItemId::kEditAddressProfile);
-  suggestion.payload = Suggestion::BackendId(guid);
+  suggestion.payload = Suggestion::Guid(guid);
   external_delegate_->DidAcceptSuggestion(
       suggestion, SuggestionPosition{.row = 0},
       AutofillSuggestionTriggerSource::kFormControlElementClicked);
@@ -384,7 +384,7 @@
   EXPECT_CALL(autofill_client_, ShowEditAddressProfileDialog(profile, _));
 
   auto suggestion = Suggestion(PopupItemId::kEditAddressProfile);
-  suggestion.payload = Suggestion::BackendId(profile.guid());
+  suggestion.payload = Suggestion::Guid(profile.guid());
   external_delegate_->DidAcceptSuggestion(
       suggestion, SuggestionPosition{.row = 0},
       AutofillSuggestionTriggerSource::kFormControlElementClicked);
@@ -416,7 +416,7 @@
           AutofillSuggestionTriggerSource::kShowPromptAfterDialogClosed));
 
   auto suggestion = Suggestion(PopupItemId::kEditAddressProfile);
-  suggestion.payload = Suggestion::BackendId(profile.guid());
+  suggestion.payload = Suggestion::Guid(profile.guid());
   external_delegate_->DidAcceptSuggestion(
       suggestion, SuggestionPosition{.row = 0},
       AutofillSuggestionTriggerSource::kFormControlElementClicked);
@@ -449,7 +449,7 @@
           AutofillSuggestionTriggerSource::kShowPromptAfterDialogClosed));
 
   auto suggestion = Suggestion(PopupItemId::kEditAddressProfile);
-  suggestion.payload = Suggestion::BackendId(profile.guid());
+  suggestion.payload = Suggestion::Guid(profile.guid());
   external_delegate_->DidAcceptSuggestion(
       suggestion, SuggestionPosition{.row = 0},
       AutofillSuggestionTriggerSource::kFormControlElementClicked);
@@ -480,7 +480,7 @@
   EXPECT_CALL(personal_data(), UpdateProfile(profile)).Times(2);
 
   auto suggestion = Suggestion(PopupItemId::kEditAddressProfile);
-  suggestion.payload = Suggestion::BackendId(profile.guid());
+  suggestion.payload = Suggestion::Guid(profile.guid());
 
   external_delegate_->DidAcceptSuggestion(
       suggestion, SuggestionPosition{.row = 0},
@@ -510,7 +510,7 @@
   EXPECT_CALL(personal_data(), UpdateProfile(profile));
 
   auto suggestion = Suggestion(PopupItemId::kEditAddressProfile);
-  suggestion.payload = Suggestion::BackendId(profile.guid());
+  suggestion.payload = Suggestion::Guid(profile.guid());
   external_delegate_->DidAcceptSuggestion(
       suggestion, SuggestionPosition{.row = 0},
       AutofillSuggestionTriggerSource::kFormControlElementClicked);
@@ -528,7 +528,7 @@
   const std::string guid = base::Uuid().AsLowercaseString();
   EXPECT_CALL(autofill_client_, ShowDeleteAddressProfileDialog).Times(0);
   auto suggestion = Suggestion(PopupItemId::kDeleteAddressProfile);
-  suggestion.payload = Suggestion::BackendId(guid);
+  suggestion.payload = Suggestion::Guid(guid);
 
   external_delegate_->DidAcceptSuggestion(
       suggestion, SuggestionPosition{.row = 0},
@@ -544,7 +544,7 @@
   personal_data().AddProfile(profile);
   EXPECT_CALL(autofill_client_, ShowDeleteAddressProfileDialog(profile, _));
   auto suggestion = Suggestion(PopupItemId::kDeleteAddressProfile);
-  suggestion.payload = Suggestion::BackendId(profile.guid());
+  suggestion.payload = Suggestion::Guid(profile.guid());
 
   external_delegate_->DidAcceptSuggestion(
       suggestion, SuggestionPosition{.row = 0},
@@ -573,7 +573,7 @@
           queried_form_triggering_field_id_,
           AutofillSuggestionTriggerSource::kShowPromptAfterDialogClosed));
   auto suggestion = Suggestion(PopupItemId::kDeleteAddressProfile);
-  suggestion.payload = Suggestion::BackendId(profile.guid());
+  suggestion.payload = Suggestion::Guid(profile.guid());
 
   external_delegate_->DidAcceptSuggestion(
       suggestion, SuggestionPosition{.row = 0},
@@ -603,7 +603,7 @@
           queried_form_triggering_field_id_,
           AutofillSuggestionTriggerSource::kShowPromptAfterDialogClosed));
   auto suggestion = Suggestion(PopupItemId::kDeleteAddressProfile);
-  suggestion.payload = Suggestion::BackendId(profile.guid());
+  suggestion.payload = Suggestion::Guid(profile.guid());
 
   external_delegate_->DidAcceptSuggestion(
       suggestion, SuggestionPosition{.row = 0},
@@ -631,7 +631,7 @@
   // Autofill profile can be deleted both times.
   EXPECT_CALL(personal_data(), RemoveByGUID(profile.guid())).Times(2);
   auto suggestion = Suggestion(PopupItemId::kDeleteAddressProfile);
-  suggestion.payload = Suggestion::BackendId(profile.guid());
+  suggestion.payload = Suggestion::Guid(profile.guid());
 
   external_delegate_->DidAcceptSuggestion(
       suggestion, SuggestionPosition{.row = 0},
@@ -659,7 +659,7 @@
   personal_data().AddProfile(profile);
   std::vector<Suggestion> autofill_item = {
       Suggestion(PopupItemId::kAddressEntry)};
-  autofill_item[0].payload = Suggestion::BackendId(profile.guid());
+  autofill_item[0].payload = Suggestion::Guid(profile.guid());
   external_delegate_->OnSuggestionsReturned(
       queried_form_triggering_field_id_, autofill_item, kDefaultTriggerSource);
 
@@ -1018,7 +1018,7 @@
   personal_data().AddProfile(profile);
   external_delegate_->DidSelectSuggestion(
       test::CreateAutofillSuggestion(PopupItemId::kAddressEntry, u"baz foo",
-                                     Suggestion::BackendId(profile.guid())),
+                                     Suggestion::Guid(profile.guid())),
       kDefaultTriggerSource);
 
   // Ensure selecting an autocomplete entry will cause any previews to
@@ -1043,7 +1043,7 @@
               FillOrPreviewCreditCardForm(mojom::ActionPersistence::kPreview, _,
                                           _, _, _));
   Suggestion suggestion(PopupItemId::kVirtualCreditCardEntry);
-  suggestion.payload = Suggestion::BackendId(card.guid());
+  suggestion.payload = Suggestion::Guid(card.guid());
   external_delegate_->DidSelectSuggestion(suggestion, kDefaultTriggerSource);
 }
 
@@ -1120,7 +1120,7 @@
   const AutofillProfile profile = test::GetFullProfile();
   personal_data().AddProfile(profile);
   const Suggestion suggestion = test::CreateAutofillSuggestion(
-      params.popup_item_id, u"baz foo", Suggestion::BackendId(profile.guid()));
+      params.popup_item_id, u"baz foo", Suggestion::Guid(profile.guid()));
   // Wait until form is parsed. We only perform field by field filling if the
   // AutofillField exists.
   browser_autofill_manager_->OnFormsSeen({queried_form_}, {});
@@ -1174,7 +1174,7 @@
   const AutofillProfile profile = test::GetFullProfile();
   personal_data().AddProfile(profile);
   const Suggestion suggestion = test::CreateAutofillSuggestion(
-      params.popup_item_id, u"baz foo", Suggestion::BackendId(profile.guid()));
+      params.popup_item_id, u"baz foo", Suggestion::Guid(profile.guid()));
   auto expected_source =
 #if BUILDFLAG(IS_ANDROID)
       AutofillTriggerSource::kKeyboardAccessory;
@@ -1221,7 +1221,7 @@
   personal_data().AddProfile(profile);
   external_delegate_->DidAcceptSuggestion(
       test::CreateAutofillSuggestion(PopupItemId::kAddressEntry, u"John Legend",
-                                     Suggestion::BackendId(profile.guid())),
+                                     Suggestion::Guid(profile.guid())),
       SuggestionPosition{.row = 2}, kDefaultTriggerSource);
 }
 
@@ -1234,7 +1234,7 @@
 
   external_delegate_->DidAcceptSuggestion(
       test::CreateAutofillSuggestion(PopupItemId::kAddressEntry, u"John Legend",
-                                     Suggestion::BackendId(profile.guid())),
+                                     Suggestion::Guid(profile.guid())),
       AutofillPopupDelegate::SuggestionPosition{.row = suggestion_accepted_row},
       kDefaultTriggerSource);
 
@@ -1256,7 +1256,7 @@
 
   external_delegate_->DidAcceptSuggestion(
       test::CreateAutofillSuggestion(PopupItemId::kAddressEntry, u"John Legend",
-                                     Suggestion::BackendId(profile.guid())),
+                                     Suggestion::Guid(profile.guid())),
       AutofillPopupDelegate::SuggestionPosition{.row = suggestion_accepted_row,
                                                 .sub_popup_level = 1},
       kDefaultTriggerSource);
@@ -1271,7 +1271,7 @@
   personal_data().AddProfile(profile);
   const Suggestion suggestion = test::CreateAutofillSuggestion(
       PopupItemId::kFillEverythingFromAddressProfile, u"John Legend",
-      Suggestion::BackendId(profile.guid()));
+      Suggestion::Guid(profile.guid()));
 
   EXPECT_CALL(autofill_client_,
               HideAutofillPopup(PopupHidingReason::kAcceptSuggestion));
@@ -1298,7 +1298,7 @@
   personal_data().AddProfile(profile);
   Suggestion suggestion = test::CreateAutofillSuggestion(
       PopupItemId::kAddressEntry, /*main_text_value=*/u"",
-      Suggestion::BackendId(profile.guid()));
+      Suggestion::Guid(profile.guid()));
 
   // Expect that `kFormControlElementClicked` translates to source `kPopup` or
   // `kKeyboardAccessory`, depending on the platform.
@@ -1926,7 +1926,7 @@
       *browser_autofill_manager_,
       FillOrPreviewCreditCardForm(mojom::ActionPersistence::kFill, _, _, _, _));
   Suggestion suggestion(PopupItemId::kVirtualCreditCardEntry);
-  suggestion.payload = Suggestion::BackendId(card.guid());
+  suggestion.payload = Suggestion::Guid(card.guid());
   external_delegate_->DidAcceptSuggestion(
       suggestion, SuggestionPosition{.row = 0}, kDefaultTriggerSource);
 }
@@ -1938,7 +1938,7 @@
               FillOrPreviewCreditCardForm(mojom::ActionPersistence::kPreview, _,
                                           _, _, _));
   Suggestion suggestion(PopupItemId::kVirtualCreditCardEntry);
-  suggestion.payload = Suggestion::BackendId(card.guid());
+  suggestion.payload = Suggestion::Guid(card.guid());
   external_delegate_->DidSelectSuggestion(suggestion, kDefaultTriggerSource);
 }
 
diff --git a/components/autofill/core/browser/autofill_suggestion_generator.cc b/components/autofill/core/browser/autofill_suggestion_generator.cc
index 7eac6da..3bc2967 100644
--- a/components/autofill/core/browser/autofill_suggestion_generator.cc
+++ b/components/autofill/core/browser/autofill_suggestion_generator.cc
@@ -227,7 +227,7 @@
     // Note that this suggestion can only be added if name infos exist in the
     // profile.
     suggestion.children.push_back(
-        GetFillFullNameSuggestion(Suggestion::BackendId(profile.guid())));
+        GetFillFullNameSuggestion(Suggestion::Guid(profile.guid())));
   }
   if (AddFieldByFieldSuggestions({NAME_FIRST, NAME_MIDDLE, NAME_LAST}, profile,
                                  app_locale, suggestion.children)) {
@@ -295,7 +295,7 @@
     // Note that this suggestion can only be added if address infos exist in the
     // profile.
     suggestion.children.push_back(
-        GetFillFullAddressSuggestion(Suggestion::BackendId(profile.guid())));
+        GetFillFullAddressSuggestion(Suggestion::Guid(profile.guid())));
   }
 
   bool added_any_address_line =
@@ -337,7 +337,7 @@
     } else {
       // `PopupItemId::kFieldByFieldFilling` suggestions do not use profile,
       // therefore only set the backend id in the group filling case.
-      phone_number_suggestion.payload = Suggestion::BackendId(profile.guid());
+      phone_number_suggestion.payload = Suggestion::Guid(profile.guid());
     }
     suggestion.children.push_back(std::move(phone_number_suggestion));
     phone_number_suggestion_added = true;
@@ -359,7 +359,7 @@
     } else {
       // `PopupItemId::kFieldByFieldFilling` suggestions do not use profile,
       // therefore only set the backend id in the group filling case.
-      email_address_suggestion.payload = Suggestion::BackendId(profile.guid());
+      email_address_suggestion.payload = Suggestion::Guid(profile.guid());
     }
     suggestion.children.push_back(std::move(email_address_suggestion));
     email_address_suggestion_added = true;
@@ -382,12 +382,12 @@
   // filling experience.
   if (!last_targeted_fields || *last_targeted_fields != kAllServerFieldTypes) {
     suggestion.children.push_back(GetFillEverythingFromAddressProfileSuggestion(
-        Suggestion::BackendId(profile.guid())));
+        Suggestion::Guid(profile.guid())));
   }
   suggestion.children.push_back(
-      GetEditAddressProfileSuggestion(Suggestion::BackendId(profile.guid())));
+      GetEditAddressProfileSuggestion(Suggestion::Guid(profile.guid())));
   suggestion.children.push_back(
-      GetDeleteAddressProfileSuggestion(Suggestion::BackendId(profile.guid())));
+      GetDeleteAddressProfileSuggestion(Suggestion::Guid(profile.guid())));
 }
 
 // Sets the `popup_item_id` for `suggestion` depending on
@@ -695,8 +695,7 @@
         test_address.GetInfo(ADDRESS_HOME_COUNTRY, locale);
     suggestion.children.emplace_back(test_address_country,
                                      PopupItemId::kDevtoolsTestAddressEntry);
-    suggestion.children.back().payload =
-        Suggestion::BackendId(test_address.guid());
+    suggestion.children.back().payload = Suggestion::Guid(test_address.guid());
     suggestion.children.back().acceptance_a11y_announcement =
         l10n_util::GetStringFUTF16(IDS_AUTOFILL_TEST_ADDRESS_SELECTED_A11Y_HINT,
                                    test_address_country);
@@ -806,7 +805,7 @@
     }
 
     suggestions.emplace_back(main_text);
-    suggestions.back().payload = Suggestion::BackendId(profile->guid());
+    suggestions.back().payload = Suggestion::Guid(profile->guid());
     suggestions.back().acceptance_a11y_announcement =
         l10n_util::GetStringUTF16(IDS_AUTOFILL_A11Y_ANNOUNCE_FILLED_FORM);
     suggestions.back().popup_item_id = GetProfileSuggestionPopupItemId(
@@ -1108,7 +1107,7 @@
     Suggestion suggestion;
     suggestion.icon = credit_card.CardIconForAutofillSuggestion();
     suggestion.popup_item_id = PopupItemId::kVirtualCreditCardEntry;
-    suggestion.payload = Suggestion::BackendId(credit_card.guid());
+    suggestion.payload = Suggestion::Guid(credit_card.guid());
     suggestion.feature_for_iph =
         feature_engagement::kIPHAutofillVirtualCardCVCSuggestionFeature.name;
     SetCardArtURL(suggestion, credit_card, /*virtual_card_option=*/true);
@@ -1156,7 +1155,8 @@
 
   return base::ranges::find_if(
              profiles_to_suggest, [backend_id](const AutofillProfile* profile) {
-               return Suggestion::BackendId(profile->guid()) == backend_id;
+               return Suggestion::BackendId(
+                          Suggestion::Guid(profile->guid())) == backend_id;
              }) == profiles_to_suggest.end();
 }
 
@@ -1234,7 +1234,10 @@
       suggestion.payload = Suggestion::ValueToFill(iban->GetStrippedValue());
     } else {
       CHECK(iban->record_type() == Iban::kServerIban);
-      suggestion.payload = Suggestion::BackendId(iban->instrument_id());
+      int64_t instrument_id = 0;
+      CHECK(base::StringToInt64(iban->instrument_id(), &instrument_id));
+      suggestion.payload =
+          Suggestion::BackendId(Suggestion::InstrumentId(instrument_id));
     }
     if (!iban->nickname().empty())
       suggestion.labels = {{Suggestion::Text(iban->nickname())}};
@@ -1265,7 +1268,7 @@
           promo_code_offer->GetDisplayStrings().value_prop_text))}};
     }
     suggestion.payload = Suggestion::BackendId(
-        base::NumberToString(promo_code_offer->GetOfferId()));
+        Suggestion::Guid(base::NumberToString(promo_code_offer->GetOfferId())));
     suggestion.popup_item_id = PopupItemId::kMerchantPromoCodeEntry;
 
     // Every offer for a given merchant leads to the same GURL, so we grab the
@@ -1378,7 +1381,7 @@
   suggestion.icon = credit_card.CardIconForAutofillSuggestion();
   CHECK(suggestion.popup_item_id == PopupItemId::kAutocompleteEntry);
   suggestion.popup_item_id = PopupItemId::kCreditCardEntry;
-  suggestion.payload = Suggestion::BackendId(credit_card.guid());
+  suggestion.payload = Suggestion::Guid(credit_card.guid());
 #if BUILDFLAG(IS_ANDROID)
   // The card art icon should always be shown at the start of the suggestion.
   suggestion.is_icon_at_start = true;
@@ -1543,7 +1546,7 @@
     const CreditCard* server_duplicate_card =
         personal_data_->GetServerCardForLocalCard(&credit_card);
     DCHECK(server_duplicate_card);
-    suggestion.payload = Suggestion::BackendId(server_duplicate_card->guid());
+    suggestion.payload = Suggestion::Guid(server_duplicate_card->guid());
   }
 
   suggestion.popup_item_id = PopupItemId::kVirtualCreditCardEntry;
diff --git a/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc b/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc
index d0907d5..be085c5 100644
--- a/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc
+++ b/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc
@@ -1794,12 +1794,15 @@
   // The suggestion with card linked offer available should be ranked to the
   // top.
   EXPECT_EQ(suggestions[0].GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("00000000-0000-0000-0000-000000000002"));
+            Suggestion::BackendId(
+                Suggestion::Guid("00000000-0000-0000-0000-000000000002")));
   // The other suggestions should have their relative ranking unchanged.
   EXPECT_EQ(suggestions[1].GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("00000000-0000-0000-0000-000000000003"));
+            Suggestion::BackendId(
+                Suggestion::Guid("00000000-0000-0000-0000-000000000003")));
   EXPECT_EQ(suggestions[2].GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("00000000-0000-0000-0000-000000000001"));
+            Suggestion::BackendId(
+                Suggestion::Guid("00000000-0000-0000-0000-000000000001")));
 }
 
 // Ensures we appropriately generate suggestions for virtual cards on a
@@ -2100,23 +2103,30 @@
   // payment methods settings page.
   ASSERT_EQ(iban_suggestions.size(), 5u);
 
+  int64_t instrument_id = 0;
+  CHECK(base::StringToInt64(server_iban1.instrument_id(), &instrument_id));
   EXPECT_THAT(
       iban_suggestions[0],
-      EqualsIbanSuggestion(server_iban1.GetIdentifierStringForAutofillDisplay(),
-                           Suggestion::BackendId(server_iban1.instrument_id()),
-                           server_iban1.nickname()));
+      EqualsIbanSuggestion(
+          server_iban1.GetIdentifierStringForAutofillDisplay(),
+          Suggestion::BackendId(Suggestion::InstrumentId(instrument_id)),
+          server_iban1.nickname()));
 
+  CHECK(base::StringToInt64(server_iban2.instrument_id(), &instrument_id));
   EXPECT_THAT(
       iban_suggestions[1],
-      EqualsIbanSuggestion(server_iban2.GetIdentifierStringForAutofillDisplay(),
-                           Suggestion::BackendId(server_iban2.instrument_id()),
-                           server_iban2.nickname()));
+      EqualsIbanSuggestion(
+          server_iban2.GetIdentifierStringForAutofillDisplay(),
+          Suggestion::BackendId(Suggestion::InstrumentId(instrument_id)),
+          server_iban2.nickname()));
 
+  CHECK(base::StringToInt64(server_iban3.instrument_id(), &instrument_id));
   EXPECT_THAT(
       iban_suggestions[2],
-      EqualsIbanSuggestion(server_iban3.GetIdentifierStringForAutofillDisplay(),
-                           Suggestion::BackendId(server_iban3.instrument_id()),
-                           server_iban3.nickname()));
+      EqualsIbanSuggestion(
+          server_iban3.GetIdentifierStringForAutofillDisplay(),
+          Suggestion::BackendId(Suggestion::InstrumentId(instrument_id)),
+          server_iban3.nickname()));
 
   EXPECT_EQ(iban_suggestions[3].popup_item_id, PopupItemId::kSeparator);
 
@@ -2141,17 +2151,22 @@
   // payment methods settings page.
   ASSERT_EQ(iban_suggestions.size(), 5u);
 
+  int64_t instrument_id = 0;
+  CHECK(base::StringToInt64(server_iban1.instrument_id(), &instrument_id));
   EXPECT_THAT(
       iban_suggestions[0],
-      EqualsIbanSuggestion(server_iban1.GetIdentifierStringForAutofillDisplay(),
-                           Suggestion::BackendId(server_iban1.instrument_id()),
-                           server_iban1.nickname()));
+      EqualsIbanSuggestion(
+          server_iban1.GetIdentifierStringForAutofillDisplay(),
+          Suggestion::BackendId(Suggestion::InstrumentId(instrument_id)),
+          server_iban1.nickname()));
 
+  CHECK(base::StringToInt64(server_iban2.instrument_id(), &instrument_id));
   EXPECT_THAT(
       iban_suggestions[1],
-      EqualsIbanSuggestion(server_iban2.GetIdentifierStringForAutofillDisplay(),
-                           Suggestion::BackendId(server_iban2.instrument_id()),
-                           server_iban2.nickname()));
+      EqualsIbanSuggestion(
+          server_iban2.GetIdentifierStringForAutofillDisplay(),
+          Suggestion::BackendId(Suggestion::InstrumentId(instrument_id)),
+          server_iban2.nickname()));
 
   EXPECT_THAT(iban_suggestions[2],
               EqualsIbanSuggestion(
@@ -2199,25 +2214,25 @@
 
   EXPECT_EQ(promo_code_suggestions[0].main_text.value, u"test_promo_code_1");
   EXPECT_EQ(promo_code_suggestions[0].GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("1"));
+            Suggestion::BackendId(Suggestion::Guid("1")));
   ASSERT_EQ(promo_code_suggestions[0].labels.size(), 1U);
   ASSERT_EQ(promo_code_suggestions[0].labels[0].size(), 1U);
   EXPECT_EQ(promo_code_suggestions[0].labels[0][0].value,
             u"test_value_prop_text_1");
   EXPECT_EQ(promo_code_suggestions[0].GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("1"));
+            Suggestion::BackendId(Suggestion::Guid("1")));
   EXPECT_EQ(promo_code_suggestions[0].popup_item_id,
             PopupItemId::kMerchantPromoCodeEntry);
 
   EXPECT_EQ(promo_code_suggestions[1].main_text.value, u"test_promo_code_2");
   EXPECT_EQ(promo_code_suggestions[1].GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("2"));
+            Suggestion::BackendId(Suggestion::Guid("2")));
   ASSERT_EQ(promo_code_suggestions[1].labels.size(), 1U);
   ASSERT_EQ(promo_code_suggestions[1].labels[0].size(), 1U);
   EXPECT_EQ(promo_code_suggestions[1].labels[0][0].value,
             u"test_value_prop_text_2");
   EXPECT_EQ(promo_code_suggestions[1].GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("2"));
+            Suggestion::BackendId(Suggestion::Guid("2")));
   EXPECT_EQ(promo_code_suggestions[1].popup_item_id,
             PopupItemId::kMerchantPromoCodeEntry);
 
@@ -2283,7 +2298,7 @@
 
   const Suggestion& child = suggestions[0].children.back();
   EXPECT_EQ(child.main_text.value, u"United States");
-  EXPECT_EQ(child.GetPayload<Suggestion::BackendId>().value(), profile.guid());
+  EXPECT_EQ(child.GetBackendId<Suggestion::Guid>().value(), profile.guid());
   EXPECT_EQ(child.popup_item_id, PopupItemId::kDevtoolsTestAddressEntry);
 }
 
@@ -2741,7 +2756,8 @@
   EXPECT_EQ(virtual_card_suggestion.popup_item_id,
             PopupItemId::kVirtualCreditCardEntry);
   EXPECT_EQ(virtual_card_suggestion.GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("00000000-0000-0000-0000-000000000001"));
+            Suggestion::BackendId(
+                Suggestion::Guid("00000000-0000-0000-0000-000000000001")));
   EXPECT_EQ(VerifyCardArtImageExpectation(virtual_card_suggestion, card_art_url,
                                           fake_image),
             card_art_image_enabled());
@@ -2754,7 +2770,8 @@
 
   EXPECT_EQ(real_card_suggestion.popup_item_id, PopupItemId::kCreditCardEntry);
   EXPECT_EQ(real_card_suggestion.GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("00000000-0000-0000-0000-000000000001"));
+            Suggestion::BackendId(
+                Suggestion::Guid("00000000-0000-0000-0000-000000000001")));
   EXPECT_EQ(VerifyCardArtImageExpectation(real_card_suggestion, card_art_url,
                                           fake_image),
             card_art_image_enabled());
@@ -2773,7 +2790,8 @@
 
   EXPECT_EQ(real_card_suggestion.popup_item_id, PopupItemId::kCreditCardEntry);
   EXPECT_EQ(real_card_suggestion.GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("00000000-0000-0000-0000-000000000001"));
+            Suggestion::BackendId(
+                Suggestion::Guid("00000000-0000-0000-0000-000000000001")));
   EXPECT_TRUE(VerifyCardArtImageExpectation(real_card_suggestion, GURL(),
                                             gfx::Image()));
 }
@@ -2803,7 +2821,8 @@
   EXPECT_EQ(virtual_card_suggestion.popup_item_id,
             PopupItemId::kVirtualCreditCardEntry);
   EXPECT_EQ(virtual_card_suggestion.GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("00000000-0000-0000-0000-000000000001"));
+            Suggestion::BackendId(
+                Suggestion::Guid("00000000-0000-0000-0000-000000000001")));
   EXPECT_EQ(VerifyCardArtImageExpectation(virtual_card_suggestion, card_art_url,
                                           fake_image),
             card_art_image_enabled());
@@ -2816,7 +2835,8 @@
 
   EXPECT_EQ(real_card_suggestion.popup_item_id, PopupItemId::kCreditCardEntry);
   EXPECT_EQ(real_card_suggestion.GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("00000000-0000-0000-0000-000000000002"));
+            Suggestion::BackendId(
+                Suggestion::Guid("00000000-0000-0000-0000-000000000002")));
   EXPECT_EQ(VerifyCardArtImageExpectation(real_card_suggestion, card_art_url,
                                           fake_image),
             card_art_image_enabled());
@@ -2979,7 +2999,8 @@
   EXPECT_EQ(virtual_card_suggestion.popup_item_id,
             PopupItemId::kVirtualCreditCardEntry);
   EXPECT_EQ(virtual_card_suggestion.GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("00000000-0000-0000-0000-000000000001"));
+            Suggestion::BackendId(
+                Suggestion::Guid("00000000-0000-0000-0000-000000000001")));
   // Ensures CLO text is not shown for virtual card option.
   EXPECT_EQ(virtual_card_suggestion.labels.size(), 1U);
 
@@ -2991,7 +3012,8 @@
 
   EXPECT_EQ(real_card_suggestion.popup_item_id, PopupItemId::kCreditCardEntry);
   EXPECT_EQ(real_card_suggestion.GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId("00000000-0000-0000-0000-000000000001"));
+            Suggestion::BackendId(
+                Suggestion::Guid("00000000-0000-0000-0000-000000000001")));
 
   if (keyboard_accessory_offer_enabled()) {
 #if BUILDFLAG(IS_ANDROID)
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc
index d9da8fb9..534c76d 100644
--- a/components/autofill/core/browser/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -2250,12 +2250,12 @@
 CreditCard* BrowserAutofillManager::GetCreditCard(
     Suggestion::BackendId unique_id) {
   return client().GetPersonalDataManager()->GetCreditCardByGUID(
-      unique_id.value());
+      absl::get<Suggestion::Guid>(unique_id).value());
 }
 
 AutofillProfile* BrowserAutofillManager::GetProfile(
     Suggestion::BackendId unique_id) {
-  std::string guid = unique_id.value();
+  std::string guid = absl::get<Suggestion::Guid>(unique_id).value();
   if (base::Uuid::ParseCaseInsensitive(guid).is_valid()) {
     return client().GetPersonalDataManager()->GetProfileByGUID(guid);
   }
diff --git a/components/autofill/core/browser/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
index 7a11a1e..36aa392 100644
--- a/components/autofill/core/browser/browser_autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
@@ -7964,7 +7964,7 @@
   personal_data().AddProfile(profile);
 
   browser_autofill_manager_->RemoveAutofillProfileOrCreditCard(
-      Suggestion::BackendId(MakeGuid(102)));
+      Suggestion::Guid(MakeGuid(102)));
 
   EXPECT_FALSE(personal_data().GetProfileByGUID(MakeGuid(102)));
 }
@@ -7976,7 +7976,7 @@
   personal_data().AddCreditCard(credit_card);
 
   browser_autofill_manager_->RemoveAutofillProfileOrCreditCard(
-      Suggestion::BackendId(MakeGuid(100007)));
+      Suggestion::Guid(MakeGuid(100007)));
 
   EXPECT_FALSE(personal_data().GetCreditCardByGUID(MakeGuid(100007)));
 }
diff --git a/components/autofill/core/browser/metrics/address_rewriter_in_profile_subset_metrics_unittest.cc b/components/autofill/core/browser/metrics/address_rewriter_in_profile_subset_metrics_unittest.cc
index 13b5c4d..1d1d6ef 100644
--- a/components/autofill/core/browser/metrics/address_rewriter_in_profile_subset_metrics_unittest.cc
+++ b/components/autofill/core/browser/metrics/address_rewriter_in_profile_subset_metrics_unittest.cc
@@ -102,7 +102,7 @@
   external_delegate().OnQuery(form, form.fields.front(), gfx::RectF());
   external_delegate().DidAcceptSuggestion(
       test::CreateAutofillSuggestion(PopupItemId::kAddressEntry, u"first last",
-                                     Suggestion::BackendId(profile_b.guid())),
+                                     Suggestion::Guid(profile_b.guid())),
       AutofillPopupDelegate::SuggestionPosition{.row = 0},
       AutofillSuggestionTriggerSource::kUnspecified);
 
@@ -111,7 +111,7 @@
 
   external_delegate().DidAcceptSuggestion(
       test::CreateAutofillSuggestion(PopupItemId::kAddressEntry, u"first last",
-                                     Suggestion::BackendId(profile_a.guid())),
+                                     Suggestion::Guid(profile_a.guid())),
       AutofillPopupDelegate::SuggestionPosition{.row = 0},
       AutofillSuggestionTriggerSource::kUnspecified);
 
diff --git a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
index ab67235..75d9a94 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
+++ b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
@@ -1828,7 +1828,7 @@
 
     external_delegate().DidAcceptSuggestion(
         test::CreateAutofillSuggestion(PopupItemId::kCreditCardEntry, u"Test",
-                                       Suggestion::BackendId(kTestLocalCardId)),
+                                       Suggestion::Guid(kTestLocalCardId)),
         AutofillPopupDelegate::SuggestionPosition{.row = 0},
         AutofillSuggestionTriggerSource::kFormControlElementClicked);
 
@@ -1890,7 +1890,7 @@
 
     external_delegate().DidAcceptSuggestion(
         test::CreateAutofillSuggestion(PopupItemId::kCreditCardEntry, u"Test",
-                                       Suggestion::BackendId(kTestLocalCardId)),
+                                       Suggestion::Guid(kTestLocalCardId)),
         AutofillPopupDelegate::SuggestionPosition{.row = 0},
         AutofillSuggestionTriggerSource::kFormControlElementClicked);
 
@@ -2043,7 +2043,7 @@
 
     external_delegate().DidAcceptSuggestion(
         test::CreateAutofillSuggestion(PopupItemId::kCreditCardEntry, u"Test",
-                                       Suggestion::BackendId(kTestProfileId)),
+                                       Suggestion::Guid(kTestProfileId)),
         AutofillPopupDelegate::SuggestionPosition{.row = 0},
         AutofillSuggestionTriggerSource::kFormControlElementClicked);
 
diff --git a/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc b/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc
index a87110f..5b3d13f3 100644
--- a/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc
@@ -37,10 +37,8 @@
 namespace autofill {
 
 namespace {
-const Suggestion::Suggestion::BackendId kTestGuid =
-    Suggestion::Suggestion::BackendId("00000000-0000-0000-0000-000000000001");
-const Suggestion::Suggestion::BackendId kTestGuid2 =
-    Suggestion::Suggestion::BackendId("00000000-0000-0000-0000-000000000002");
+const char kTestGuid[] = "00000000-0000-0000-0000-000000000001";
+const char kTestGuid2[] = "00000000-0000-0000-0000-000000000002";
 const char kTestNumber[] = "4234567890123456";  // Visa
 const char kTestUrl[] = "http://www.example.com/";
 const char kTestUrlWithParam[] =
@@ -165,7 +163,7 @@
 
 // Verify that a card linked offer is returned for an eligible url.
 TEST_F(AutofillOfferManagerTest, GetCardLinkedOffersMap_EligibleCashback) {
-  CreditCard card = CreateCreditCard(kTestGuid.value());
+  CreditCard card = CreateCreditCard(kTestGuid);
   AutofillOfferData offer = CreateCreditCardOfferForCard(card, "5%");
   personal_data_manager_.AddAutofillOfferData(offer);
 
@@ -178,7 +176,7 @@
 
 // Verify that not expired offers are returned.
 TEST_F(AutofillOfferManagerTest, GetCardLinkedOffersMap_ExpiredOffer) {
-  CreditCard card = CreateCreditCard(kTestGuid.value());
+  CreditCard card = CreateCreditCard(kTestGuid);
   personal_data_manager_.AddAutofillOfferData(
       CreateCreditCardOfferForCard(card, "5%", /*expired=*/true));
 
@@ -189,7 +187,7 @@
 
 // Verify that not offers are returned for a mismatching URL.
 TEST_F(AutofillOfferManagerTest, GetCardLinkedOffersMap_WrongUrl) {
-  CreditCard card = CreateCreditCard(kTestGuid.value());
+  CreditCard card = CreateCreditCard(kTestGuid);
   personal_data_manager_.AddAutofillOfferData(
       CreateCreditCardOfferForCard(card, "5%"));
 
@@ -202,9 +200,8 @@
 // and no other types of offer (i.e. promo code offer or free listing coupon
 // offer).
 TEST_F(AutofillOfferManagerTest, GetCardLinkedOffersMap_OnlyCardLinkedOffers) {
-  CreditCard card1 = CreateCreditCard(kTestGuid.value(), kTestNumber, 100);
-  CreditCard card2 =
-      CreateCreditCard(kTestGuid2.value(), "4111111111111111", 101);
+  CreditCard card1 = CreateCreditCard(kTestGuid, kTestNumber, 100);
+  CreditCard card2 = CreateCreditCard(kTestGuid, "4111111111111111", 101);
 
   AutofillOfferData offer1 = CreateCreditCardOfferForCard(
       card1, "5%", /*expired=*/false,
@@ -230,9 +227,8 @@
 
 // Verify that URLs with card linked offers available are marked as eligible.
 TEST_F(AutofillOfferManagerTest, IsUrlEligible) {
-  CreditCard card1 = CreateCreditCard(kTestGuid.value(), kTestNumber, 100);
-  CreditCard card2 =
-      CreateCreditCard(kTestGuid2.value(), "4111111111111111", 101);
+  CreditCard card1 = CreateCreditCard(kTestGuid, kTestNumber, 100);
+  CreditCard card2 = CreateCreditCard(kTestGuid2, "4111111111111111", 101);
   personal_data_manager_.AddAutofillOfferData(CreateCreditCardOfferForCard(
       card1, "5%", /*expired=*/false,
       {GURL("http://www.google.com"), GURL("http://www.youtube.com")}));
@@ -263,7 +259,7 @@
 
 // Verify no offer is returned given a mismatch URL.
 TEST_F(AutofillOfferManagerTest, GetOfferForUrl_ReturnNothingWhenFindNoMatch) {
-  CreditCard card1 = CreateCreditCard(kTestGuid.value(), kTestNumber, 100);
+  CreditCard card1 = CreateCreditCard(kTestGuid, kTestNumber, 100);
   personal_data_manager_.AddAutofillOfferData(CreateCreditCardOfferForCard(
       card1, "5%", /*expired=*/false,
       {GURL("http://www.google.com"), GURL("http://www.youtube.com")}));
@@ -276,9 +272,8 @@
 // Verify the correct card linked offer is returned given an eligible URL.
 TEST_F(AutofillOfferManagerTest,
        GetOfferForUrl_ReturnCorrectOfferWhenFindMatch) {
-  CreditCard card1 = CreateCreditCard(kTestGuid.value(), kTestNumber, 100);
-  CreditCard card2 =
-      CreateCreditCard(kTestGuid2.value(), "4111111111111111", 101);
+  CreditCard card1 = CreateCreditCard(kTestGuid, kTestNumber, 100);
+  CreditCard card2 = CreateCreditCard(kTestGuid2, "4111111111111111", 101);
 
   AutofillOfferData offer1 = CreateCreditCardOfferForCard(
       card1, "5%", /*expired=*/false,
@@ -300,7 +295,7 @@
 TEST_F(AutofillOfferManagerTest, GetOfferForUrl_ReturnOfferFromCouponDelegate) {
   const GURL example_url("http://www.example.com");
   // Add card-linked offer to PersonalDataManager.
-  CreditCard card = CreateCreditCard(kTestGuid.value(), kTestNumber, 100);
+  CreditCard card = CreateCreditCard(kTestGuid, kTestNumber, 100);
   AutofillOfferData offer1 = CreateCreditCardOfferForCard(
       card, "5%", /*expired=*/false,
       /*merchant_origins=*/
diff --git a/components/autofill/core/browser/profile_token_quality.cc b/components/autofill/core/browser/profile_token_quality.cc
index 0cc306f..71ced2c 100644
--- a/components/autofill/core/browser/profile_token_quality.cc
+++ b/components/autofill/core/browser/profile_token_quality.cc
@@ -164,8 +164,7 @@
 
 // static
 bool ProfileTokenQuality::IsStoredType(ServerFieldType type) {
-  return base::Contains(AutofillTable::GetStoredTypesForAutofillProfile(),
-                        type);
+  return AutofillTable::GetStoredTypesForAutofillProfile().contains(type);
 }
 
 bool ProfileTokenQuality::AddObservationsForFilledForm(
diff --git a/components/autofill/core/browser/ui/suggestion.h b/components/autofill/core/browser/ui/suggestion.h
index 0952c1f..df230bad 100644
--- a/components/autofill/core/browser/ui/suggestion.h
+++ b/components/autofill/core/browser/ui/suggestion.h
@@ -25,7 +25,9 @@
 
 struct Suggestion {
   using IsLoading = base::StrongAlias<class IsLoadingTag, bool>;
-  using BackendId = base::StrongAlias<struct BackendIdTag, std::string>;
+  using Guid = base::StrongAlias<class GuidTag, std::string>;
+  using InstrumentId = base::StrongAlias<class InstrumentIdTag, uint64_t>;
+  using BackendId = absl::variant<Guid, InstrumentId>;
   using ValueToFill = base::StrongAlias<struct ValueToFill, std::u16string>;
   using Payload = absl::variant<BackendId, GURL, ValueToFill>;
 
@@ -126,6 +128,12 @@
     return absl::holds_alternative<T>(payload) ? absl::get<T>(payload) : T{};
   }
 
+  template <typename T>
+  T GetBackendId() const {
+    CHECK(absl::holds_alternative<BackendId>(payload));
+    return absl::get<T>(absl::get<BackendId>(payload));
+  }
+
 #if DCHECK_IS_ON()
   bool Invariant() const {
     switch (popup_item_id) {
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc
index 286ef43..4ab232a 100644
--- a/components/autofill/core/browser/webdata/autofill_table.cc
+++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -1147,9 +1147,8 @@
 }
 
 // static
-base::span<const ServerFieldType>
-AutofillTable::GetStoredTypesForAutofillProfile() {
-  static constexpr ServerFieldType stored_types[]{
+const ServerFieldTypeSet& AutofillTable::GetStoredTypesForAutofillProfile() {
+  static constexpr ServerFieldTypeSet stored_types{
       COMPANY_NAME,
       NAME_HONORIFIC_PREFIX,
       NAME_FIRST,
diff --git a/components/autofill/core/browser/webdata/autofill_table.h b/components/autofill/core/browser/webdata/autofill_table.h
index 1ef8e81..8e48ce1 100644
--- a/components/autofill/core/browser/webdata/autofill_table.h
+++ b/components/autofill/core/browser/webdata/autofill_table.h
@@ -12,7 +12,6 @@
 #include <string>
 #include <vector>
 
-#include "base/containers/span.h"
 #include "base/gtest_prod_util.h"
 #include "base/time/time.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
@@ -620,7 +619,7 @@
   // - Some supported types (like PHONE_HOME_CITY_CODE) are not stored.
   // - Some non-supported types are stored (usually types that don't have
   //   filling support yet).
-  static base::span<const ServerFieldType> GetStoredTypesForAutofillProfile();
+  static const ServerFieldTypeSet& GetStoredTypesForAutofillProfile();
 
   // WebDatabaseTable:
   WebDatabaseTable::TypeKey GetTypeKey() const override;
diff --git a/components/autofill/ios/browser/autofill_agent.mm b/components/autofill/ios/browser/autofill_agent.mm
index 4354562..2d09f80 100644
--- a/components/autofill/ios/browser/autofill_agent.mm
+++ b/components/autofill/ios/browser/autofill_agent.mm
@@ -474,8 +474,9 @@
       if (!suggestion.backendIdentifier.length) {
         autofill_suggestion.payload = autofill::Suggestion::BackendId();
       } else {
-        autofill_suggestion.payload = autofill::Suggestion::BackendId(
-            SysNSStringToUTF8(suggestion.backendIdentifier));
+        autofill_suggestion.payload =
+            autofill::Suggestion::BackendId(autofill::Suggestion::Guid(
+                SysNSStringToUTF8(suggestion.backendIdentifier)));
       }
 
       // On iOS, only a single trigger source exists. See crbug.com/1448447.
@@ -751,11 +752,11 @@
                 displayDescription:displayDescription
                               icon:icon
                        popupItemId:popup_suggestion.popup_item_id
-                 backendIdentifier:
-                     SysUTF8ToNSString(
-                         popup_suggestion
-                             .GetPayload<autofill::Suggestion::BackendId>()
-                             .value())
+                 backendIdentifier:SysUTF8ToNSString(
+                                       popup_suggestion
+                                           .GetBackendId<
+                                               autofill::Suggestion::Guid>()
+                                           .value())
                     requiresReauth:NO
         acceptanceA11yAnnouncement:acceptanceA11yAnnouncement];
 
diff --git a/components/autofill_payments_strings.grdp b/components/autofill_payments_strings.grdp
index 83d1770da..d29672e 100644
--- a/components/autofill_payments_strings.grdp
+++ b/components/autofill_payments_strings.grdp
@@ -957,6 +957,16 @@
     Cancel
   </message>
 
+  <!-- Autofill credit card delete dialog -->
+  <if expr="is_android">
+    <message name="IDS_AUTOFILL_CREDIT_CARD_DELETE_CONFIRMATION_TITLE" desc="Title for the confirmation dialog displayed when the user clicks on the delete button while editing card information." formatter_data="android_java">
+      Delete card
+    </message>
+    <message name="IDS_AUTOFILL_CREDIT_CARD_DELETE_CONFIRMATION_DESCRIPTION" desc="Description for the confirmation dialog displayed when the user clicks on the delete button while editing card information." formatter_data="android_java">
+      This payment method will be deleted from this device
+    </message>
+  </if>
+
   <!-- Autofill credit card preferences -->
   <if expr="is_android">
     <message name="IDS_AUTOFILL_EDIT_CREDIT_CARD" desc="Button that allows the user to edit a card that can be automatically filled into web page forms. This can be either credit, debit, or prepaid card. [CHAR_LIMIT=32]" formatter_data="android_java">
diff --git a/components/autofill_payments_strings_grdp/IDS_AUTOFILL_CREDIT_CARD_DELETE_CONFIRMATION_DESCRIPTION.png.sha1 b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_CREDIT_CARD_DELETE_CONFIRMATION_DESCRIPTION.png.sha1
new file mode 100644
index 0000000..8eccaa5
--- /dev/null
+++ b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_CREDIT_CARD_DELETE_CONFIRMATION_DESCRIPTION.png.sha1
@@ -0,0 +1 @@
+d2dc62ba3b34f4901fdaf0e67c5c36aef1dca3c6
\ No newline at end of file
diff --git a/components/autofill_payments_strings_grdp/IDS_AUTOFILL_CREDIT_CARD_DELETE_CONFIRMATION_TITLE.png.sha1 b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_CREDIT_CARD_DELETE_CONFIRMATION_TITLE.png.sha1
new file mode 100644
index 0000000..8eccaa5
--- /dev/null
+++ b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_CREDIT_CARD_DELETE_CONFIRMATION_TITLE.png.sha1
@@ -0,0 +1 @@
+d2dc62ba3b34f4901fdaf0e67c5c36aef1dca3c6
\ No newline at end of file
diff --git a/components/component_updater/BUILD.gn b/components/component_updater/BUILD.gn
index 422cb8f..13f683b 100644
--- a/components/component_updater/BUILD.gn
+++ b/components/component_updater/BUILD.gn
@@ -2,14 +2,20 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+static_library("component_updater_paths") {
+  sources = [
+    "component_updater_paths.cc",
+    "component_updater_paths.h",
+  ]
+  deps = [ "//base" ]
+}
+
 static_library("component_updater") {
   sources = [
     "component_installer.cc",
     "component_installer.h",
     "component_updater_command_line_config_policy.cc",
     "component_updater_command_line_config_policy.h",
-    "component_updater_paths.cc",
-    "component_updater_paths.h",
     "component_updater_service.cc",
     "component_updater_service.h",
     "component_updater_service_internal.h",
@@ -32,6 +38,8 @@
     "url_param_filter_remover.h",
   ]
 
+  public_deps = [ ":component_updater_paths" ]
+
   deps = [
     "//base",
     "//build:chromeos_buildflags",
diff --git a/components/cronet/BUILD.gn b/components/cronet/BUILD.gn
index a5a8c14..91e71456 100644
--- a/components/cronet/BUILD.gn
+++ b/components/cronet/BUILD.gn
@@ -94,16 +94,11 @@
 
 # For platforms on which the native Cronet library is used, build the library,
 # a cronet_tests binary that exercises it, and a unit-tests binary.
-# Android and iOS have their own platform-specific rules to build Cronet.
 if (is_android) {
   group("cronet_package") {
     testonly = true
     deps = [ "//components/cronet/android:cronet_package_android" ]
   }
-} else if (is_ios) {
-  group("cronet_package") {
-    deps = [ "//components/cronet/ios:cronet_package_ios" ]
-  }
 } else {
   config("shared_library_public_config") {
     if (is_mac && !is_component_build) {
diff --git a/components/cronet/README.md b/components/cronet/README.md
index dfd4283..89ce20e3 100644
--- a/components/cronet/README.md
+++ b/components/cronet/README.md
@@ -1,11 +1,14 @@
 # Quick Start Guide to Using Cronet
 Cronet is the networking stack of Chromium put into a library for use on
-mobile. This is the same networking stack that is used in the Chrome browser
+Android. This is the same networking stack that is used in the Chrome browser
 by over a billion people. It offers an easy-to-use, high performance,
-standards-compliant, and secure way to perform HTTP requests. Cronet has support
-for both Android and iOS. On Android, Cronet offers its own Java asynchronous
-API as well as support for the [java.net.HttpURLConnection] API.
-This document gives a brief introduction to using these two Java APIs.
+standards-compliant, and secure way to perform HTTP requests.Cronet offers its
+own Java asynchronous API as well as support for the
+[java.net.HttpURLConnection] API. This document gives a brief introduction to
+using these two Java APIs.
+
+*Cronet dropped its best-effort iOS implementation as of version M108. QUIC is
+available natively in iOS 15+.*
 
 For instructions on checking out and building Cronet see
 [Cronet build instructions](build_instructions.md).
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn
index d06dad3d..b6fc26b 100644
--- a/components/cronet/android/BUILD.gn
+++ b/components/cronet/android/BUILD.gn
@@ -1605,7 +1605,7 @@
     "license_file",
     rebase_path(_license_path, root_build_dir),
     "--gn-target",
-    "//components/cronet/android:cronet",
+    "//components/cronet/android:cronet_non_test_package",
     "--gn-out-dir",
     ".",
   ]
@@ -1869,27 +1869,19 @@
   deps = [ ":cronet" ]
 }
 
-group("cronet_package_android") {
-  # Marked as testonly as it contains test-only targets too.
-  testonly = true
-
+group("cronet_non_test_package") {
+  # Target containing all of cronet's non-test targets.
   # Enforce building with ICU alternatives, crbug.com/611621.
   # Enforce that arm_use_neon==false when building for ARMv7 by
   # not including any deps in cronet_package target otherwise.
   if (use_platform_icu_alternatives &&
       (!(target_cpu == "arm" && arm_version == 7) || !arm_use_neon)) {
     deps = [
-      ":api_static_checks",
       ":cronet_package_copy",
       ":cronet_package_copy_native_headers",
       ":cronet_package_copy_native_lib",
       ":cronet_package_copy_native_lib_unstripped",
       ":cronet_package_copy_resources",
-      ":cronet_sizes",
-      ":cronet_test_package",
-      ":dependencies_checks",
-      ":generate_javadoc",
-      ":generate_licenses",
       ":jar_cronet_api_source",
       ":jar_cronet_impl_common_java_source",
       ":jar_cronet_impl_fake_java_source",
@@ -1910,6 +1902,37 @@
   }
 }
 
+group("cronet_test_package") {
+  # Target containing all of cronet's test targets.
+  testonly = true
+
+  # Don't build for MIPS where tests aren't run.
+  if (current_cpu != "mipsel" && current_cpu != "mips64el") {
+    deps = [
+      ":cronet_package_copy_native_test_lib",
+      ":cronet_package_copy_native_test_lib_unstripped",
+      ":cronet_package_copy_test_assets",
+      ":cronet_package_copy_test_files",
+      ":cronet_package_copy_test_support_apks",
+      ":cronet_sizes",
+      ":repackage_test_jars",
+    ]
+  }
+}
+
+group("cronet_package_android") {
+  # Target containing all of cronet's targets both test and non-test ones.
+  # Marked as testonly as it contains test-only targets too.
+  testonly = true
+  deps = [
+    ":cronet_non_test_package",
+    ":cronet_test_package",
+    ":dependencies_checks",
+    ":generate_javadoc",
+    ":generate_licenses",
+  ]
+}
+
 group("cronet_android_mainline") {
   # Target for android mainline which removed unnecessary deps from
   # "cronet_package_android"
@@ -1931,19 +1954,3 @@
     }
   }
 }
-
-group("cronet_test_package") {
-  testonly = true
-
-  # Don't build for MIPS where tests aren't run.
-  if (current_cpu != "mipsel" && current_cpu != "mips64el") {
-    deps = [
-      ":cronet_package_copy_native_test_lib",
-      ":cronet_package_copy_native_test_lib_unstripped",
-      ":cronet_package_copy_test_assets",
-      ":cronet_package_copy_test_files",
-      ":cronet_package_copy_test_support_apks",
-      ":repackage_test_jars",
-    ]
-  }
-}
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetURLStreamHandlerFactoryTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetURLStreamHandlerFactoryTest.java
index 432b1ff..549fdc8 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetURLStreamHandlerFactoryTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetURLStreamHandlerFactoryTest.java
@@ -8,6 +8,8 @@
 
 import static org.junit.Assert.assertThrows;
 
+import android.os.Build;
+
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
@@ -20,8 +22,10 @@
 import org.chromium.net.CronetTestRule;
 import org.chromium.net.CronetTestRule.CronetImplementation;
 import org.chromium.net.CronetTestRule.IgnoreFor;
+import org.chromium.net.CronetTestRule.RequiresMinAndroidApi;
 import org.chromium.net.NativeTestServer;
 
+import java.net.HttpURLConnection;
 import java.net.URL;
 
 /** Test for CronetURLStreamHandlerFactory. */
@@ -34,7 +38,7 @@
 public class CronetURLStreamHandlerFactoryTest {
     @Rule public final CronetTestRule mTestRule = CronetTestRule.withAutomaticEngineStartup();
 
-    private CronetHttpURLConnection mUrlConnection;
+    private HttpURLConnection mUrlConnection;
 
     @After
     public void tearDown() {
@@ -53,14 +57,7 @@
         assertThat(e).hasMessageThat().isEqualTo("CronetEngine is null.");
     }
 
-    @Test
-    @SmallTest
-    @IgnoreFor(
-            implementations = {CronetImplementation.AOSP_PLATFORM},
-            reason =
-                    "crbug.com/1494845: setURLStreamHandlerFactory fails with 'factory already"
-                            + " defined'")
-    public void testSetUrlStreamFactoryUsesCronet() throws Exception {
+    public void internalSetUrlStreamFactoryUsesCronet() throws Exception {
         assertThat(
                         NativeTestServer.startNativeTestServer(
                                 mTestRule.getTestFramework().getContext()))
@@ -69,9 +66,34 @@
         URL.setURLStreamHandlerFactory(
                 mTestRule.getTestFramework().getEngine().createURLStreamHandlerFactory());
         URL url = new URL(NativeTestServer.getEchoMethodURL());
-        mUrlConnection = (CronetHttpURLConnection) url.openConnection();
+        mUrlConnection = (HttpURLConnection) url.openConnection();
         assertThat(mUrlConnection.getResponseCode()).isEqualTo(200);
         assertThat(mUrlConnection.getResponseMessage()).isEqualTo("OK");
         assertThat(TestUtil.getResponseAsString(mUrlConnection)).isEqualTo("GET");
     }
+
+    @Test
+    @SmallTest
+    @IgnoreFor(
+            implementations = {CronetImplementation.AOSP_PLATFORM},
+            reason =
+                    "URL#setURLStreamHandlerFactory can be called at most once during JVM lifetime."
+                        + " Running against both impls through CronetTestRule would violate that."
+                        + " Instead duplicate the test targets")
+    public void testSetUrlStreamFactoryUsesCronetForNative() throws Exception {
+        internalSetUrlStreamFactoryUsesCronet();
+    }
+
+    @Test
+    @SmallTest
+    @IgnoreFor(
+            implementations = {CronetImplementation.STATICALLY_LINKED},
+            reason =
+                    "URL#setURLStreamHandlerFactory can be called at most once during JVM lifetime."
+                        + " Running against both impls through CronetTestRule would violate that."
+                        + " Instead duplicate the test targets")
+    @RequiresMinAndroidApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+    public void testSetUrlStreamFactoryUsesCronetForHttpEngine() throws Exception {
+        internalSetUrlStreamFactoryUsesCronet();
+    }
 }
diff --git a/components/cronet/build_instructions.md b/components/cronet/build_instructions.md
index cd1e5aa5..0e2c7b5 100644
--- a/components/cronet/build_instructions.md
+++ b/components/cronet/build_instructions.md
@@ -15,14 +15,13 @@
 First, `gn` is used to create ninja files targeting the intended platform, then
 `ninja` executes the ninja files to run the build.
 
-### Android / iOS builds
+### Android builds
 
 ```shell
 $ ./components/cronet/tools/cr_cronet.py gn --out_dir=out/Cronet
 ```
 
-If the build host is Linux, Android binaries will be built. If the build host is
-macOS, iOS binaries will be built.
+Android binaries will be built irrespective of the platform.
 
 Note: these commands clobber output of previously executed gn commands in
 `out/Cronet`. If `--out_dir` is left out, the output directory defaults to
diff --git a/components/cronet/cronet_global_state.h b/components/cronet/cronet_global_state.h
index 327a6cb..3bd6201d 100644
--- a/components/cronet/cronet_global_state.h
+++ b/components/cronet/cronet_global_state.h
@@ -54,8 +54,8 @@
 std::string CreateDefaultUserAgent(const std::string& partial_user_agent);
 
 // Set network thread priority to |priority|. Must be called on the network
-// thread. On Android, corresponds to android.os.Process.setThreadPriority()
-// values. On iOS, corresponds to NSThread::setThreadPriority values.
+// thread. Corresponds to android.os.Process.setThreadPriority()
+// values.
 void SetNetworkThreadPriorityOnNetworkThread(double priority);
 
 }  // namespace cronet
diff --git a/components/cronet/cronet_url_request.cc b/components/cronet/cronet_url_request.cc
index fe071b11..c599df3 100644
--- a/components/cronet/cronet_url_request.cc
+++ b/components/cronet/cronet_url_request.cc
@@ -43,7 +43,10 @@
   if (!info.proxy_chain.IsValid() || info.proxy_chain.is_direct()) {
     return net::HostPortPair().ToString();
   }
-  return info.proxy_chain.proxy_server().host_port_pair().ToString();
+  CHECK(info.proxy_chain.is_single_proxy());
+  return info.proxy_chain.GetProxyServer(/*chain_index=*/0)
+      .host_port_pair()
+      .ToString();
 }
 
 int CalculateLoadFlags(int load_flags,
diff --git a/components/cronet/ios/BUILD.gn b/components/cronet/ios/BUILD.gn
deleted file mode 100644
index 9054b74..0000000
--- a/components/cronet/ios/BUILD.gn
+++ /dev/null
@@ -1,341 +0,0 @@
-# Copyright 2015 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/apple/tweak_info_plist.gni")
-import("//build/config/apple/symbols.gni")
-import("//build/config/c++/c++.gni")
-import("//build/config/ios/ios_sdk.gni")
-import("//build/util/lastchange.gni")
-import("//components/cronet/native/include/headers.gni")
-import("//components/grpc_support/include/headers.gni")
-import("//testing/test.gni")
-import("//url/features.gni")
-
-assert(!is_component_build, "Cronet requires static library build.")
-
-group("cronet_consumer_group") {
-  deps = [ "//components/cronet/ios/cronet_consumer" ]
-}
-
-# TODO(crbug.com/1238839): Remove this once deprecated APIs are unused.
-config("disable_deprecated_errors") {
-  cflags = [
-    "-Wno-deprecated",
-    "-Wno-deprecated-declarations",
-  ]
-}
-
-config("cronet_include_config") {
-  include_dirs = [ "//components/grpc_support/include" ]
-}
-
-config("cronet_static_config") {
-  frameworks = [
-    "Cronet.framework",
-    "CoreTelephony.framework",
-    "UIKit.framework",
-    "CFNetwork.framework",
-    "MobileCoreServices.framework",
-    "Security.framework",
-    "SystemConfiguration.framework",
-  ]
-  libs = [ "resolv" ]
-  configs = [ ":cronet_include_config" ]
-}
-
-_cronet_deps = [
-  ":generate_accept_languages",
-  "//base:base",
-  "//components/cronet:cronet_buildflags",
-  "//components/cronet:cronet_common",
-  "//components/cronet:cronet_version_header",
-  "//components/cronet/native:cronet_native_impl",
-  "//components/grpc_support",
-  "//components/prefs:prefs",
-  "//ios/net",
-  "//ios/net:network_protocol",
-  "//ios/web/common:user_agent",
-  "//ios/web/init:global_state",
-  "//ios/web/public/init:global_state",
-  "//net",
-  "//url",
-]
-
-_cronet_sources = [
-  "Cronet.h",
-  "Cronet.mm",
-  "cronet_environment.h",
-  "cronet_environment.mm",
-  "cronet_global_state_ios.mm",
-  "cronet_metrics.h",
-  "cronet_metrics.mm",
-]
-
-_cronet_public_headers = [ "Cronet.h" ]
-_cronet_public_headers += grpc_public_headers
-_cronet_public_headers += cronet_native_public_headers
-
-source_set("cronet_sources") {
-  deps = _cronet_deps
-
-  sources = _cronet_sources
-
-  include_dirs = [ "//components/grpc_support/include" ]
-
-  if (!use_platform_icu_alternatives) {
-    deps += [ "//base:i18n" ]
-  }
-
-  configs += [ ":disable_deprecated_errors" ]
-}
-
-source_set("cronet_sources_with_global_state") {
-  deps = [
-    "//base",
-    "//ios/web/init:global_state",
-    "//ios/web/public/init:global_state",
-  ]
-
-  public_deps = [ ":cronet_sources" ]
-
-  sources = [ "ios_global_state_configuration.cc" ]
-}
-
-# Tweak |info_plist| with current version and revision.
-tweak_info_plist("tweak_cronet_plist") {
-  info_plist = "Info.plist"
-}
-
-ios_framework_bundle("cronet_framework") {
-  output_name = "Cronet"
-  info_plist_target = ":tweak_cronet_plist"
-
-  deps = [
-    ":cronet_sources_with_global_state",
-    "//base",
-    "//net:net",
-  ]
-
-  frameworks = [ "UIKit.framework" ]
-
-  public_deps = [ "//components/grpc_support:headers" ]
-
-  public_headers = _cronet_public_headers
-
-  sources = [ "Cronet.h" ]
-
-  configs -= [ "//build/config/compiler:default_symbols" ]
-  configs += [ "//build/config/compiler:symbols" ]
-
-  public_configs = [ ":cronet_include_config" ]
-}
-
-test("cronet_unittests_ios") {
-  testonly = true
-
-  sources = [ "../run_all_unittests.cc" ]
-
-  deps = [
-    ":cronet_sources_with_global_state",
-    "//base",
-    "//base/test:test_support",
-    "//components/cronet:cronet_common_unittests",
-    "//components/cronet/native:cronet_native_unittests",
-    "//net",
-    "//testing/gtest",
-  ]
-
-  bundle_deps = [ "//components/cronet/ios/test:cronet_test" ]
-}
-
-action("generate_accept_languages") {
-  script = "//components/cronet/tools/generate_accept_languages.py"
-  args = [
-    rebase_path("$target_gen_dir"),
-    rebase_path("//"),
-  ]
-  outputs = [ "$target_gen_dir/accept_languages_table.h" ]
-}
-
-# A static library which contains just _cronet_sources.
-static_library("cronet_static") {
-  visibility = [ ":*" ]
-  deps = _cronet_deps
-  sources = _cronet_sources + [ "ios_global_state_configuration.cc" ]
-  public_configs = [ ":cronet_include_config" ]
-  public_deps = [ "//components/grpc_support" ]
-}
-
-# A static library which contains all dependencies of :cronet_static.
-static_library("cronet_deps_complete") {
-  visibility = [ ":*" ]
-  complete_static_lib = true
-  configs -= [ "//build/config/compiler:thin_archive" ]
-  deps = [ ":cronet_static" ]
-
-  if (use_custom_libcxx) {
-    deps += [
-      # Add shared_library_deps to include custom libc++ into dependencies.
-      # They are by default only added to executable(), loadable_module(), and
-      # shared_library() targets, but cronet_static_complete library needs it as well to
-      # avoid linking with different versions of libc++.
-      "//build/config:shared_library_deps",
-    ]
-  }
-}
-
-# A static library which contains cronet and all dependendencies hidden inside.
-action("cronet_static_complete") {
-  visibility = [ ":*" ]
-  script = "//components/cronet/tools/hide_symbols.py"
-  deps = [
-    ":cronet_deps_complete",
-    ":cronet_static",
-  ]
-  outputs = [ "$target_out_dir/cronet_static_complete.a" ]
-  args = [
-    "--input_libs",
-    rebase_path("$target_out_dir/libcronet_static.a", root_build_dir),
-    "--deps_lib",
-    rebase_path("$target_out_dir/libcronet_deps_complete.a", root_build_dir),
-    "--output_obj",
-    rebase_path("$target_out_dir/cronet_static_complete.o", root_build_dir),
-    "--output_lib",
-    rebase_path("$target_out_dir/cronet_static_complete.a", root_build_dir),
-    "--current_cpu",
-    current_cpu,
-  ]
-  if (use_custom_libcxx) {
-    args += [ "--use_custom_libcxx" ]
-  }
-
-  public_configs = [ ":cronet_static_config" ]
-}
-
-# A fat static library which exports cronet public symbols and hides all
-# dependendencies.
-template("ios_static_framework") {
-  _target_name = target_name
-  _output_name = target_name
-  if (defined(invoker.output_name)) {
-    _output_name = invoker.output_name
-  }
-  _framework_name = target_name
-  if (defined(invoker.framework_name)) {
-    _framework_name = invoker.framework_name
-  }
-
-  _framework_headers_target = _target_name + "_framework_headers"
-  bundle_data(_framework_headers_target) {
-    visibility = [ ":$_target_name" ]
-    sources = invoker.public_headers
-    outputs = [ "{{bundle_contents_dir}}/Headers/{{source_file_part}}" ]
-  }
-
-  _framework_binary_target = _target_name + "_framework_binary"
-  _static_library_target = invoker.static_library_target
-
-  bundle_data(_framework_binary_target) {
-    visibility = [ ":$_target_name" ]
-    sources = get_target_outputs(_static_library_target)
-    outputs = [ "{{bundle_executable_dir}}/$_framework_name" ]
-    public_deps = [ _static_library_target ]
-  }
-
-  create_bundle(_target_name) {
-    product_type = "com.apple.product-type.framework"
-    bundle_root_dir = "$root_out_dir/Static/${_output_name}"
-    bundle_contents_dir = bundle_root_dir
-    bundle_executable_dir = bundle_contents_dir
-    bundle_resources_dir = bundle_contents_dir
-    deps = [
-      ":$_framework_binary_target",
-      ":$_framework_headers_target",
-    ]
-    public_configs = invoker.public_configs
-  }
-}
-
-ios_static_framework("cronet_static_framework") {
-  output_name = "Cronet.framework"
-  framework_name = "Cronet"
-  public_headers = _cronet_public_headers
-  static_library_target = ":cronet_static_complete"
-  public_configs = [ ":cronet_static_config" ]
-}
-
-_package_dir = "$root_out_dir/cronet"
-
-action("generate_license") {
-  _license_path = "$_package_dir/LICENSE"
-
-  script = "//tools/licenses/licenses.py"
-  inputs = [ lastchange_file ]
-  outputs = [ _license_path ]
-  args = [
-    "license_file",
-    rebase_path(_license_path, root_build_dir),
-    "--gn-target",
-    "//components/cronet/ios:cronet_framework",
-    "--gn-out-dir",
-    ".",
-    "--target-os",
-    "ios",
-  ]
-}
-
-copy("cronet_static_copy") {
-  sources = [ "$root_out_dir/Static/Cronet.framework" ]
-  outputs = [ "$_package_dir/Static/Cronet.framework" ]
-
-  deps = [ ":cronet_static_framework" ]
-}
-
-copy("cronet_package_copy") {
-  sources = [
-    "$root_out_dir/Cronet.framework",
-    "//AUTHORS",
-    "//chrome/VERSION",
-  ]
-  outputs = [ "$_package_dir/{{source_file_part}}" ]
-
-  deps = [
-    ":cronet_framework",
-    ":cronet_static_copy",
-  ]
-}
-
-if (enable_dsyms) {
-  action("cronet_dsym_archive") {
-    script = "//chrome/tools/build/mac/archive_symbols.py"
-
-    # These are the dSYMs that will be archived. The sources list must be
-    # the target outputs that correspond to the dSYMs (since a dSYM is a
-    # directory it cannot be listed as a source file). The targets that
-    # generate both the dSYM and binary image are listed in deps.
-    _dsyms = [ "$root_out_dir/Cronet.dSYM" ]
-
-    sources = [ "$root_out_dir/Cronet.framework" ]
-
-    _output = "$_package_dir/Cronet.dSYM.tar.bz2"
-
-    outputs = [ _output ]
-
-    args = [ rebase_path(_output, root_out_dir) ] +
-           rebase_path(_dsyms, root_out_dir)
-
-    deps = [ ":cronet_framework" ]
-  }
-} else {
-  group("cronet_dsym_archive") {
-  }
-}
-
-group("cronet_package_ios") {
-  deps = [
-    ":cronet_dsym_archive",
-    ":cronet_package_copy",
-    ":generate_license",
-  ]
-}
diff --git a/components/cronet/ios/Cronet.h b/components/cronet/ios/Cronet.h
deleted file mode 100644
index b315bad..0000000
--- a/components/cronet/ios/Cronet.h
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2016 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_CRONET_IOS_CRONET_H_
-#define COMPONENTS_CRONET_IOS_CRONET_H_
-
-#import <Foundation/Foundation.h>
-
-#include "bidirectional_stream_c.h"
-#include "cronet.idl_c.h"
-#include "cronet_c.h"
-#include "cronet_export.h"
-
-// Type of HTTP cache; public interface to private implementation defined in
-// URLRequestContextConfig class.
-typedef NS_ENUM(NSInteger, CRNHttpCacheType) {
-  // Disabled HTTP cache.  Some data may still be temporarily stored in memory.
-  CRNHttpCacheTypeDisabled,
-  // Enable on-disk HTTP cache, including HTTP data.
-  CRNHttpCacheTypeDisk,
-  // Enable in-memory cache, including HTTP data.
-  CRNHttpCacheTypeMemory,
-};
-
-/// Cronet error domain name.
-FOUNDATION_EXPORT GRPC_SUPPORT_EXPORT NSString* const CRNCronetErrorDomain;
-
-/// Enum of Cronet NSError codes.
-NS_ENUM(NSInteger){
-    CRNErrorInvalidArgument = 1001, CRNErrorUnsupportedConfig = 1002,
-};
-
-/// The corresponding value is a String object that contains the name of
-/// an invalid argument inside the NSError userInfo dictionary.
-FOUNDATION_EXPORT GRPC_SUPPORT_EXPORT NSString* const CRNInvalidArgumentKey;
-
-// A block, that takes a request, and returns YES if the request should
-// be handled.
-typedef BOOL (^RequestFilterBlock)(NSURLRequest* request);
-
-// Interface for installing Cronet.
-// TODO(gcasto): Should this macro be separate from the one defined in
-// bidirectional_stream_c.h?
-GRPC_SUPPORT_EXPORT
-@interface Cronet : NSObject
-
-// Sets the HTTP Accept-Language header.  This method only has any effect before
-// |start| is called.
-+ (void)setAcceptLanguages:(NSString*)acceptLanguages;
-
-// Sets whether HTTP/2 should be supported by CronetEngine. This method only has
-// any effect before |start| is called.
-+ (void)setHttp2Enabled:(BOOL)http2Enabled;
-
-// Sets whether QUIC should be supported by CronetEngine. This method only has
-// any effect before |start| is called.
-+ (void)setQuicEnabled:(BOOL)quicEnabled;
-
-// Sets whether Brotli should be supported by CronetEngine. This method only has
-// any effect before |start| is called.
-+ (void)setBrotliEnabled:(BOOL)brotliEnabled;
-
-// Sets whether Metrics should be collected by CronetEngine. This method only
-// has any effect before |start| is called.
-+ (void)setMetricsEnabled:(BOOL)metricsEnabled;
-
-// Set HTTP Cache type to be used by CronetEngine.  This method only has any
-// effect before |start| is called.  See HttpCacheType enum for available
-// options.
-+ (void)setHttpCacheType:(CRNHttpCacheType)httpCacheType;
-
-// Adds hint that host supports QUIC on altPort. This method only has any effect
-// before |start| is called.  Returns NO if it fails to add hint (because the
-// host is invalid).
-+ (BOOL)addQuicHint:(NSString*)host port:(int)port altPort:(int)altPort;
-
-// Set experimental Cronet options.  Argument is a JSON string; see
-// |URLRequestContextConfig| for more details.  This method only has
-// any effect before |start| is called.
-+ (void)setExperimentalOptions:(NSString*)experimentalOptions;
-
-// Sets the User-Agent request header string to be sent with all requests.
-// If |partial| is set to YES, then actual user agent value is based on device
-// model, OS version, and |userAgent| argument. For example "Foo/3.0.0.0" is
-// sent as "Mozilla/5.0 (iPhone; CPU iPhone OS 9_3 like Mac OS X)
-// AppleWebKit/601.1 (KHTML, like Gecko) Foo/3.0.0.0 Mobile/15G31
-// Safari/601.1.46".
-// If |partial| is set to NO, then |userAgent| value is complete value sent to
-// the remote. For Example: "Foo/3.0.0.0" is sent as "Foo/3.0.0.0".
-//
-// This method only has any effect before |start| is called.
-+ (void)setUserAgent:(NSString*)userAgent partial:(BOOL)partial;
-
-// Sets SSLKEYLogFileName to export SSL key for Wireshark decryption of packet
-// captures. This method only has any effect before |start| is called.
-+ (void)setSslKeyLogFileName:(NSString*)sslKeyLogFileName;
-
-/// Pins a set of public keys for a given host. This method only has any effect
-/// before |start| is called. By pinning a set of public keys, |pinHashes|,
-/// communication with |host| is required to authenticate with a certificate
-/// with a public key from the set of pinned ones.
-/// An app can pin the public key of the root certificate, any of the
-/// intermediate certificates or the end-entry certificate. Authentication will
-/// fail and secure communication will not be established if none of the public
-/// keys is present in the host's certificate chain, even if the host attempts
-/// to authenticate with a certificate allowed by the device's trusted store of
-/// certificates.
-///
-/// Calling this method multiple times with the same host name overrides the
-/// previously set pins for the host.
-///
-/// More information about the public key pinning can be found in
-/// [RFC 7469](https://tools.ietf.org/html/rfc7469).
-///
-/// @param host name of the host to which the public keys should be pinned.
-///             A host that consists only of digits and the dot character
-///             is treated as invalid.
-/// @param pinHashes a set of pins. Each pin is the SHA-256 cryptographic
-///                  hash of the DER-encoded ASN.1 representation of the
-///                  Subject Public Key Info (SPKI) of the host's X.509
-///                  certificate. Although, the method does not mandate the
-///                  presence of the backup pin that can be used if the control
-///                  of the primary private key has been lost, it is highly
-///                  recommended to supply one.
-/// @param includeSubdomains indicates whether the pinning policy should be
-///                          applied to subdomains of |host|.
-/// @param expirationDate specifies the expiration date for the pins.
-/// @param outError on return, if the pin cannot be added, a pointer to an
-///                 error object that encapsulates the reason for the error.
-/// @return returns |YES| if the pins were added successfully; |NO|, otherwise.
-+ (BOOL)addPublicKeyPinsForHost:(NSString*)host
-                      pinHashes:(NSSet<NSData*>*)pinHashes
-              includeSubdomains:(BOOL)includeSubdomains
-                 expirationDate:(NSDate*)expirationDate
-                          error:(NSError**)outError;
-
-// Sets the block used to determine whether or not Cronet should handle the
-// request. If the block is not set, Cronet will handle all requests. Cronet
-// retains strong reference to the block, which can be released by calling this
-// method with nil block.
-+ (void)setRequestFilterBlock:(RequestFilterBlock)block;
-
-// Starts CronetEngine. It is recommended to call this method on the application
-// main thread. If the method is called on any thread other than the main one,
-// the method will internally try to execute synchronously using the main GCD
-// queue. Please make sure that the main thread is not blocked by a job
-// that calls this method; otherwise, a deadlock can occur.
-+ (void)start;
-
-// Registers Cronet as HttpProtocol Handler. Once registered, Cronet intercepts
-// and handles all requests made through NSURLConnection and shared
-// NSURLSession.
-// This method must be called after |start|.
-+ (void)registerHttpProtocolHandler;
-
-// Unregister Cronet as HttpProtocol Handler. This means that Cronet will stop
-// intercepting requests, however, it won't tear down the Cronet environment.
-// This method must be called after |start|.
-+ (void)unregisterHttpProtocolHandler;
-
-// Installs Cronet into NSURLSessionConfiguration so that all
-// NSURLSessions created with this configuration will use the Cronet stack.
-// Note that all Cronet settings are global and are shared between
-// all NSURLSessions & NSURLConnections that use the Cronet stack.
-// This method must be called after |start|.
-+ (void)installIntoSessionConfiguration:(NSURLSessionConfiguration*)config;
-
-// Returns the absolute path that startNetLogToFile:fileName will actually
-// write to.
-+ (NSString*)getNetLogPathForFile:(NSString*)fileName;
-
-// Starts net-internals logging to a file named |fileName|. Where fileName is
-// relative to the application documents directory. |fileName| must not be
-// empty. Log level is determined by |logBytes| - if YES then LOG_ALL otherwise
-// LOG_ALL_BUT_BYTES. If the file exists it is truncated before starting. If
-// actively logging the call is ignored.
-+ (BOOL)startNetLogToFile:(NSString*)fileName logBytes:(BOOL)logBytes;
-
-// Stop net-internals logging and flush file to disk. If a logging session is
-// not in progress this call is ignored.
-+ (void)stopNetLog;
-
-// Returns the full user-agent that will be used unless it is overridden on the
-// NSURLRequest used.
-+ (NSString*)getUserAgent;
-
-// Sets priority of the network thread. The |priority| should be a
-// floating point number between 0.0 to 1.0, where 1.0 is highest priority.
-// This method can be called multiple times before or after |start| method.
-+ (void)setNetworkThreadPriority:(double)priority;
-
-// Get a pointer to global instance of cronet_engine for GRPC C API.
-+ (stream_engine*)getGlobalEngine;
-
-// Returns differences in metrics collected by Cronet since the last call to
-// getGlobalMetricsDeltas, serialized as a [protobuf]
-// (https://developers.google.com/protocol-buffers).
-//
-// Cronet starts collecting these metrics after the first call to
-// getGlobalMetricsDeltras, so the first call returns no
-// useful data as no metrics have yet been collected.
-+ (NSData*)getGlobalMetricsDeltas;
-
-// Sets Host Resolver Rules for testing.
-// This method must be called after |start| has been called.
-+ (void)setHostResolverRulesForTesting:(NSString*)hostResolverRulesForTesting;
-
-// Enables TestCertVerifier which accepts all certificates for testing.
-// This method only has any effect before |start| is called.
-+ (void)enableTestCertVerifierForTesting;
-
-@end
-
-#endif  // COMPONENTS_CRONET_IOS_CRONET_H_
diff --git a/components/cronet/ios/Cronet.mm b/components/cronet/ios/Cronet.mm
deleted file mode 100644
index 337b761..0000000
--- a/components/cronet/ios/Cronet.mm
+++ /dev/null
@@ -1,570 +0,0 @@
-// Copyright 2016 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "components/cronet/ios/Cronet.h"
-
-#include <memory>
-#include <vector>
-
-#include "base/apple/bundle_locations.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/strings/sys_string_conversions.h"
-#include "base/synchronization/lock.h"
-#import "base/task/single_thread_task_runner.h"
-#include "components/cronet/cronet_global_state.h"
-#include "components/cronet/ios/accept_languages_table.h"
-#include "components/cronet/ios/cronet_environment.h"
-#include "components/cronet/ios/cronet_metrics.h"
-#include "components/cronet/native/url_request.h"
-#include "components/cronet/url_request_context_config.h"
-#include "ios/net/crn_http_protocol_handler.h"
-#include "ios/net/empty_nsurlcache.h"
-#include "net/base/url_util.h"
-#include "net/cert/cert_verifier.h"
-#include "net/url_request/url_request_context_getter.h"
-
-// Cronet NSError constants.
-NSString* const CRNCronetErrorDomain = @"CRNCronetErrorDomain";
-NSString* const CRNInvalidArgumentKey = @"CRNInvalidArgumentKey";
-
-namespace {
-
-class CronetHttpProtocolHandlerDelegate;
-
-using QuicHintVector =
-    std::vector<std::unique_ptr<cronet::URLRequestContextConfig::QuicHint>>;
-// Currently there is one and only one instance of CronetEnvironment,
-// which is leaked at the shutdown. We should consider allowing multiple
-// instances if that makes sense in the future.
-base::LazyInstance<std::unique_ptr<cronet::CronetEnvironment>>::Leaky
-    gChromeNet = LAZY_INSTANCE_INITIALIZER;
-
-base::LazyInstance<std::unique_ptr<CronetHttpProtocolHandlerDelegate>>::Leaky
-    gHttpProtocolHandlerDelegate = LAZY_INSTANCE_INITIALIZER;
-
-base::LazyInstance<std::unique_ptr<cronet::CronetMetricsDelegate>>::Leaky
-    gMetricsDelegate = LAZY_INSTANCE_INITIALIZER;
-
-// See [Cronet initialize] method to set the default values of the global
-// variables.
-BOOL gHttp2Enabled;
-BOOL gQuicEnabled;
-BOOL gBrotliEnabled;
-BOOL gMetricsEnabled;
-cronet::URLRequestContextConfig::HttpCacheType gHttpCache;
-QuicHintVector gQuicHints;
-NSString* gExperimentalOptions;
-NSString* gUserAgent;
-BOOL gUserAgentPartial;
-double gNetworkThreadPriority;
-NSString* gSslKeyLogFileName;
-std::vector<std::unique_ptr<cronet::URLRequestContextConfig::Pkp>> gPkpList;
-RequestFilterBlock gRequestFilterBlock;
-NSURLCache* gPreservedSharedURLCache;
-BOOL gEnableTestCertVerifierForTesting;
-std::unique_ptr<net::CertVerifier> gMockCertVerifier;
-NSString* gAcceptLanguages;
-BOOL gEnablePKPBypassForLocalTrustAnchors;
-dispatch_once_t gSwizzleOnceToken;
-
-// CertVerifier, which allows any certificates for testing.
-class TestCertVerifier : public net::CertVerifier {
-  int Verify(const RequestParams& params,
-             net::CertVerifyResult* verify_result,
-             net::CompletionOnceCallback callback,
-             std::unique_ptr<Request>* out_req,
-             const net::NetLogWithSource& net_log) override {
-    verify_result->Reset();
-    verify_result->verified_cert = params.certificate();
-    verify_result->is_issued_by_known_root = true;
-    return net::OK;
-  }
-  void SetConfig(const Config& config) override {}
-  void AddObserver(Observer* observer) override {}
-  void RemoveObserver(Observer* observer) override {}
-};
-
-// net::HTTPProtocolHandlerDelegate for Cronet.
-class CronetHttpProtocolHandlerDelegate
-    : public net::HTTPProtocolHandlerDelegate {
- public:
-  CronetHttpProtocolHandlerDelegate(net::URLRequestContextGetter* getter,
-                                    RequestFilterBlock filter)
-      : getter_(getter), filter_(filter) {}
-
-  void SetRequestFilterBlock(RequestFilterBlock filter) {
-    base::AutoLock auto_lock(lock_);
-    filter_ = filter;
-  }
-
- private:
-  // net::HTTPProtocolHandlerDelegate implementation:
-  bool CanHandleRequest(NSURLRequest* request) override {
-    base::AutoLock auto_lock(lock_);
-    if (!IsRequestSupported(request))
-      return false;
-    if (filter_)
-      return filter_(request);
-    return true;
-  }
-
-  bool IsRequestSupported(NSURLRequest* request) override {
-    NSString* scheme = [[request URL] scheme];
-    if (!scheme)
-      return false;
-    return [scheme caseInsensitiveCompare:@"http"] == NSOrderedSame ||
-           [scheme caseInsensitiveCompare:@"https"] == NSOrderedSame;
-  }
-
-  net::URLRequestContextGetter* GetDefaultURLRequestContext() override {
-    return getter_.get();
-  }
-
-  scoped_refptr<net::URLRequestContextGetter> getter_;
-  __strong RequestFilterBlock filter_;
-  base::Lock lock_;
-};
-
-}  // namespace
-
-@implementation Cronet
-
-+ (void)configureCronetEnvironmentForTesting:
-    (cronet::CronetEnvironment*)cronetEnvironment {
-  if (gEnableTestCertVerifierForTesting) {
-    std::unique_ptr<TestCertVerifier> test_cert_verifier =
-        std::make_unique<TestCertVerifier>();
-    cronetEnvironment->set_mock_cert_verifier(std::move(test_cert_verifier));
-  }
-  if (gMockCertVerifier) {
-    gChromeNet.Get()->set_mock_cert_verifier(std::move(gMockCertVerifier));
-  }
-}
-
-+ (NSString*)getAcceptLanguagesFromPreferredLanguages:
-    (NSArray<NSString*>*)languages {
-  NSMutableArray* acceptLanguages = [NSMutableArray new];
-  for (NSString* lang_region in languages) {
-    NSString* lang = [lang_region componentsSeparatedByString:@"-"][0];
-    NSString* localeAcceptLangs = acceptLangs[lang_region] ?: acceptLangs[lang];
-    if (localeAcceptLangs)
-      [acceptLanguages
-          addObjectsFromArray:[localeAcceptLangs
-                                  componentsSeparatedByString:@","]];
-  }
-
-  NSString* acceptLanguageString =
-      [[[NSOrderedSet orderedSetWithArray:acceptLanguages] array]
-          componentsJoinedByString:@","];
-
-  return [acceptLanguageString length] != 0 ? acceptLanguageString
-                                            : @"en-US,en";
-}
-
-+ (NSString*)getAcceptLanguages {
-  return [self
-      getAcceptLanguagesFromPreferredLanguages:[NSLocale preferredLanguages]];
-}
-
-+ (void)setAcceptLanguages:(NSString*)acceptLanguages {
-  [self checkNotStarted];
-  gAcceptLanguages = acceptLanguages;
-}
-
-// TODO(lilyhoughton) this should either be removed, or made more sophisticated
-+ (void)checkNotStarted {
-  CHECK(!gChromeNet.Get()) << "Cronet is already started.";
-}
-
-+ (void)setHttp2Enabled:(BOOL)http2Enabled {
-  [self checkNotStarted];
-  gHttp2Enabled = http2Enabled;
-}
-
-+ (void)setQuicEnabled:(BOOL)quicEnabled {
-  [self checkNotStarted];
-  gQuicEnabled = quicEnabled;
-}
-
-+ (void)setBrotliEnabled:(BOOL)brotliEnabled {
-  [self checkNotStarted];
-  gBrotliEnabled = brotliEnabled;
-}
-
-+ (void)setMetricsEnabled:(BOOL)metricsEnabled {
-  // https://crbug.com/878589
-  // Don't collect NSURLSessionTaskMetrics until iOS 10.2 to avoid crash in iOS.
-  if (@available(iOS 10.2, *)) {
-    [self checkNotStarted];
-    gMetricsEnabled = metricsEnabled;
-  }
-}
-
-+ (BOOL)addQuicHint:(NSString*)host port:(int)port altPort:(int)altPort {
-  [self checkNotStarted];
-
-  std::string quic_host = base::SysNSStringToUTF8(host);
-
-  url::CanonHostInfo host_info;
-  std::string canon_host(net::CanonicalizeHost(quic_host, &host_info));
-  if (!host_info.IsIPAddress() &&
-      !net::IsCanonicalizedHostCompliant(canon_host)) {
-    LOG(ERROR) << "Invalid QUIC hint host: " << quic_host;
-    return NO;
-  }
-
-  gQuicHints.push_back(
-      std::make_unique<cronet::URLRequestContextConfig::QuicHint>(
-          quic_host, port, altPort));
-
-  return YES;
-}
-
-+ (void)setExperimentalOptions:(NSString*)experimentalOptions {
-  [self checkNotStarted];
-  gExperimentalOptions = experimentalOptions;
-}
-
-+ (void)setUserAgent:(NSString*)userAgent partial:(BOOL)partial {
-  [self checkNotStarted];
-  gUserAgent = userAgent;
-  gUserAgentPartial = partial;
-}
-
-+ (void)setSslKeyLogFileName:(NSString*)sslKeyLogFileName {
-  [self checkNotStarted];
-  gSslKeyLogFileName = [self getNetLogPathForFile:sslKeyLogFileName];
-}
-
-+ (void)setHttpCacheType:(CRNHttpCacheType)httpCacheType {
-  [self checkNotStarted];
-  switch (httpCacheType) {
-    case CRNHttpCacheTypeDisabled:
-      gHttpCache = cronet::URLRequestContextConfig::HttpCacheType::DISABLED;
-      break;
-    case CRNHttpCacheTypeDisk:
-      gHttpCache = cronet::URLRequestContextConfig::HttpCacheType::DISK;
-      break;
-    case CRNHttpCacheTypeMemory:
-      gHttpCache = cronet::URLRequestContextConfig::HttpCacheType::MEMORY;
-      break;
-    default:
-      DCHECK(NO) << "Invalid HTTP cache type: " << httpCacheType;
-  }
-}
-
-+ (void)setRequestFilterBlock:(RequestFilterBlock)block {
-  if (gHttpProtocolHandlerDelegate.Get().get())
-    gHttpProtocolHandlerDelegate.Get().get()->SetRequestFilterBlock(block);
-  else
-    gRequestFilterBlock = block;
-}
-
-+ (BOOL)addPublicKeyPinsForHost:(NSString*)host
-                      pinHashes:(NSSet<NSData*>*)pinHashes
-              includeSubdomains:(BOOL)includeSubdomains
-                 expirationDate:(NSDate*)expirationDate
-                          error:(NSError**)outError {
-  [self checkNotStarted];
-
-  // Pinning a key only makes sense if pin bypassing has been disabled
-  if (gEnablePKPBypassForLocalTrustAnchors) {
-    if (outError != nil) {
-      *outError =
-          [self createUnsupportedConfigurationError:
-                    @"Cannot pin keys while public key pinning is bypassed"];
-    }
-    return NO;
-  }
-
-  auto pkp = std::make_unique<cronet::URLRequestContextConfig::Pkp>(
-      base::SysNSStringToUTF8(host), includeSubdomains,
-      base::Time::FromCFAbsoluteTime(
-          [expirationDate timeIntervalSinceReferenceDate]));
-
-  for (NSData* hash in pinHashes) {
-    net::SHA256HashValue hashValue = net::SHA256HashValue();
-    if (sizeof(hashValue.data) != hash.length) {
-      *outError =
-          [self createIllegalArgumentErrorWithArgument:@"pinHashes"
-                                                reason:
-                                                    @"The length of PKP SHA256 "
-                                                    @"hash should be 256 bits"];
-      return NO;
-    }
-    memcpy((void*)(hashValue.data), [hash bytes], sizeof(hashValue.data));
-    pkp->pin_hashes.push_back(net::HashValue(hashValue));
-  }
-  gPkpList.push_back(std::move(pkp));
-  if (outError) {
-    *outError = nil;
-  }
-  return YES;
-}
-
-+ (void)setEnablePublicKeyPinningBypassForLocalTrustAnchors:(BOOL)enable {
-  gEnablePKPBypassForLocalTrustAnchors = enable;
-}
-
-+ (base::SingleThreadTaskRunner*)getFileThreadRunnerForTesting {
-  return gChromeNet.Get()->GetFileThreadRunnerForTesting();
-}
-
-+ (base::SingleThreadTaskRunner*)getNetworkThreadRunnerForTesting {
-  return gChromeNet.Get()->GetNetworkThreadRunnerForTesting();
-}
-
-+ (void)startInternal {
-  std::string user_agent = base::SysNSStringToUTF8(gUserAgent);
-
-  gChromeNet.Get().reset(
-      new cronet::CronetEnvironment(user_agent, gUserAgentPartial));
-
-  gChromeNet.Get()->set_accept_language(
-      base::SysNSStringToUTF8(gAcceptLanguages ?: [self getAcceptLanguages]));
-
-  gChromeNet.Get()->set_http2_enabled(gHttp2Enabled);
-  gChromeNet.Get()->set_quic_enabled(gQuicEnabled);
-  gChromeNet.Get()->set_brotli_enabled(gBrotliEnabled);
-  gChromeNet.Get()->set_experimental_options(
-      base::SysNSStringToUTF8(gExperimentalOptions));
-  gChromeNet.Get()->set_http_cache(gHttpCache);
-  gChromeNet.Get()->set_ssl_key_log_file_name(
-      base::SysNSStringToUTF8(gSslKeyLogFileName));
-  gChromeNet.Get()->set_pkp_list(std::move(gPkpList));
-  gChromeNet.Get()
-      ->set_enable_public_key_pinning_bypass_for_local_trust_anchors(
-          gEnablePKPBypassForLocalTrustAnchors);
-  if (gNetworkThreadPriority !=
-      cronet::CronetEnvironment::kKeepDefaultThreadPriority) {
-    gChromeNet.Get()->SetNetworkThreadPriority(gNetworkThreadPriority);
-  }
-  for (const auto& quicHint : gQuicHints) {
-    gChromeNet.Get()->AddQuicHint(quicHint->host, quicHint->port,
-                                  quicHint->alternate_port);
-  }
-
-  [self configureCronetEnvironmentForTesting:gChromeNet.Get().get()];
-  gChromeNet.Get()->Start();
-  gHttpProtocolHandlerDelegate.Get().reset(
-      new CronetHttpProtocolHandlerDelegate(
-          gChromeNet.Get()->GetURLRequestContextGetter(), gRequestFilterBlock));
-  net::HTTPProtocolHandlerDelegate::SetInstance(
-      gHttpProtocolHandlerDelegate.Get().get());
-
-  if (gMetricsEnabled) {
-    gMetricsDelegate.Get().reset(new cronet::CronetMetricsDelegate());
-    net::MetricsDelegate::SetInstance(gMetricsDelegate.Get().get());
-
-    dispatch_once(&gSwizzleOnceToken, ^{
-      cronet::SwizzleSessionWithConfiguration();
-    });
-  } else {
-    net::MetricsDelegate::SetInstance(nullptr);
-  }
-
-  gRequestFilterBlock = nil;
-}
-
-+ (void)start {
-  cronet::EnsureInitialized();
-  [self startInternal];
-}
-
-+ (void)unswizzleForTesting {
-  if (gSwizzleOnceToken)
-    cronet::SwizzleSessionWithConfiguration();
-  gSwizzleOnceToken = 0;
-}
-
-+ (void)shutdownForTesting {
-  [Cronet unswizzleForTesting];
-  [Cronet initialize];
-}
-
-+ (void)registerHttpProtocolHandler {
-  if (gPreservedSharedURLCache == nil) {
-    gPreservedSharedURLCache = [NSURLCache sharedURLCache];
-  }
-  // Disable the default cache.
-  [NSURLCache setSharedURLCache:[EmptyNSURLCache emptyNSURLCache]];
-  // Register the chrome http protocol handler to replace the default one.
-  BOOL success =
-      [NSURLProtocol registerClass:[CRNHTTPProtocolHandler class]];
-  DCHECK(success);
-}
-
-+ (void)unregisterHttpProtocolHandler {
-  // Set up SharedURLCache preserved in registerHttpProtocolHandler.
-  if (gPreservedSharedURLCache != nil) {
-    [NSURLCache setSharedURLCache:gPreservedSharedURLCache];
-    gPreservedSharedURLCache = nil;
-  }
-  [NSURLProtocol unregisterClass:[CRNHTTPProtocolHandler class]];
-}
-
-+ (void)installIntoSessionConfiguration:(NSURLSessionConfiguration*)config {
-  config.protocolClasses = @[ [CRNHTTPProtocolHandler class] ];
-}
-
-+ (NSString*)getNetLogPathForFile:(NSString*)fileName {
-  return [[[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
-                                                   inDomains:NSUserDomainMask]
-      lastObject] URLByAppendingPathComponent:fileName] path];
-}
-
-+ (BOOL)startNetLogToFile:(NSString*)fileName logBytes:(BOOL)logBytes {
-  if (gChromeNet.Get().get() && [fileName length] &&
-      ![fileName isAbsolutePath]) {
-    return gChromeNet.Get()->StartNetLog(
-        base::SysNSStringToUTF8([self getNetLogPathForFile:fileName]),
-        logBytes);
-  }
-
-  return NO;
-}
-
-+ (void)stopNetLog {
-  if (gChromeNet.Get().get()) {
-    gChromeNet.Get()->StopNetLog();
-  }
-}
-
-+ (NSString*)getUserAgent {
-  if (!gChromeNet.Get().get()) {
-    return nil;
-  }
-
-  return [NSString stringWithCString:gChromeNet.Get()->user_agent().c_str()
-                            encoding:[NSString defaultCStringEncoding]];
-}
-
-+ (void)setNetworkThreadPriority:(double)priority {
-  gNetworkThreadPriority = priority;
-  if (gChromeNet.Get()) {
-    gChromeNet.Get()->SetNetworkThreadPriority(priority);
-  };
-}
-
-+ (stream_engine*)getGlobalEngine {
-  DCHECK(gChromeNet.Get().get());
-  if (gChromeNet.Get().get()) {
-    static stream_engine engine;
-    engine.obj = gChromeNet.Get()->GetURLRequestContextGetter();
-    return &engine;
-  }
-  return nil;
-}
-
-+ (NSData*)getGlobalMetricsDeltas {
-  if (!gChromeNet.Get().get()) {
-    return nil;
-  }
-  std::vector<uint8_t> deltas(gChromeNet.Get()->GetHistogramDeltas());
-  return [NSData dataWithBytes:deltas.data() length:deltas.size()];
-}
-
-+ (void)enableTestCertVerifierForTesting {
-  gEnableTestCertVerifierForTesting = YES;
-}
-
-+ (void)setMockCertVerifierForTesting:
-    (std::unique_ptr<net::CertVerifier>)certVerifier {
-  gMockCertVerifier = std::move(certVerifier);
-}
-
-+ (void)setHostResolverRulesForTesting:(NSString*)hostResolverRulesForTesting {
-  DCHECK(gChromeNet.Get().get());
-  gChromeNet.Get()->SetHostResolverRules(
-      base::SysNSStringToUTF8(hostResolverRulesForTesting));
-}
-
-// This is a private no-op method that prevents the linker from stripping out
-// the otherwise unreferenced methods from 'bidirectional_stream.cc'.
-+ (void)preventStrippingCronetBidirectionalStream {
-  bidirectional_stream_create(NULL, 0, 0);
-}
-
-// This is a private no-op method that prevents the linker from stripping out
-// the otherwise unreferenced modules from 'native'.
-+ (void)preventStrippingNativeCronetModules {
-  Cronet_Buffer_Create();
-  Cronet_Engine_Create();
-  Cronet_UrlRequest_Create();
-}
-
-+ (NSError*)createIllegalArgumentErrorWithArgument:(NSString*)argumentName
-                                            reason:(NSString*)reason {
-  NSMutableDictionary* errorDictionary =
-      [[NSMutableDictionary alloc] initWithDictionary:@{
-        NSLocalizedDescriptionKey :
-            [NSString stringWithFormat:@"Invalid argument: %@", argumentName],
-        CRNInvalidArgumentKey : argumentName
-      }];
-  if (reason) {
-    errorDictionary[NSLocalizedFailureReasonErrorKey] = reason;
-  }
-  return [self createCronetErrorWithCode:CRNErrorInvalidArgument
-                                userInfo:errorDictionary];
-}
-
-+ (NSError*)createUnsupportedConfigurationError:(NSString*)contradiction {
-  NSMutableDictionary* errorDictionary =
-      [[NSMutableDictionary alloc] initWithDictionary:@{
-        NSLocalizedDescriptionKey : @"Unsupported configuration",
-        NSLocalizedRecoverySuggestionErrorKey :
-            @"Try disabling Public Key Pinning Bypass before pinning keys.",
-        NSLocalizedFailureReasonErrorKey : @"Pinning public keys while local "
-                                           @"anchor bypass is enabled is "
-                                           @"currently not supported.",
-      }];
-  if (contradiction) {
-    errorDictionary[NSLocalizedFailureReasonErrorKey] = contradiction;
-  }
-
-  return [self createCronetErrorWithCode:CRNErrorUnsupportedConfig
-                                userInfo:errorDictionary];
-}
-
-+ (NSError*)createCronetErrorWithCode:(int)errorCode
-                             userInfo:(NSDictionary*)userInfo {
-  return [NSError errorWithDomain:CRNCronetErrorDomain
-                             code:errorCode
-                         userInfo:userInfo];
-}
-
-// Used by tests to query the size of the map that contains metrics for
-// individual NSURLSession tasks.
-+ (size_t)getMetricsMapSize {
-  return cronet::CronetMetricsDelegate::GetMetricsMapSize();
-}
-
-// Static class initializer.
-+ (void)initialize {
-  gChromeNet.Get().reset();
-  gHttp2Enabled = YES;
-  gQuicEnabled = NO;
-  gBrotliEnabled = NO;
-  gMetricsEnabled = NO;
-  gHttpCache = cronet::URLRequestContextConfig::HttpCacheType::DISK;
-  gQuicHints.clear();
-  gExperimentalOptions = @"{}";
-  gUserAgent = nil;
-  gUserAgentPartial = NO;
-  gNetworkThreadPriority =
-      cronet::CronetEnvironment::kKeepDefaultThreadPriority;
-  gSslKeyLogFileName = nil;
-  gPkpList.clear();
-  gRequestFilterBlock = nil;
-  gHttpProtocolHandlerDelegate.Get().reset(nullptr);
-  gMetricsDelegate.Get().reset(nullptr);
-  gPreservedSharedURLCache = nil;
-  gEnableTestCertVerifierForTesting = NO;
-  gMockCertVerifier.reset(nullptr);
-  gAcceptLanguages = nil;
-  gEnablePKPBypassForLocalTrustAnchors = YES;
-}
-
-@end
diff --git a/components/cronet/ios/DEPS b/components/cronet/ios/DEPS
deleted file mode 100644
index 07c67f3..0000000
--- a/components/cronet/ios/DEPS
+++ /dev/null
@@ -1,5 +0,0 @@
-include_rules = [
-  "+ios/net",
-  "+ios/web/common",
-  "+ios/web/public",
-]
diff --git a/components/cronet/ios/Info.plist b/components/cronet/ios/Info.plist
deleted file mode 100644
index 3b48c36..0000000
--- a/components/cronet/ios/Info.plist
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-  <key>CFBundleDevelopmentRegion</key>
-  <string>en</string>
-  <key>CFBundleExecutable</key>
-  <string>Cronet</string>
-  <key>CFBundleIdentifier</key>
-  <string>org.chromium.net.Cronet</string>
-  <key>CFBundleInfoDictionaryVersion</key>
-  <string>6.0</string>
-  <key>CFBundleName</key>
-  <string>Cronet</string>
-  <key>CFBundlePackageType</key>
-  <string>FMWK</string>
-  <key>CFBundleShortVersionString</key>
-  <string>1.0</string>
-  <key>CFBundleSignature</key>
-  <string>????</string>
-  <key>CFBundleVersion</key>
-  <string>1.0</string>
-  <key>NSHumanReadableCopyright</key>
-  <string>Copyright 2016 The Chromium Authors. All rights reserved.</string>
-  <key>NSPrincipalClass</key>
-  <string></string>
-</dict>
-</plist>
\ No newline at end of file
diff --git a/components/cronet/ios/cronet_consumer/BUILD.gn b/components/cronet/ios/cronet_consumer/BUILD.gn
deleted file mode 100644
index 7be35c5..0000000
--- a/components/cronet/ios/cronet_consumer/BUILD.gn
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2016 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/ios/rules.gni")
-import("//ios/features.gni")
-
-template("cronet_consumer_template") {
-  _target_name = target_name
-
-  ios_app_bundle(_target_name) {
-    info_plist = "cronet-consumer-Info.plist"
-
-    deps = [ "//base:base" ]
-
-    deps += invoker.deps
-
-    sources = [
-      "cronet_consumer_app_delegate.h",
-      "cronet_consumer_app_delegate.mm",
-      "cronet_consumer_view_controller.h",
-      "cronet_consumer_view_controller.m",
-      "main.mm",
-    ]
-
-    forward_variables_from(invoker,
-                           [
-                             "bundle_deps",
-                             "framework_dirs",
-                           ])
-  }
-}
-
-cronet_consumer_template("cronet_consumer") {
-  deps = [ "//components/cronet/ios:cronet_framework+link" ]
-  bundle_deps = [ "//components/cronet/ios:cronet_framework+bundle" ]
-}
-
-cronet_consumer_template("cronet_consumer_static") {
-  deps = [ "//components/cronet/ios:cronet_static_framework" ]
-  framework_dirs = [ "$root_out_dir/Static" ]
-}
diff --git a/components/cronet/ios/cronet_consumer/Default.png b/components/cronet/ios/cronet_consumer/Default.png
deleted file mode 100644
index 4c8ca6f69..0000000
--- a/components/cronet/ios/cronet_consumer/Default.png
+++ /dev/null
Binary files differ
diff --git a/components/cronet/ios/cronet_consumer/cronet-consumer-Info.plist b/components/cronet/ios/cronet_consumer/cronet-consumer-Info.plist
deleted file mode 100644
index 57ee6ae8..0000000
--- a/components/cronet/ios/cronet_consumer/cronet-consumer-Info.plist
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>en</string>
-	<key>CFBundleDisplayName</key>
-	<string>${PRODUCT_NAME}</string>
-	<key>CFBundleExecutable</key>
-	<string>${EXECUTABLE_NAME}</string>
-	<key>CFBundleIdentifier</key>
-	<string>chromium.${PRODUCT_NAME:rfc1034identifier}</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>${PRODUCT_NAME}</string>
-	<key>CFBundlePackageType</key>
-	<string>APPL</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.0</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>1.0</string>
-	<key>LSRequiresIPhoneOS</key>
-	<true/>
-	<key>UIRequiredDeviceCapabilities</key>
-	<array>
-		<string>armv7</string>
-	</array>
-	<key>UISupportedInterfaceOrientations</key>
-	<array>
-		<string>UIInterfaceOrientationPortrait</string>
-		<string>UIInterfaceOrientationLandscapeLeft</string>
-		<string>UIInterfaceOrientationLandscapeRight</string>
-	</array>
-	<key>UISupportedInterfaceOrientations~ipad</key>
-	<array>
-		<string>UIInterfaceOrientationPortrait</string>
-		<string>UIInterfaceOrientationPortraitUpsideDown</string>
-		<string>UIInterfaceOrientationLandscapeLeft</string>
-		<string>UIInterfaceOrientationLandscapeRight</string>
-	</array>
-</dict>
-</plist>
diff --git a/components/cronet/ios/cronet_consumer/cronet_consumer_app_delegate.h b/components/cronet/ios/cronet_consumer/cronet_consumer_app_delegate.h
deleted file mode 100644
index 4abd3d4a..0000000
--- a/components/cronet/ios/cronet_consumer/cronet_consumer_app_delegate.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_CRONET_IOS_CRONET_CONSUMER_CRONET_CONSUMER_APP_DELEGATE_H_
-#define COMPONENTS_CRONET_IOS_CRONET_CONSUMER_CRONET_CONSUMER_APP_DELEGATE_H_
-
-#import <UIKit/UIKit.h>
-
-@class CronetConsumerViewController;
-
-// The main app controller and UIApplicationDelegate.
-@interface CronetConsumerAppDelegate : UIResponder<UIApplicationDelegate>
-
-@property(strong, nonatomic) UIWindow* window;
-@property(strong, nonatomic) CronetConsumerViewController* viewController;
-
-@end
-
-#endif  // COMPONENTS_CRONET_IOS_CRONET_CONSUMER_CRONET_CONSUMER_APP_DELEGATE_H_
diff --git a/components/cronet/ios/cronet_consumer/cronet_consumer_app_delegate.mm b/components/cronet/ios/cronet_consumer/cronet_consumer_app_delegate.mm
deleted file mode 100644
index 8ba6ba3..0000000
--- a/components/cronet/ios/cronet_consumer/cronet_consumer_app_delegate.mm
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "cronet_consumer_app_delegate.h"
-
-#import <Cronet/Cronet.h>
-
-#include "base/format_macros.h"
-#import "cronet_consumer_view_controller.h"
-
-@implementation CronetConsumerAppDelegate {
-  NSUInteger _counter;
-}
-
-@synthesize window;
-@synthesize viewController;
-
-// Returns a file name to save net internals logging. This method suffixes
-// the ivar |_counter| to the file name so a new name can be obtained by
-// modifying that.
-- (NSString*)currentNetLogFileName {
-  return [NSString
-      stringWithFormat:@"cronet-consumer-net-log%" PRIuNS ".json", _counter];
-}
-
-- (BOOL)application:(UIApplication*)application
-    didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
-  [Cronet setUserAgent:@"Sample/1.0" partial:YES];
-  [Cronet setQuicEnabled:YES];
-  [Cronet start];
-  [Cronet startNetLogToFile:[self currentNetLogFileName] logBytes:NO];
-
-  [Cronet registerHttpProtocolHandler];
-  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
-  self.viewController =
-      [[CronetConsumerViewController alloc] initWithNibName:nil bundle:nil];
-  self.window.rootViewController = self.viewController;
-  [self.window makeKeyAndVisible];
-
-  return YES;
-}
-
-- (void)applicationDidEnterBackground:(UIApplication*)application {
-  [Cronet stopNetLog];
-}
-
-- (void)applicationWillEnterForeground:(UIApplication*)application {
-  _counter++;
-  [Cronet startNetLogToFile:[self currentNetLogFileName] logBytes:NO];
-}
-
-@end
diff --git a/components/cronet/ios/cronet_consumer/cronet_consumer_view_controller.h b/components/cronet/ios/cronet_consumer/cronet_consumer_view_controller.h
deleted file mode 100644
index 0665bd6..0000000
--- a/components/cronet/ios/cronet_consumer/cronet_consumer_view_controller.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_CRONET_IOS_CRONET_CONSUMER_CRONET_CONSUMER_VIEW_CONTROLLER_H_
-#define COMPONENTS_CRONET_IOS_CRONET_CONSUMER_CRONET_CONSUMER_VIEW_CONTROLLER_H_
-
-#import <Foundation/Foundation.h>
-#import <UIKit/UIKit.h>
-
-@interface CronetConsumerViewController : UIViewController
-@end
-
-#endif  // COMPONENTS_CRONET_IOS_CRONET_CONSUMER_CRONET_CONSUMER_VIEW_CONTROLLER_H_
diff --git a/components/cronet/ios/cronet_consumer/cronet_consumer_view_controller.m b/components/cronet/ios/cronet_consumer/cronet_consumer_view_controller.m
deleted file mode 100644
index 1e4659c2..0000000
--- a/components/cronet/ios/cronet_consumer/cronet_consumer_view_controller.m
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "cronet_consumer_view_controller.h"
-
-#import <Cronet/Cronet.h>
-
-@implementation CronetConsumerViewController
-#if !defined(__IPHONE_12_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_12_0
-{
-  UIWebView* _webView;
-}
-
-- (void)viewDidLoad {
-  self.view.backgroundColor = [UIColor whiteColor];
-
-  UIButton* button = [UIButton buttonWithType:UIButtonTypeSystem];
-  [button setTitle:@"chromium.org" forState:UIControlStateNormal];
-  [button setFrame:CGRectMake(5, 0, 95, 50)];
-  [button addTarget:self
-                action:@selector(loadChromium)
-      forControlEvents:UIControlEventTouchUpInside];
-  [self.view addSubview:button];
-
-  _webView = [[UIWebView alloc]
-      initWithFrame:CGRectMake(0, 52, self.view.bounds.size.width,
-                               self.view.bounds.size.height - 52)];
-  [self.view addSubview:_webView];
-  _webView.autoresizingMask =
-      UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
-
-  [self loadChromium];
-}
-
-// Disable the status bar to sidestep all the iOS7 status bar issues.
-- (BOOL)prefersStatusBarHidden {
-  return YES;
-}
-
-- (void)loadChromium {
-  [_webView
-      loadRequest:[NSURLRequest
-                      requestWithURL:
-                          [NSURL URLWithString:@"https://www.chromium.org"]]];
-}
-#endif
-@end
diff --git a/components/cronet/ios/cronet_consumer/main.mm b/components/cronet/ios/cronet_consumer/main.mm
deleted file mode 100644
index fd72207..0000000
--- a/components/cronet/ios/cronet_consumer/main.mm
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import <Foundation/Foundation.h>
-#import <UIKit/UIKit.h>
-
-#import "cronet_consumer_app_delegate.h"
-
-int main(int argc, char* argv[]) {
-  @autoreleasepool {
-    return UIApplicationMain(
-        argc, argv, nil, NSStringFromClass([CronetConsumerAppDelegate class]));
-  }
-}
diff --git a/components/cronet/ios/cronet_environment.h b/components/cronet/ios/cronet_environment.h
deleted file mode 100644
index 9ce43b6..0000000
--- a/components/cronet/ios/cronet_environment.h
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright 2016 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_CRONET_IOS_CRONET_ENVIRONMENT_H_
-#define COMPONENTS_CRONET_IOS_CRONET_ENVIRONMENT_H_
-
-#include <list>
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/files/file_path.h"
-#include "base/files/scoped_file.h"
-#include "base/strings/sys_string_conversions.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task/sequenced_task_runner.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/threading/thread.h"
-#include "base/values.h"
-#include "components/cronet/url_request_context_config.h"
-#include "components/cronet/version.h"
-#include "net/cert/cert_verifier.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_getter.h"
-
-namespace base {
-class WaitableEvent;
-}  // namespace base
-
-namespace net {
-class CookieStore;
-class HttpNetworkSession;
-class NetLog;
-class FileNetLogObserver;
-}  // namespace net
-
-namespace cronet {
-class CronetPrefsManager;
-
-// CronetEnvironment contains all the network stack configuration
-// and initialization.
-class CronetEnvironment {
- public:
-  using PkpVector = std::vector<std::unique_ptr<URLRequestContextConfig::Pkp>>;
-
-  // A special thread priority value that indicates that the thread priority
-  // should not be altered when a thread is created.
-  static const double kKeepDefaultThreadPriority;
-
-  // |user_agent| will be used to generate the user-agent if
-  // |user_agent_partial| is true, or will be used as the complete user-agent
-  // otherwise.
-  CronetEnvironment(const std::string& user_agent, bool user_agent_partial);
-
-  CronetEnvironment(const CronetEnvironment&) = delete;
-  CronetEnvironment& operator=(const CronetEnvironment&) = delete;
-
-  ~CronetEnvironment();
-
-  // Starts this instance of Cronet environment.
-  void Start();
-
-  // The full user-agent.
-  std::string user_agent();
-
-  // Get global UMA histogram deltas.
-  std::vector<uint8_t> GetHistogramDeltas();
-
-  // Creates a new net log (overwrites existing file with this name). If
-  // actively logging, this call is ignored.
-  bool StartNetLog(base::FilePath::StringType file_name, bool log_bytes);
-  // Stops logging and flushes file. If not currently logging this call is
-  // ignored.
-  void StopNetLog();
-
-  void AddQuicHint(const std::string& host, int port, int alternate_port);
-
-  // Setters and getters for |http2_enabled_|, |quic_enabled_|, and
-  // |brotli_enabled| These only have any effect
-  // before Start() is called.
-  void set_http2_enabled(bool enabled) { http2_enabled_ = enabled; }
-  void set_quic_enabled(bool enabled) { quic_enabled_ = enabled; }
-  void set_brotli_enabled(bool enabled) { brotli_enabled_ = enabled; }
-
-  bool http2_enabled() const { return http2_enabled_; }
-  bool quic_enabled() const { return quic_enabled_; }
-  bool brotli_enabled() const { return brotli_enabled_; }
-
-  void set_accept_language(const std::string& accept_language) {
-    accept_language_ = accept_language;
-  }
-
-  void set_mock_cert_verifier(
-      std::unique_ptr<net::CertVerifier> mock_cert_verifier) {
-    mock_cert_verifier_ = std::move(mock_cert_verifier);
-  }
-
-  void set_http_cache(URLRequestContextConfig::HttpCacheType http_cache) {
-    http_cache_ = http_cache;
-  }
-
-  void set_experimental_options(const std::string& experimental_options) {
-    experimental_options_ = experimental_options;
-  }
-
-  void SetHostResolverRules(const std::string& host_resolver_rules);
-
-  void set_ssl_key_log_file_name(const std::string& ssl_key_log_file_name) {
-    ssl_key_log_file_name_ = ssl_key_log_file_name;
-  }
-
-  void set_pkp_list(PkpVector pkp_list) { pkp_list_ = std::move(pkp_list); }
-
-  void set_enable_public_key_pinning_bypass_for_local_trust_anchors(
-      bool enable) {
-    enable_pkp_bypass_for_local_trust_anchors_ = enable;
-  }
-
-  // Sets priority of the network thread. The |priority| should be a
-  // floating point number between 0.0 to 1.0, where 1.0 is highest priority.
-  void SetNetworkThreadPriority(double priority);
-
-  // Returns the URLRequestContext associated with this object.
-  net::URLRequestContext* GetURLRequestContext() const;
-
-  // Return the URLRequestContextGetter associated with this object.
-  net::URLRequestContextGetter* GetURLRequestContextGetter() const;
-
-  // The methods below are used for testing.
-  base::SingleThreadTaskRunner* GetFileThreadRunnerForTesting() const;
-  base::SingleThreadTaskRunner* GetNetworkThreadRunnerForTesting() const;
-
- private:
-  // Extends the base thread class to add the Cronet specific cleanup logic.
-  class CronetNetworkThread : public base::Thread {
-   public:
-    CronetNetworkThread(const std::string& name,
-                        cronet::CronetEnvironment* cronet_environment);
-
-    CronetNetworkThread(const CronetNetworkThread&) = delete;
-    CronetNetworkThread& operator=(const CronetNetworkThread&) = delete;
-
-   protected:
-    ~CronetNetworkThread() override;
-    void CleanUp() override;
-
-   private:
-    cronet::CronetEnvironment* const cronet_environment_;
-  };
-
-  // Performs initialization tasks that must happen on the network thread.
-  void InitializeOnNetworkThread();
-
-  // Returns the task runner for the network thread.
-  base::SingleThreadTaskRunner* GetNetworkThreadTaskRunner() const;
-
-  // Runs a closure on the network thread.
-  void PostToNetworkThread(const base::Location& from_here,
-                           base::OnceClosure task);
-
-  // Helper methods that start/stop net logging on the network thread.
-  void StartNetLogOnNetworkThread(const base::FilePath&, bool log_bytes);
-  void StopNetLogOnNetworkThread(base::WaitableEvent* log_stopped_event);
-
-  base::Value GetNetLogInfo() const;
-
-  // Returns the HttpNetworkSession object from the passed in
-  // URLRequestContext or NULL if none exists.
-  net::HttpNetworkSession* GetHttpNetworkSession(
-      net::URLRequestContext* context);
-
-  // Sets host resolver rules on the network_io_thread_.
-  void SetHostResolverRulesOnNetworkThread(const std::string& rules,
-                                           base::WaitableEvent* event);
-
-  // Sets priority of the network thread. This method should only be called
-  // on the network thread.
-  void SetNetworkThreadPriorityOnNetworkThread(double priority);
-
-  // Prepares the Cronet environment to be destroyed. The method must be
-  // executed on the network thread. No other tasks should be posted to the
-  // network thread after calling this method.
-  void CleanUpOnNetworkThread();
-
-  bool http2_enabled_;
-  bool quic_enabled_;
-  bool brotli_enabled_;
-  std::string accept_language_;
-  std::string experimental_options_;
-  // Effective experimental options. Kept for NetLog.
-  base::Value::Dict effective_experimental_options_;
-  std::string ssl_key_log_file_name_;
-  URLRequestContextConfig::HttpCacheType http_cache_;
-  PkpVector pkp_list_;
-
-  std::list<net::HostPortPair> quic_hints_;
-
-  std::unique_ptr<base::Thread> network_io_thread_;
-  std::unique_ptr<base::Thread> file_thread_;
-  scoped_refptr<base::SequencedTaskRunner> pref_store_worker_pool_;
-  std::unique_ptr<net::CertVerifier> mock_cert_verifier_;
-  std::unique_ptr<net::CookieStore> cookie_store_;
-  std::unique_ptr<net::URLRequestContext> main_context_;
-  scoped_refptr<net::URLRequestContextGetter> main_context_getter_;
-  std::string user_agent_;
-  bool user_agent_partial_;
-  net::NetLog* net_log_;
-  std::unique_ptr<net::FileNetLogObserver> file_net_log_observer_;
-  bool enable_pkp_bypass_for_local_trust_anchors_;
-  double network_thread_priority_;
-  std::unique_ptr<CronetPrefsManager> cronet_prefs_manager_;
-};
-
-}  // namespace cronet
-
-#endif  // COMPONENTS_CRONET_IOS_CRONET_ENVIRONMENT_H_
diff --git a/components/cronet/ios/cronet_environment.mm b/components/cronet/ios/cronet_environment.mm
deleted file mode 100644
index e6b1832..0000000
--- a/components/cronet/ios/cronet_environment.mm
+++ /dev/null
@@ -1,500 +0,0 @@
-// Copyright 2016 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/cronet/ios/cronet_environment.h"
-
-#include <atomic>
-#include <utility>
-
-#include "base/apple/foundation_util.h"
-#include "base/command_line.h"
-#include "base/feature_list.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
-#include "base/functional/bind.h"
-#include "base/message_loop/message_pump_type.h"
-#include "base/path_service.h"
-#include "base/synchronization/waitable_event.h"
-#import "base/task/sequenced_task_runner.h"
-#import "base/task/single_thread_task_runner.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/threading/thread_restrictions.h"
-#include "components/cronet/cronet_buildflags.h"
-#include "components/cronet/cronet_global_state.h"
-#include "components/cronet/cronet_prefs_manager.h"
-#include "components/metrics/library_support/histogram_manager.h"
-#include "components/prefs/pref_filter.h"
-#include "ios/net/cookies/cookie_store_ios.h"
-#include "ios/net/cookies/cookie_store_ios_client.h"
-#include "ios/web/common/user_agent.h"
-#include "ios/web/public/init/ios_global_state.h"
-#include "ios/web/public/init/ios_global_state_configuration.h"
-#include "net/base/http_user_agent_settings.h"
-#include "net/base/network_change_notifier.h"
-#include "net/base/network_isolation_key.h"
-#include "net/base/url_util.h"
-#include "net/cert/cert_verifier.h"
-#include "net/dns/host_resolver.h"
-#include "net/dns/mapped_host_resolver.h"
-#include "net/http/http_network_session.h"
-#include "net/http/http_server_properties.h"
-#include "net/http/http_transaction_factory.h"
-#include "net/http/http_util.h"
-#include "net/http/transport_security_state.h"
-#include "net/log/file_net_log_observer.h"
-#include "net/log/net_log.h"
-#include "net/log/net_log_capture_mode.h"
-#include "net/log/net_log_util.h"
-#include "net/proxy_resolution/proxy_resolution_service.h"
-#include "net/socket/ssl_client_socket.h"
-#include "net/ssl/ssl_key_logger_impl.h"
-#include "net/third_party/quiche/src/quiche/quic/core/quic_versions.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_builder.h"
-#include "url/scheme_host_port.h"
-#include "url/url_util.h"
-
-namespace {
-
-// Request context getter for Cronet.
-class CronetURLRequestContextGetter : public net::URLRequestContextGetter {
- public:
-  CronetURLRequestContextGetter(
-      cronet::CronetEnvironment* environment,
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
-      : environment_(environment), task_runner_(task_runner) {}
-
-  CronetURLRequestContextGetter(const CronetURLRequestContextGetter&) = delete;
-  CronetURLRequestContextGetter& operator=(
-      const CronetURLRequestContextGetter&) = delete;
-
-  net::URLRequestContext* GetURLRequestContext() override {
-    DCHECK(environment_);
-    return environment_->GetURLRequestContext();
-  }
-
-  scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner()
-      const override {
-    return task_runner_;
-  }
-
- private:
-  // Must be called on the IO thread.
-  ~CronetURLRequestContextGetter() override {}
-
-  cronet::CronetEnvironment* environment_;
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-};
-
-// Cronet implementation of net::CookieStoreIOSClient.
-// Used to provide Cronet Network IO TaskRunner.
-class CronetCookieStoreIOSClient : public net::CookieStoreIOSClient {
- public:
-  CronetCookieStoreIOSClient(
-      const scoped_refptr<base::SequencedTaskRunner>& task_runner)
-      : task_runner_(task_runner) {}
-
-  CronetCookieStoreIOSClient(const CronetCookieStoreIOSClient&) = delete;
-  CronetCookieStoreIOSClient& operator=(const CronetCookieStoreIOSClient&) =
-      delete;
-
-  scoped_refptr<base::SequencedTaskRunner> GetTaskRunner() const override {
-    return task_runner_;
-  }
-
- private:
-  ~CronetCookieStoreIOSClient() override {}
-
-  scoped_refptr<base::SequencedTaskRunner> task_runner_;
-};
-
-void SignalEvent(base::WaitableEvent* event) {
-  event->Signal();
-}
-
-// TODO(eroman): Creating the file(s) for a netlog is an internal detail for
-// FileNetLogObsever. This code assumes that the unbounded format is being used,
-// which writes a single file at |path| (creating or overwriting it).
-bool IsNetLogPathValid(const base::FilePath& path) {
-  base::ScopedFILE file(base::OpenFile(path, "w"));
-  return !!file;
-}
-
-}  // namespace
-
-namespace cronet {
-
-const double CronetEnvironment::kKeepDefaultThreadPriority = -1;
-
-base::SingleThreadTaskRunner* CronetEnvironment::GetNetworkThreadTaskRunner()
-    const {
-  if (network_io_thread_) {
-    return network_io_thread_->task_runner().get();
-  }
-  return ios_global_state::GetSharedNetworkIOThreadTaskRunner().get();
-}
-
-void CronetEnvironment::PostToNetworkThread(const base::Location& from_here,
-                                            base::OnceClosure task) {
-  GetNetworkThreadTaskRunner()->PostTask(from_here, std::move(task));
-}
-
-net::URLRequestContext* CronetEnvironment::GetURLRequestContext() const {
-  return main_context_.get();
-}
-
-net::URLRequestContextGetter* CronetEnvironment::GetURLRequestContextGetter()
-    const {
-  return main_context_getter_.get();
-}
-
-bool CronetEnvironment::StartNetLog(base::FilePath::StringType file_name,
-                                    bool log_bytes) {
-  if (file_name.empty())
-    return false;
-
-  base::FilePath path(file_name);
-  if (!IsNetLogPathValid(path)) {
-    LOG(ERROR) << "Can not start NetLog to " << path.value() << ": "
-               << strerror(errno);
-    return false;
-  }
-
-  LOG(WARNING) << "Starting NetLog to " << path.value();
-  PostToNetworkThread(
-      FROM_HERE, base::BindOnce(&CronetEnvironment::StartNetLogOnNetworkThread,
-                                base::Unretained(this), path, log_bytes));
-
-  return true;
-}
-
-void CronetEnvironment::StartNetLogOnNetworkThread(const base::FilePath& path,
-                                                   bool log_bytes) {
-  DCHECK(net_log_);
-
-  if (file_net_log_observer_)
-    return;
-
-  net::NetLogCaptureMode capture_mode =
-      log_bytes ? net::NetLogCaptureMode::kEverything
-                : net::NetLogCaptureMode::kDefault;
-
-  file_net_log_observer_ =
-      net::FileNetLogObserver::CreateUnbounded(path, capture_mode, nullptr);
-  file_net_log_observer_->StartObserving(main_context_->net_log());
-  LOG(WARNING) << "Started NetLog";
-}
-
-void CronetEnvironment::StopNetLog() {
-  base::WaitableEvent log_stopped_event(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  PostToNetworkThread(
-      FROM_HERE, base::BindOnce(&CronetEnvironment::StopNetLogOnNetworkThread,
-                                base::Unretained(this), &log_stopped_event));
-  log_stopped_event.Wait();
-}
-
-void CronetEnvironment::StopNetLogOnNetworkThread(
-    base::WaitableEvent* log_stopped_event) {
-  if (file_net_log_observer_) {
-    DLOG(WARNING) << "Stopped NetLog.";
-    file_net_log_observer_->StopObserving(
-        base::Value::ToUniquePtrValue(GetNetLogInfo()),
-        base::BindOnce(&SignalEvent, log_stopped_event));
-    file_net_log_observer_.reset();
-  } else {
-    log_stopped_event->Signal();
-  }
-}
-
-base::Value CronetEnvironment::GetNetLogInfo() const {
-  base::Value::Dict net_info = net::GetNetInfo(main_context_.get());
-  if (!effective_experimental_options_.empty()) {
-    net_info.Set("cronetExperimentalParams",
-                 effective_experimental_options_.Clone());
-  }
-  return base::Value(std::move(net_info));
-}
-
-net::HttpNetworkSession* CronetEnvironment::GetHttpNetworkSession(
-    net::URLRequestContext* context) {
-  DCHECK(context);
-  if (!context->http_transaction_factory())
-    return nullptr;
-
-  return context->http_transaction_factory()->GetSession();
-}
-
-void CronetEnvironment::AddQuicHint(const std::string& host,
-                                    int port,
-                                    int alternate_port) {
-  DCHECK(port == alternate_port);
-  quic_hints_.push_back(net::HostPortPair(host, port));
-}
-
-CronetEnvironment::CronetEnvironment(const std::string& user_agent,
-                                     bool user_agent_partial)
-    : http2_enabled_(false),
-      quic_enabled_(true),
-      brotli_enabled_(false),
-      http_cache_(URLRequestContextConfig::HttpCacheType::DISK),
-      user_agent_(user_agent),
-      user_agent_partial_(user_agent_partial),
-      net_log_(net::NetLog::Get()),
-      enable_pkp_bypass_for_local_trust_anchors_(true),
-      network_thread_priority_(kKeepDefaultThreadPriority) {}
-
-void CronetEnvironment::Start() {
-  // Threads setup.
-  file_thread_.reset(new base::Thread("Chrome File Thread"));
-  file_thread_->StartWithOptions(
-      base::Thread::Options(base::MessagePumpType::IO, 0));
-  // Fetching the task_runner will create the shared thread if necessary.
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner =
-      ios_global_state::GetSharedNetworkIOThreadTaskRunner();
-  if (!task_runner) {
-    network_io_thread_.reset(
-        new CronetNetworkThread("Chrome Network IO Thread", this));
-    network_io_thread_->StartWithOptions(
-        base::Thread::Options(base::MessagePumpType::IO, 0));
-  }
-
-  net::SetCookieStoreIOSClient(new CronetCookieStoreIOSClient(
-      CronetEnvironment::GetNetworkThreadTaskRunner()));
-
-  main_context_getter_ = new CronetURLRequestContextGetter(
-      this, CronetEnvironment::GetNetworkThreadTaskRunner());
-  std::atomic_thread_fence(std::memory_order_seq_cst);
-  PostToNetworkThread(
-      FROM_HERE, base::BindOnce(&CronetEnvironment::InitializeOnNetworkThread,
-                                base::Unretained(this)));
-}
-
-void CronetEnvironment::CleanUpOnNetworkThread() {
-  // TODO(lilyhoughton) make unregistering of this work.
-  // net::HTTPProtocolHandlerDelegate::SetInstance(nullptr);
-
-  // TODO(lilyhoughton) this can only be run once, so right now leaking it.
-  // Should be be called when the _last_ CronetEnvironment is destroyed.
-  // base::ThreadPoolInstance* ts = base::ThreadPoolInstance::Get();
-  // if (ts)
-  //  ts->Shutdown();
-
-  if (cronet_prefs_manager_) {
-    cronet_prefs_manager_->PrepareForShutdown();
-  }
-
-  // TODO(lilyhoughton) this should be smarter about making sure there are no
-  // pending requests, etc.
-  main_context_.reset();
-
-  // cronet_prefs_manager_ should be deleted on the network thread.
-  cronet_prefs_manager_.reset();
-}
-
-CronetEnvironment::~CronetEnvironment() {
-  // Deleting a thread blocks the current thread and waits until all pending
-  // tasks are completed.
-  network_io_thread_.reset();
-  file_thread_.reset();
-}
-
-void CronetEnvironment::InitializeOnNetworkThread() {
-  DCHECK(GetNetworkThreadTaskRunner()->BelongsToCurrentThread());
-  base::DisallowBlocking();
-
-  static bool ssl_key_log_file_set = false;
-  if (!ssl_key_log_file_set && !ssl_key_log_file_name_.empty()) {
-    ssl_key_log_file_set = true;
-    base::FilePath ssl_key_log_file(ssl_key_log_file_name_);
-    net::SSLClientSocket::SetSSLKeyLogger(
-        std::make_unique<net::SSLKeyLoggerImpl>(ssl_key_log_file));
-  }
-
-  if (user_agent_partial_)
-    user_agent_ = web::BuildMobileUserAgent(user_agent_);
-
-  // Cache
-  base::FilePath storage_path;
-  if (!base::PathService::Get(base::DIR_CACHE, &storage_path))
-    return;
-  storage_path = storage_path.Append(FILE_PATH_LITERAL("cronet"));
-
-  URLRequestContextConfigBuilder context_config_builder;
-  context_config_builder.enable_quic = quic_enabled_;   // Enable QUIC.
-  context_config_builder.enable_spdy = http2_enabled_;  // Enable HTTP/2.
-  context_config_builder.http_cache = http_cache_;      // Set HTTP cache.
-  context_config_builder.storage_path =
-      storage_path.value();  // Storage path for http cache and prefs storage.
-  context_config_builder.accept_language =
-      accept_language_;  // Accept-Language request header field.
-  context_config_builder.user_agent =
-      user_agent_;  // User-Agent request header field.
-  context_config_builder.experimental_options =
-      experimental_options_;  // Set experimental Cronet options.
-  context_config_builder.mock_cert_verifier = std::move(
-      mock_cert_verifier_);  // MockCertVerifier to use for testing purposes.
-  if (network_thread_priority_ != kKeepDefaultThreadPriority)
-    context_config_builder.network_thread_priority = network_thread_priority_;
-  std::unique_ptr<URLRequestContextConfig> config =
-      context_config_builder.Build();
-
-  config->pkp_list = std::move(pkp_list_);
-
-  net::URLRequestContextBuilder context_builder;
-
-  // Explicitly disable the persister for Cronet to avoid persistence of dynamic
-  // HPKP.  This is a safety measure ensuring that nobody enables the
-  // persistence of HPKP by specifying transport_security_persister_file_path in
-  // the future.
-  context_builder.set_transport_security_persister_file_path(base::FilePath());
-
-  config->ConfigureURLRequestContextBuilder(&context_builder);
-
-  effective_experimental_options_ =
-      config->effective_experimental_options.Clone();
-
-  // TODO(crbug.com/934402): Use a shared HostResolverManager instead of a
-  // global HostResolver.
-  std::unique_ptr<net::MappedHostResolver> mapped_host_resolver(
-      new net::MappedHostResolver(
-          net::HostResolver::CreateStandaloneResolver(nullptr)));
-
-  if (!config->storage_path.empty()) {
-    cronet_prefs_manager_ = std::make_unique<CronetPrefsManager>(
-        config->storage_path, GetNetworkThreadTaskRunner(),
-        file_thread_->task_runner(), false /* nqe */, false /* host_cache */,
-        net_log_, &context_builder);
-  }
-
-  context_builder.set_host_resolver(std::move(mapped_host_resolver));
-
-  // TODO(690969): This behavior matches previous behavior of CookieStoreIOS in
-  // CrNet, but should change to adhere to App's Cookie Accept Policy instead
-  // of changing it.
-  [[NSHTTPCookieStorage sharedHTTPCookieStorage]
-      setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
-  auto cookie_store = std::make_unique<net::CookieStoreIOS>(
-      [NSHTTPCookieStorage sharedHTTPCookieStorage], nullptr /* net_log */);
-  context_builder.SetCookieStore(std::move(cookie_store));
-
-  context_builder.set_enable_brotli(brotli_enabled_);
-  main_context_ = context_builder.Build();
-
-  for (const auto& quic_hint : quic_hints_) {
-    url::CanonHostInfo host_info;
-    std::string canon_host(net::CanonicalizeHost(quic_hint.host(), &host_info));
-    if (!host_info.IsIPAddress() &&
-        !net::IsCanonicalizedHostCompliant(canon_host)) {
-      LOG(ERROR) << "Invalid QUIC hint host: " << quic_hint.host();
-      continue;
-    }
-
-    net::AlternativeService alternative_service(net::kProtoQUIC, "",
-                                                quic_hint.port());
-
-    url::SchemeHostPort quic_hint_server("https", quic_hint.host(),
-                                         quic_hint.port());
-    main_context_->http_server_properties()->SetQuicAlternativeService(
-        quic_hint_server, net::NetworkAnonymizationKey(), alternative_service,
-        base::Time::Max(), quic::ParsedQuicVersionVector());
-  }
-
-  main_context_->transport_security_state()
-      ->SetEnablePublicKeyPinningBypassForLocalTrustAnchors(
-          enable_pkp_bypass_for_local_trust_anchors_);
-
-  // Iterate trhough PKP configuration for every host.
-  for (const auto& pkp : config->pkp_list) {
-    // Add the host pinning.
-    main_context_->transport_security_state()->AddHPKP(
-        pkp->host, pkp->expiration_date, pkp->include_subdomains,
-        pkp->pin_hashes, GURL::EmptyGURL());
-  }
-}
-
-void CronetEnvironment::SetNetworkThreadPriority(double priority) {
-  DCHECK_LE(priority, 1.0);
-  DCHECK_GE(priority, 0.0);
-  network_thread_priority_ = priority;
-  if (network_io_thread_) {
-    PostToNetworkThread(
-        FROM_HERE,
-        base::BindRepeating(
-            &CronetEnvironment::SetNetworkThreadPriorityOnNetworkThread,
-            base::Unretained(this), priority));
-  }
-}
-
-std::string CronetEnvironment::user_agent() {
-  const net::HttpUserAgentSettings* user_agent_settings =
-      main_context_->http_user_agent_settings();
-  if (!user_agent_settings) {
-    return nullptr;
-  }
-
-  return user_agent_settings->GetUserAgent();
-}
-
-std::vector<uint8_t> CronetEnvironment::GetHistogramDeltas() {
-  std::vector<uint8_t> data;
-#if BUILDFLAG(DISABLE_HISTOGRAM_SUPPORT)
-  NOTREACHED() << "Histogram support is disabled";
-#else   // BUILDFLAG(DISABLE_HISTOGRAM_SUPPORT)
-  if (!metrics::HistogramManager::GetInstance()->GetDeltas(&data))
-    return std::vector<uint8_t>();
-#endif  // BUILDFLAG(DISABLE_HISTOGRAM_SUPPORT)
-  return data;
-}
-
-void CronetEnvironment::SetHostResolverRules(const std::string& rules) {
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  PostToNetworkThread(
-      FROM_HERE,
-      base::BindOnce(&CronetEnvironment::SetHostResolverRulesOnNetworkThread,
-                     base::Unretained(this), rules, &event));
-  event.Wait();
-}
-
-void CronetEnvironment::SetHostResolverRulesOnNetworkThread(
-    const std::string& rules,
-    base::WaitableEvent* event) {
-  static_cast<net::MappedHostResolver*>(main_context_->host_resolver())
-      ->SetRulesFromString(rules);
-  event->Signal();
-}
-
-void CronetEnvironment::SetNetworkThreadPriorityOnNetworkThread(
-    double priority) {
-  DCHECK(GetNetworkThreadTaskRunner()->BelongsToCurrentThread());
-  cronet::SetNetworkThreadPriorityOnNetworkThread(priority);
-}
-
-base::SingleThreadTaskRunner* CronetEnvironment::GetFileThreadRunnerForTesting()
-    const {
-  return file_thread_->task_runner().get();
-}
-
-base::SingleThreadTaskRunner*
-CronetEnvironment::GetNetworkThreadRunnerForTesting() const {
-  return GetNetworkThreadTaskRunner();
-}
-
-CronetEnvironment::CronetNetworkThread::CronetNetworkThread(
-    const std::string& name,
-    cronet::CronetEnvironment* cronet_environment)
-    : base::Thread(name), cronet_environment_(cronet_environment) {}
-
-CronetEnvironment::CronetNetworkThread::~CronetNetworkThread() {
-  Stop();
-}
-
-void CronetEnvironment::CronetNetworkThread::CleanUp() {
-  cronet_environment_->CleanUpOnNetworkThread();
-}
-
-}  // namespace cronet
diff --git a/components/cronet/ios/cronet_global_state_ios.mm b/components/cronet/ios/cronet_global_state_ios.mm
deleted file mode 100644
index 43486538..0000000
--- a/components/cronet/ios/cronet_global_state_ios.mm
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/cronet/cronet_global_state.h"
-
-#import <Foundation/Foundation.h>
-
-#include <utility>
-
-#include "base/functional/callback.h"
-#import "base/task/sequenced_task_runner.h"
-#include "ios/web/common/user_agent.h"
-#include "ios/web/public/init/ios_global_state.h"
-#include "ios/web/public/init/ios_global_state_configuration.h"
-#include "net/proxy_resolution/proxy_config_service.h"
-#include "net/proxy_resolution/proxy_resolution_service.h"
-
-namespace {
-
-void InitializeOnMainThread() {
-  // This method must be called once from the main thread.
-  DCHECK_EQ([NSThread currentThread], [NSThread mainThread]);
-
-  ios_global_state::CreateParams create_params;
-  create_params.install_at_exit_manager = true;
-  ios_global_state::Create(create_params);
-  ios_global_state::StartThreadPool();
-
-  ios_global_state::BuildSingleThreadTaskExecutor();
-  ios_global_state::CreateNetworkChangeNotifier();
-}
-
-}  // namespace
-
-namespace cronet {
-
-bool OnInitThread() {
-  return [NSThread isMainThread] == YES;
-}
-
-void PostTaskToInitThread(const base::Location& posted_from,
-                          base::OnceClosure task) {
-  __block base::OnceClosure block_task(std::move(task));
-  if (!OnInitThread()) {
-    dispatch_async(dispatch_get_main_queue(), ^(void) {
-      std::move(block_task).Run();
-    });
-  } else {
-    std::move(block_task).Run();
-  }
-}
-
-void EnsureInitialized() {
-  static dispatch_once_t onceToken;
-  dispatch_once(&onceToken, ^{
-    if (!OnInitThread()) {
-      dispatch_sync(dispatch_get_main_queue(), ^(void) {
-        InitializeOnMainThread();
-      });
-    } else {
-      InitializeOnMainThread();
-    }
-  });
-}
-
-std::unique_ptr<net::ProxyConfigService> CreateProxyConfigService(
-    const scoped_refptr<base::SequencedTaskRunner>& io_task_runner) {
-  return nullptr;
-}
-
-std::unique_ptr<net::ProxyResolutionService> CreateProxyResolutionService(
-    std::unique_ptr<net::ProxyConfigService> proxy_config_service,
-    net::NetLog* net_log) {
-  return nullptr;
-}
-
-// Creates default User-Agent request value, combining optional
-// |partial_user_agent| with system-dependent values.
-std::string CreateDefaultUserAgent(const std::string& partial_user_agent) {
-  return web::BuildMobileUserAgent(partial_user_agent);
-}
-
-void SetNetworkThreadPriorityOnNetworkThread(double priority) {
-  DCHECK_LE(priority, 1.0);
-  DCHECK_GE(priority, 0.0);
-  if (priority >= 0.0 && priority <= 1.0)
-    [NSThread setThreadPriority:priority];
-}
-
-}  // namespace cronet
diff --git a/components/cronet/ios/cronet_metrics.h b/components/cronet/ios/cronet_metrics.h
deleted file mode 100644
index 525d142..0000000
--- a/components/cronet/ios/cronet_metrics.h
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_CRONET_IOS_CRONET_METRICS_H_
-#define COMPONENTS_CRONET_IOS_CRONET_METRICS_H_
-
-#import <Foundation/Foundation.h>
-
-#include "components/grpc_support/include/bidirectional_stream_c.h"
-#import "ios/net/crn_http_protocol_handler.h"
-#include "net/http/http_network_session.h"
-
-// These are internal versions of NSURLSessionTaskTransactionMetrics and
-// NSURLSessionTaskMetrics, defined primarily so that Cronet can
-// initialize them and set their properties (the iOS classes are readonly).
-
-// The correspondences are
-//   CronetTransactionMetrics -> NSURLSessionTaskTransactionMetrics
-//   CronetMetrics -> NSURLSessionTaskMetrics
-
-FOUNDATION_EXPORT GRPC_SUPPORT_EXPORT NS_AVAILABLE_IOS(10.0)
-@interface CronetTransactionMetrics : NSURLSessionTaskTransactionMetrics
-
-// All of the below redefined as readwrite.
-
-// This is set to [task currentRequest].
-@property(copy, readwrite) NSURLRequest* request;
-// This is set to [task response].
-@property(copy, readwrite) NSURLResponse* response;
-
-// This is set to net::LoadTimingInfo::request_start_time.
-@property(copy, readwrite) NSDate* fetchStartDate;
-// This is set to net::LoadTimingInfo::ConnectTiming::dns_start.
-@property(copy, readwrite) NSDate* domainLookupStartDate;
-// This is set to net::LoadTimingInfo::ConnectTiming::dns_end.
-@property(copy, readwrite) NSDate* domainLookupEndDate;
-// This is set to net::LoadTimingInfo::ConnectTiming::connect_start.
-@property(copy, readwrite) NSDate* connectStartDate;
-// This is set to net::LoadTimingInfo::ConnectTiming::ssl_start.
-@property(copy, readwrite) NSDate* secureConnectionStartDate;
-// This is set to net::LoadTimingInfo::ConnectTiming::ssl_end.
-@property(copy, readwrite) NSDate* secureConnectionEndDate;
-// This is set to net::LoadTimingInfo::ConnectTiming::connect_end.
-@property(copy, readwrite) NSDate* connectEndDate;
-// This is set to net::LoadTimingInfo::sent_start.
-@property(copy, readwrite) NSDate* requestStartDate;
-// This is set to net::LoadTimingInfo::send_end.
-@property(copy, readwrite) NSDate* requestEndDate;
-// This is set to net::LoadTimingInfo::receive_headers_end.
-@property(copy, readwrite) NSDate* responseStartDate;
-// This is set to net::MetricsDelegate::Metrics::response_end_time.
-@property(copy, readwrite) NSDate* responseEndDate;
-
-// This is set to net::HttpResponseInfo::connection_info.
-@property(copy, readwrite) NSString* networkProtocolName;
-// This is set to YES if net::HttpResponseInfo::proxy_chain.is_direct()
-// returns false.
-@property(assign, readwrite, getter=isProxyConnection) BOOL proxyConnection;
-// This is set to YES if net::LoadTimingInfo::ConnectTiming::conect_start is
-// null.
-@property(assign, readwrite, getter=isReusedConnection) BOOL reusedConnection;
-// This is set to LocalCache if net::HttpResponseInfo::was_cached is true, set
-// to ServerPush if net::LoadTimingInfo::push_start is non-null, and set to
-// NetworkLoad otherwise.
-@property(assign, readwrite)
-    NSURLSessionTaskMetricsResourceFetchType resourceFetchType;
-
-- (NSString*)description;
-
-@end
-
-// This is an internal version of NSURLSessionTaskMetrics - see comment above
-// CronetTransactionMetrics.
-NS_AVAILABLE_IOS(10.0) @interface CronetMetrics : NSURLSessionTaskMetrics
-// Redefined as readwrite.
-@property(copy, readwrite)
-    NSArray<NSURLSessionTaskTransactionMetrics*>* transactionMetrics;
-@end
-
-namespace cronet {
-
-// net::MetricsDelegate for Cronet.
-class CronetMetricsDelegate : public net::MetricsDelegate {
- public:
-  using Metrics = net::MetricsDelegate::Metrics;
-
-  CronetMetricsDelegate() {}
-  void OnStartNetRequest(NSURLSessionTask* task) override;
-  void OnStopNetRequest(std::unique_ptr<Metrics> metrics) override;
-
-  // Returns the metrics collected for a specific task (removing that task's
-  // entry from the map in the process).
-  // It is called exactly once by the swizzled delegate proxy (see below),
-  // uses it to retrieve metrics data collected by net/ and pass them on to
-  // the client. If there is no metrics data for the passed task, this returns
-  // nullptr.
-  static std::unique_ptr<Metrics> MetricsForTask(NSURLSessionTask* task);
-
-  // Used by tests to query the size of the |gTaskMetricsMap| map.
-  static size_t GetMetricsMapSize();
-};
-
-// This is the swizzling function that Cronet (in its startInternal
-// method) calls to inject the proxy delegate into iOS networking API and
-// intercept didFinishCollectingMetrics to replace the (empty) iOS metrics data
-// with metrics data from net.
-void SwizzleSessionWithConfiguration();
-
-}  // namespace cronet
-
-#endif // COMPONENTS_CRONET_IOS_CRONET_METRICS_H_
diff --git a/components/cronet/ios/cronet_metrics.mm b/components/cronet/ios/cronet_metrics.mm
deleted file mode 100644
index 16cd618..0000000
--- a/components/cronet/ios/cronet_metrics.mm
+++ /dev/null
@@ -1,370 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "components/cronet/ios/cronet_metrics.h"
-
-#include <objc/runtime.h>
-
-#include "base/lazy_instance.h"
-#include "base/strings/sys_string_conversions.h"
-
-@implementation CronetTransactionMetrics
-
-@synthesize request = _request;
-@synthesize response = _response;
-
-@synthesize fetchStartDate = _fetchStartDate;
-@synthesize domainLookupStartDate = _domainLookupStartDate;
-@synthesize domainLookupEndDate = _domainLookupEndDate;
-@synthesize connectStartDate = _connectStartDate;
-@synthesize secureConnectionStartDate = _secureConnectionStartDate;
-@synthesize secureConnectionEndDate = _secureConnectionEndDate;
-@synthesize connectEndDate = _connectEndDate;
-@synthesize requestStartDate = _requestStartDate;
-@synthesize requestEndDate = _requestEndDate;
-@synthesize responseStartDate = _responseStartDate;
-@synthesize responseEndDate = _responseEndDate;
-
-@synthesize networkProtocolName = _networkProtocolName;
-@synthesize proxyConnection = _proxyConnection;
-@synthesize reusedConnection = _reusedConnection;
-@synthesize resourceFetchType = _resourceFetchType;
-
-// The NSURLSessionTaskTransactionMetrics and NSURLSessionTaskMetrics classes
-// are not supposed to be extended.  Its default init method initialized an
-// internal class, and therefore needs to be overridden to explicitly
-// initialize (and return) an instance of this class.
-// The |self = old_self| swap is necessary because [super init] must be
-// assigned to self (or returned immediately), but in this case is returning
-// a value of the wrong type.
-
-- (instancetype)init {
-  id old_self = self;
-  self = [super init];
-  self = old_self;
-  return old_self;
-}
-
-- (NSString*)description {
-  return [NSString
-      stringWithFormat:
-          @""
-           "fetchStartDate: %@\n"
-           "domainLookupStartDate: %@\n"
-           "domainLookupEndDate: %@\n"
-           "connectStartDate: %@\n"
-           "secureConnectionStartDate: %@\n"
-           "secureConnectionEndDate: %@\n"
-           "connectEndDate: %@\n"
-           "requestStartDate: %@\n"
-           "requestEndDate: %@\n"
-           "responseStartDate: %@\n"
-           "responseEndDate: %@\n"
-           "networkProtocolName: %@\n"
-           "proxyConnection: %i\n"
-           "reusedConnection: %i\n"
-           "resourceFetchType: %lu\n",
-          [self fetchStartDate], [self domainLookupStartDate],
-          [self domainLookupEndDate], [self connectStartDate],
-          [self secureConnectionStartDate], [self secureConnectionEndDate],
-          [self connectEndDate], [self requestStartDate], [self requestEndDate],
-          [self responseStartDate], [self responseEndDate],
-          [self networkProtocolName], [self isProxyConnection],
-          [self isReusedConnection], (long)[self resourceFetchType]];
-}
-
-@end
-
-@implementation CronetMetrics
-
-@synthesize transactionMetrics = _transactionMetrics;
-
-- (instancetype)init {
-  id old_self = self;
-  self = [super init];
-  self = old_self;
-  return old_self;
-}
-
-@end
-
-namespace {
-
-using Metrics = net::MetricsDelegate::Metrics;
-
-// Synchronizes access to |gTaskMetricsMap|.
-base::LazyInstance<base::Lock>::Leaky gTaskMetricsMapLock =
-    LAZY_INSTANCE_INITIALIZER;
-
-// A global map that contains metrics information for pending URLSessionTasks.
-// The map has to be "leaky"; otherwise, it will be destroyed on the main thread
-// when the client app terminates. When the client app terminates, the network
-// thread may still be finishing some work that requires access to the map.
-base::LazyInstance<std::map<NSURLSessionTask*, std::unique_ptr<Metrics>>>::Leaky
-    gTaskMetricsMap = LAZY_INSTANCE_INITIALIZER;
-
-// Helper method that converts the ticks data found in LoadTimingInfo to an
-// NSDate value to be used in client-side data.
-NSDate* TicksToDate(const net::LoadTimingInfo& reference,
-                    const base::TimeTicks& ticks) {
-  if (ticks.is_null())
-    return nil;
-  base::Time ticks_since_1970 =
-      (reference.request_start_time + (ticks - reference.request_start));
-  return [NSDate dateWithTimeIntervalSince1970:ticks_since_1970
-                                                   .InSecondsFSinceUnixEpoch()];
-}
-
-// Converts Metrics metrics data into CronetTransactionMetrics (which
-// importantly implements the NSURLSessionTaskTransactionMetrics API)
-CronetTransactionMetrics* NativeToIOSMetrics(Metrics& metrics)
-    NS_AVAILABLE_IOS(10.0) {
-  NSURLSessionTask* task = metrics.task;
-  const net::LoadTimingInfo& load_timing_info = metrics.load_timing_info;
-  const net::HttpResponseInfo& response_info = metrics.response_info;
-
-  CronetTransactionMetrics* transaction_metrics =
-      [[CronetTransactionMetrics alloc] init];
-
-  [transaction_metrics setRequest:[task currentRequest]];
-  [transaction_metrics setResponse:[task response]];
-
-  transaction_metrics.fetchStartDate =
-      [NSDate dateWithTimeIntervalSince1970:load_timing_info.request_start_time
-                                                .InSecondsFSinceUnixEpoch()];
-
-  transaction_metrics.domainLookupStartDate = TicksToDate(
-      load_timing_info, load_timing_info.connect_timing.domain_lookup_start);
-  transaction_metrics.domainLookupEndDate = TicksToDate(
-      load_timing_info, load_timing_info.connect_timing.domain_lookup_end);
-
-  transaction_metrics.connectStartDate = TicksToDate(
-      load_timing_info, load_timing_info.connect_timing.connect_start);
-  transaction_metrics.secureConnectionStartDate =
-      TicksToDate(load_timing_info, load_timing_info.connect_timing.ssl_start);
-  transaction_metrics.secureConnectionEndDate =
-      TicksToDate(load_timing_info, load_timing_info.connect_timing.ssl_end);
-  transaction_metrics.connectEndDate = TicksToDate(
-      load_timing_info, load_timing_info.connect_timing.connect_end);
-
-  transaction_metrics.requestStartDate =
-      TicksToDate(load_timing_info, load_timing_info.send_start);
-  transaction_metrics.requestEndDate =
-      TicksToDate(load_timing_info, load_timing_info.send_end);
-  transaction_metrics.responseStartDate =
-      TicksToDate(load_timing_info, load_timing_info.receive_headers_end);
-  transaction_metrics.responseEndDate =
-      [NSDate dateWithTimeIntervalSince1970:metrics.response_end_time
-                                                .InSecondsFSinceUnixEpoch()];
-
-  transaction_metrics.networkProtocolName =
-      base::SysUTF8ToNSString(net::HttpResponseInfo::ConnectionInfoToString(
-          response_info.connection_info));
-  transaction_metrics.proxyConnection = !response_info.proxy_chain.is_direct();
-
-  // If the connect timing information is null, then there was no connection
-  // establish - i.e., one was reused.
-  // The corrolary to this is that, if reusedConnection is YES, then
-  // domainLookupStartDate, domainLookupEndDate, connectStartDate,
-  // connectEndDate, secureConnectionStartDate, and secureConnectionEndDate are
-  // all meaningless.
-  transaction_metrics.reusedConnection =
-      load_timing_info.connect_timing.connect_start.is_null();
-
-  // Guess the resource fetch type based on some heuristics about what data is
-  // present.
-  if (response_info.was_cached) {
-    transaction_metrics.resourceFetchType =
-        NSURLSessionTaskMetricsResourceFetchTypeLocalCache;
-  } else if (!load_timing_info.push_start.is_null()) {
-    transaction_metrics.resourceFetchType =
-        NSURLSessionTaskMetricsResourceFetchTypeServerPush;
-  } else {
-    transaction_metrics.resourceFetchType =
-        NSURLSessionTaskMetricsResourceFetchTypeNetworkLoad;
-  }
-
-  return transaction_metrics;
-}
-
-}  // namespace
-
-// A blank implementation of NSURLSessionDelegate that contains no methods.
-// It is used as a substitution for a session delegate when the client
-// either creates a session without a delegate or passes 'nil' as its value.
-@interface BlankNSURLSessionDelegate : NSObject<NSURLSessionDelegate>
-@end
-
-@implementation BlankNSURLSessionDelegate : NSObject
-@end
-
-// In order for Cronet to use the iOS metrics collection API, it needs to
-// replace the normal NSURLSession mechanism for calling into the delegate
-// (so it can provide metrics from net/, instead of the empty metrics that iOS
-// would provide otherwise.
-// To this end, Cronet's startInternal method replaces the NSURLSession's
-// sessionWithConfiguration method to inject a delegateProxy in between the
-// client delegate and iOS code.
-// This class represrents that delegateProxy. The important function is the
-// didFinishCollectingMetrics callback, which when a request is being handled
-// by Cronet, replaces the metrics collected by iOS with those connected by
-// Cronet.
-@interface URLSessionTaskDelegateProxy : NSProxy<NSURLSessionTaskDelegate>
-- (instancetype)initWithDelegate:(id<NSURLSessionDelegate>)delegate;
-@end
-
-@implementation URLSessionTaskDelegateProxy {
-  id<NSURLSessionDelegate> _delegate;
-  BOOL _respondsToDidFinishCollectingMetrics;
-}
-
-// As this is a proxy delegate, it needs to be initialized with a real client
-// delegate, to whom all of the method invocations will eventually get passed.
-- (instancetype)initWithDelegate:(id<NSURLSessionDelegate>)delegate {
-  // If the client passed a real delegate, use it. Otherwise, create a blank
-  // delegate that will handle method invocations that are forwarded by this
-  // proxy implementation. It is incorrect to forward calls to a 'nil' object.
-  if (delegate) {
-    _delegate = delegate;
-  } else {
-    _delegate = [[BlankNSURLSessionDelegate alloc] init];
-  }
-
-  _respondsToDidFinishCollectingMetrics =
-      [_delegate respondsToSelector:@selector
-                 (URLSession:task:didFinishCollectingMetrics:)];
-  return self;
-}
-
-// Any methods other than didFinishCollectingMetrics should be forwarded
-// directly to the client delegate.
-- (void)forwardInvocation:(NSInvocation*)invocation {
-  [invocation setTarget:_delegate];
-  [invocation invoke];
-}
-
-// And for that reason, URLSessionTaskDelegateProxy should act like it responds
-// to any of the selectors that the client delegate does.
-- (nullable NSMethodSignature*)methodSignatureForSelector:(SEL)sel {
-  return [(id)_delegate methodSignatureForSelector:sel];
-}
-
-// didFinishCollectionMetrics ultimately calls into the corresponding method on
-// the client delegate (if it exists), but first replaces the iOS-supplied
-// metrics with metrics collected by Cronet (if they exist).
-- (void)URLSession:(NSURLSession*)session
-                          task:(NSURLSessionTask*)task
-    didFinishCollectingMetrics:(NSURLSessionTaskMetrics*)metrics
-    NS_AVAILABLE_IOS(10.0) {
-  std::unique_ptr<Metrics> netMetrics =
-      cronet::CronetMetricsDelegate::MetricsForTask(task);
-
-  if (_respondsToDidFinishCollectingMetrics) {
-    if (netMetrics) {
-      CronetTransactionMetrics* cronetTransactionMetrics =
-          NativeToIOSMetrics(*netMetrics);
-
-      CronetMetrics* cronetMetrics = [[CronetMetrics alloc] init];
-      [cronetMetrics setTransactionMetrics:@[ cronetTransactionMetrics ]];
-
-      [(id<NSURLSessionTaskDelegate>)_delegate URLSession:session
-                                                     task:task
-                               didFinishCollectingMetrics:cronetMetrics];
-    } else {
-      // If there are no metrics is Cronet's task->metrics map, then Cronet is
-      // not handling this request, so just transparently pass iOS's collected
-      // metrics.
-      [(id<NSURLSessionTaskDelegate>)_delegate URLSession:session
-                                                     task:task
-                               didFinishCollectingMetrics:metrics];
-    }
-  }
-}
-
-- (BOOL)respondsToSelector:(SEL)aSelector {
-  // Regardless whether the underlying session delegate handles
-  // URLSession:task:didFinishCollectingMetrics: or not, always
-  // return 'YES' for that selector. Otherwise, the method may
-  // not be called, causing unbounded growth of |gTaskMetricsMap|.
-  if (aSelector == @selector(URLSession:task:didFinishCollectingMetrics:)) {
-    return YES;
-  }
-  return [_delegate respondsToSelector:aSelector];
-}
-
-@end
-
-@implementation NSURLSession (Cronet)
-
-+ (NSURLSession*)
-hookSessionWithConfiguration:(NSURLSessionConfiguration*)configuration
-                    delegate:(nullable id<NSURLSessionDelegate>)delegate
-               delegateQueue:(nullable NSOperationQueue*)queue {
-  URLSessionTaskDelegateProxy* delegate_proxy =
-      [[URLSessionTaskDelegateProxy alloc] initWithDelegate:delegate];
-  // Because the the method implementations are swapped, this is not a
-  // recursive call, and instead just forwards the call to the original
-  // sessionWithConfiguration method.
-  return [self hookSessionWithConfiguration:configuration
-                                   delegate:delegate_proxy
-                              delegateQueue:queue];
-}
-
-@end
-
-namespace cronet {
-
-std::unique_ptr<Metrics> CronetMetricsDelegate::MetricsForTask(
-    NSURLSessionTask* task) {
-  base::AutoLock auto_lock(gTaskMetricsMapLock.Get());
-  auto metrics_search = gTaskMetricsMap.Get().find(task);
-  if (metrics_search == gTaskMetricsMap.Get().end()) {
-    return nullptr;
-  }
-
-  std::unique_ptr<Metrics> metrics = std::move(metrics_search->second);
-  // Remove the entry to free memory.
-  gTaskMetricsMap.Get().erase(metrics_search);
-
-  return metrics;
-}
-
-void CronetMetricsDelegate::OnStartNetRequest(NSURLSessionTask* task) {
-  base::AutoLock auto_lock(gTaskMetricsMapLock.Get());
-  if ([task state] == NSURLSessionTaskStateRunning) {
-    gTaskMetricsMap.Get()[task] = nullptr;
-  }
-}
-
-void CronetMetricsDelegate::OnStopNetRequest(std::unique_ptr<Metrics> metrics) {
-  base::AutoLock auto_lock(gTaskMetricsMapLock.Get());
-  auto metrics_search = gTaskMetricsMap.Get().find(metrics->task);
-  if (metrics_search != gTaskMetricsMap.Get().end())
-    metrics_search->second = std::move(metrics);
-}
-
-size_t CronetMetricsDelegate::GetMetricsMapSize() {
-  base::AutoLock auto_lock(gTaskMetricsMapLock.Get());
-  return gTaskMetricsMap.Get().size();
-}
-
-#pragma mark - Swizzle
-
-void SwizzleSessionWithConfiguration() {
-  Class nsurlsession_class = object_getClass([NSURLSession class]);
-
-  SEL original_selector =
-      @selector(sessionWithConfiguration:delegate:delegateQueue:);
-  SEL swizzled_selector =
-      @selector(hookSessionWithConfiguration:delegate:delegateQueue:);
-
-  Method original_method =
-      class_getInstanceMethod(nsurlsession_class, original_selector);
-  Method swizzled_method =
-      class_getInstanceMethod(nsurlsession_class, swizzled_selector);
-
-  method_exchangeImplementations(original_method, swizzled_method);
-}
-
-}  // namespace cronet
diff --git a/components/cronet/ios/docs/BUILD.md b/components/cronet/ios/docs/BUILD.md
deleted file mode 100644
index 90f95a0..0000000
--- a/components/cronet/ios/docs/BUILD.md
+++ /dev/null
@@ -1,73 +0,0 @@
-# Building Cronet (on iOS)
-
-## Get source and dependencies
-### source
-- Install depot_tools per https://chromium.googlesource.com/chromium/src/+/main/docs/ios/build_instructions.md
-- Make directory for the chromium source, and then fetch:
-```
-    ~ $ mkdir chromium && cd chromium
-    ~/chromium $ fetch --nohooks ios
-```
-
-- Enter the ./src directory:
-```
-    ~/chromium $ cd src
-```
-### deps
-- Download the depenedencies
-```
-    ~/chromium/src $ gclient sync
-```
-
-## Build it!
-
-- We'll be using it a bunch, so you may want to put cr_cronet.py in your path.  Of course, you can just use its full name every time if you want...
-```
-    ~/chromium/src $ ln -s /path/to/components/cronet/tools/cr_cronet.py /somewhere/in/your/path
-```
-
-    or however else you want to do this
-
-This sets up the build directory...
-```
-    ~/chromium/src $ cr_cronet.py gn
-```
-...and this builds it!
-```
-    ~/chromium/src $ cr_cronet.py build -d out/Debug-iphonesimulator
-```
-
-- You can also use build-test to run tests on the simulator
-```
-    ~/chromium/src $ cr_cronet.py build-test -d out/Debug-iphonesimulator
-```
-
-- If you want to deploy to hardware, you will have to set up XCode for deploying to hardware, and then use cr_cronet.py gn with the -i flag (for iphoneos build), and cr_cronet.py build with either the -i flag, or using the out/Debug-iphoneos directory.
-```
-    ~/chromium/src $ cr_cronet.py gn -i
-```
-and then
-```
-    ~/chromium/src $ cr_cronet.py build -i
-```
-or
-```
-    ~/chromium/src $ cr_cronet.py build -d out/Debug-iphoneos
-```
-
-## Updating
-
-- Acquire the most recent version of the source with:
-```
-    ~/chromium/src $ cr_cronet.py sync
-```
-and then rebuild:
-```
-    ~/chromium/src $ cr_cronet.py build -d out/Debug-iphoneos
-    ~/chromium/src $ cr_cronet.py build -d out/Debug-iphonesimulator
-```
-
-For more information, you can run
-```
-    ~ $ cr_cronet.py -h
-```
diff --git a/components/cronet/ios/empty.cc b/components/cronet/ios/empty.cc
deleted file mode 100644
index df05960..0000000
--- a/components/cronet/ios/empty.cc
+++ /dev/null
@@ -1,6 +0,0 @@
-// Copyright 2016 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// An empty C++ file that is needed to trigger the usage of clang++ instead of
-// clang.
diff --git a/components/cronet/ios/ios_global_state_configuration.cc b/components/cronet/ios/ios_global_state_configuration.cc
deleted file mode 100644
index 0b3b4e2..0000000
--- a/components/cronet/ios/ios_global_state_configuration.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ios/web/public/init/ios_global_state_configuration.h"
-#include "base/task/single_thread_task_runner.h"
-
-namespace ios_global_state {
-
-scoped_refptr<base::SingleThreadTaskRunner>
-GetSharedNetworkIOThreadTaskRunner() {
-  return nullptr;
-}
-
-}  // namespace ios_global_state
diff --git a/components/cronet/ios/test/BUILD.gn b/components/cronet/ios/test/BUILD.gn
deleted file mode 100644
index 7bbdf38..0000000
--- a/components/cronet/ios/test/BUILD.gn
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2016 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/ios/rules.gni")
-import("//testing/test.gni")
-
-test("cronet_test") {
-  testonly = true
-  sources = [
-    "../../run_all_unittests.cc",
-    "cronet_acceptlang_test.mm",
-    "cronet_http_test.mm",
-    "cronet_metrics_test.mm",
-    "cronet_netlog_test.mm",
-    "cronet_performance_test.mm",
-    "cronet_pkp_test.mm",
-    "cronet_prefs_test.mm",
-    "cronet_quic_test.mm",
-    "cronet_test_base.h",
-    "cronet_test_base.mm",
-
-    # Use native stream engine instead (https://crbug.com/874542)
-    # "get_stream_engine.mm",
-    "start_cronet.h",
-    "start_cronet.mm",
-  ]
-
-  deps = [
-    "//base",
-    "//base:i18n",
-    "//components/cronet:cronet_buildflags",
-    "//components/cronet/ios:cronet_framework+link",
-    "//components/cronet/native/test:cronet_native_tests",
-    "//components/cronet/testing:test_support",
-    "//components/grpc_support:bidirectional_stream_test",
-    "//net",
-    "//net:simple_quic_tools",
-    "//net:test_support",
-    "//third_party/icu",
-  ]
-
-  defines = [ "CRONET_TESTS_IMPLEMENTATION" ]
-
-  bundle_deps = [ "//components/cronet/ios:cronet_framework+bundle" ]
-}
diff --git a/components/cronet/ios/test/DEPS b/components/cronet/ios/test/DEPS
deleted file mode 100644
index a740940..0000000
--- a/components/cronet/ios/test/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+crypto",
-]
\ No newline at end of file
diff --git a/components/cronet/ios/test/cronet_acceptlang_test.mm b/components/cronet/ios/test/cronet_acceptlang_test.mm
deleted file mode 100644
index 1c6d290..0000000
--- a/components/cronet/ios/test/cronet_acceptlang_test.mm
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// These tests are somewhat dependent on the exact contents of the
-// accept languages table generated at build-time.
-
-#import <Cronet/Cronet.h>
-#import <Foundation/Foundation.h>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-@interface Cronet (ExposedForTesting)
-+ (NSString*)getAcceptLanguagesFromPreferredLanguages:
-    (NSArray<NSString*>*)languages;
-@end
-
-namespace cronet {
-
-#define EXPECT_NSEQ(a, b) EXPECT_TRUE([(a) isEqual:(b)])
-
-TEST(AcceptLangTest, Region) {
-  NSString* acceptLangs =
-      [Cronet getAcceptLanguagesFromPreferredLanguages:@[ @"en-GB" ]];
-
-  EXPECT_NSEQ(acceptLangs, @"en-GB,en-US,en");
-}
-
-TEST(AcceptLangTest, Lang) {
-  NSString* acceptLangs =
-      [Cronet getAcceptLanguagesFromPreferredLanguages:@[ @"ja-JP" ]];
-
-  EXPECT_NSEQ(acceptLangs, @"ja,en-US,en");
-}
-
-TEST(AcceptLangTest, Default) {
-  NSString* acceptLangs =
-      [Cronet getAcceptLanguagesFromPreferredLanguages:@[ @"lol-LOL" ]];
-
-  EXPECT_NSEQ(acceptLangs, @"en-US,en");
-}
-
-TEST(AcceptLangTest, Append) {
-  NSString* acceptLangs =
-      [Cronet getAcceptLanguagesFromPreferredLanguages:@[ @"ja-JP", @"en-GB" ]];
-
-  EXPECT_NSEQ(acceptLangs, @"ja,en-US,en,en-GB");
-}
-
-TEST(AcceptLangTest, NoDefaultAppend) {
-  NSString* acceptLangs = [Cronet
-      getAcceptLanguagesFromPreferredLanguages:@[ @"en-GB", @"lol-LOL" ]];
-
-  NSLog(@"%@", acceptLangs);
-  EXPECT_NSEQ(acceptLangs, @"en-GB,en-US,en");
-}
-}
diff --git a/components/cronet/ios/test/cronet_http_test.mm b/components/cronet/ios/test/cronet_http_test.mm
deleted file mode 100644
index 12929b50..0000000
--- a/components/cronet/ios/test/cronet_http_test.mm
+++ /dev/null
@@ -1,764 +0,0 @@
-// Copyright 2015 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import <Cronet/Cronet.h>
-#import <Foundation/Foundation.h>
-
-#include <stdint.h>
-
-#include "TargetConditionals.h"
-
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/strings/sys_string_conversions.h"
-#include "components/cronet/cronet_buildflags.h"
-#include "components/cronet/ios/test/cronet_test_base.h"
-#include "components/cronet/ios/test/start_cronet.h"
-#include "components/cronet/testing/test_server/test_server.h"
-#include "net/base/mac/url_conversions.h"
-#include "net/base/net_errors.h"
-#include "net/cert/mock_cert_verifier.h"
-#include "net/test/quic_simple_test_server.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/gtest_mac.h"
-
-#include "url/gurl.h"
-
-namespace {
-
-// The buffer size of the stream for HTTPBodyStream post test.
-const NSUInteger kRequestBodyBufferLength = 1024;
-
-// The buffer size of the stream for HTTPBodyStream post test when
-// testing the stream buffered data size larger than the net stack internal
-// buffer size.
-const NSUInteger kLargeRequestBodyBufferLength = 100 * kRequestBodyBufferLength;
-
-// The body data write times for HTTPBodyStream post test.
-const NSInteger kRequestBodyWriteTimes = 16;
-}
-
-@interface StreamBodyRequestDelegate : NSObject<NSStreamDelegate>
-- (void)setOutputStream:(NSOutputStream*)outputStream;
-- (NSMutableString*)requestBody;
-@end
-@implementation StreamBodyRequestDelegate {
-  NSOutputStream* _stream;
-  NSInteger _count;
-
-  NSMutableString* _requestBody;
-}
-
-- (instancetype)init {
-  _requestBody = [NSMutableString string];
-  return self;
-}
-
-- (void)setOutputStream:(NSOutputStream*)outputStream {
-  _stream = outputStream;
-}
-
-- (NSMutableString*)requestBody {
-  return _requestBody;
-}
-
-- (void)stream:(NSStream*)stream handleEvent:(NSStreamEvent)event {
-  ASSERT_EQ(stream, _stream);
-  switch (event) {
-    case NSStreamEventHasSpaceAvailable: {
-      if (_count < kRequestBodyWriteTimes) {
-        uint8_t buffer[kRequestBodyBufferLength];
-        memset(buffer, 'a' + _count, kRequestBodyBufferLength);
-        NSUInteger bytes_write =
-            [_stream write:buffer maxLength:kRequestBodyBufferLength];
-        ASSERT_EQ(kRequestBodyBufferLength, bytes_write);
-        [_requestBody appendString:[[NSString alloc]
-                                       initWithBytes:buffer
-                                              length:kRequestBodyBufferLength
-                                            encoding:NSUTF8StringEncoding]];
-        ++_count;
-      } else {
-        [_stream close];
-      }
-      break;
-    }
-    case NSStreamEventErrorOccurred:
-    case NSStreamEventEndEncountered: {
-      [_stream close];
-      [_stream setDelegate:nil];
-      [_stream removeFromRunLoop:[NSRunLoop currentRunLoop]
-                         forMode:NSDefaultRunLoopMode];
-      break;
-    }
-    default:
-      break;
-  }
-}
-@end
-
-namespace cronet {
-const char kUserAgent[] = "CronetTest/1.0.0.0";
-
-class HttpTest : public CronetTestBase {
- protected:
-  HttpTest() {}
-  ~HttpTest() override {}
-
-  void SetUp() override {
-    CronetTestBase::SetUp();
-    TestServer::Start();
-
-    [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-      return YES;
-    }];
-    StartCronet(net::QuicSimpleTestServer::GetPort());
-    [Cronet registerHttpProtocolHandler];
-    NSURLSessionConfiguration* config =
-        [NSURLSessionConfiguration ephemeralSessionConfiguration];
-    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
-    [Cronet installIntoSessionConfiguration:config];
-    session_ = [NSURLSession sessionWithConfiguration:config
-                                             delegate:delegate_
-                                        delegateQueue:nil];
-  }
-
-  void TearDown() override {
-    TestServer::Shutdown();
-
-    [Cronet stopNetLog];
-    [Cronet shutdownForTesting];
-    CronetTestBase::TearDown();
-  }
-
-  NSURLSession* session_;
-};
-
-TEST_F(HttpTest, CreateSslKeyLogFile) {
-  // Shutdown Cronet so that it can be restarted with specific configuration
-  // (SSL key log file specified in experimental options) for this one test.
-  // This is necessary because SslKeyLogFile can only be set once, before any
-  // SSL Client Sockets are created.
-
-  [Cronet shutdownForTesting];
-
-  NSString* ssl_key_log_file = [Cronet getNetLogPathForFile:@"SSLKEYLOGFILE"];
-
-  // Ensure that the keylog file doesn't exist.
-  [[NSFileManager defaultManager] removeItemAtPath:ssl_key_log_file error:nil];
-
-  [Cronet setExperimentalOptions:
-              [NSString stringWithFormat:@"{\"ssl_key_log_file\":\"%@\"}",
-                                         ssl_key_log_file]];
-
-  StartCronet(net::QuicSimpleTestServer::GetPort());
-
-  bool ssl_file_created =
-      [[NSFileManager defaultManager] fileExistsAtPath:ssl_key_log_file];
-
-  [[NSFileManager defaultManager] removeItemAtPath:ssl_key_log_file error:nil];
-
-  [Cronet shutdownForTesting];
-  [Cronet setExperimentalOptions:@""];
-
-  EXPECT_TRUE(ssl_file_created);
-}
-
-TEST_F(HttpTest, NSURLSessionReceivesData) {
-  NSURL* url = net::NSURLWithGURL(net::QuicSimpleTestServer::GetSimpleURL());
-  __block BOOL block_used = NO;
-  NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-  [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-    block_used = YES;
-    EXPECT_EQ([request URL], url);
-    return YES;
-  }];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_TRUE(block_used);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_EQ(net::QuicSimpleTestServer::GetSimpleBodyValue(),
-            base::SysNSStringToUTF8([delegate_ responseBody]));
-}
-
-// https://crbug.com/830005 Disable histogram support to reduce binary size.
-#if BUILDFLAG(DISABLE_HISTOGRAM_SUPPORT)
-#define MAYBE_GetGlobalMetricsDeltas DISABLED_GetGlobalMetricsDeltas
-#else  // BUILDFLAG(DISABLE_HISTOGRAM_SUPPORT)
-#define MAYBE_GetGlobalMetricsDeltas GetGlobalMetricsDeltas
-#endif  // BUILDFLAG(DISABLE_HISTOGRAM_SUPPORT)
-TEST_F(HttpTest, MAYBE_GetGlobalMetricsDeltas) {
-  NSData* delta1 = [Cronet getGlobalMetricsDeltas];
-  NSURL* url = net::NSURLWithGURL(net::QuicSimpleTestServer::GetSimpleURL());
-  NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_EQ(net::QuicSimpleTestServer::GetSimpleBodyValue(),
-            base::SysNSStringToUTF8([delegate_ responseBody]));
-
-  NSData* delta2 = [Cronet getGlobalMetricsDeltas];
-  EXPECT_FALSE([delta2 isEqualToData:delta1]);
-}
-
-TEST_F(HttpTest, SdchDisabledByDefault) {
-  NSURL* url =
-      net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL("Accept-Encoding")));
-  NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_FALSE([[delegate_ responseBody] containsString:@"sdch"]);
-}
-
-// Verify that explictly setting Accept-Encoding request header to 'gzip,sdch"
-// is passed to the server and does not trigger any failures. This behavior may
-// In the future Cronet may not allow caller to set Accept-Encoding header and
-// could limit it to set of internally suported and enabled encodings, matching
-// behavior of Cronet on Android.
-TEST_F(HttpTest, AcceptEncodingSdchIsAllowed) {
-  NSURL* url =
-      net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL("Accept-Encoding")));
-  NSMutableURLRequest* mutableRequest =
-      [[NSURLRequest requestWithURL:url] mutableCopy];
-  [mutableRequest addValue:@"gzip,sdch" forHTTPHeaderField:@"Accept-Encoding"];
-  NSURLSessionDataTask* task = [session_ dataTaskWithRequest:mutableRequest];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_TRUE([[delegate_ responseBody] containsString:@"gzip,sdch"]);
-}
-
-// Verify that explictly setting Accept-Encoding request header to 'foo,bar"
-// is passed to the server and does not trigger any failures. This behavior may
-// In the future Cronet may not allow caller to set Accept-Encoding header and
-// could limit it to set of internally suported and enabled encodings, matching
-// behavior of Cronet on Android.
-TEST_F(HttpTest, AcceptEncodingFooBarIsAllowed) {
-  NSURL* url =
-      net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL("Accept-Encoding")));
-  NSMutableURLRequest* mutableRequest =
-      [[NSURLRequest requestWithURL:url] mutableCopy];
-  [mutableRequest addValue:@"foo,bar" forHTTPHeaderField:@"Accept-Encoding"];
-  NSURLSessionDataTask* task = [session_ dataTaskWithRequest:mutableRequest];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_TRUE([[delegate_ responseBody] containsString:@"foo,bar"]);
-}
-
-TEST_F(HttpTest, NSURLSessionAcceptLanguage) {
-  NSURL* url =
-      net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL("Accept-Language")));
-  NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_EQ(nil, [delegate_ error]);
-  ASSERT_STREQ("en-US,en",
-               base::SysNSStringToUTF8([delegate_ responseBody]).c_str());
-}
-
-TEST_F(HttpTest, SetUserAgentIsExact) {
-  NSURL* url =
-      net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL("User-Agent")));
-  [Cronet setRequestFilterBlock:nil];
-  NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_STREQ(kUserAgent,
-               base::SysNSStringToUTF8([delegate_ responseBody]).c_str());
-}
-
-TEST_F(HttpTest, SetUserAgentIsAllowed) {
-  NSURL* url =
-      net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL("User-Agent")));
-  NSMutableURLRequest* mutableRequest =
-      [[NSURLRequest requestWithURL:url] mutableCopy];
-  [mutableRequest addValue:@"foo,bar" forHTTPHeaderField:@"User-Agent"];
-  NSURLSessionDataTask* task = [session_ dataTaskWithRequest:mutableRequest];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_TRUE([[delegate_ responseBody] containsString:@"foo,bar"]);
-
-  // Now check to see if the User-Agent string is restored to default when
-  // creating a new task from a request.
-  mutableRequest = [[NSURLRequest requestWithURL:url] mutableCopy];
-  task = [session_ dataTaskWithRequest:mutableRequest];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_STREQ(kUserAgent,
-               base::SysNSStringToUTF8([delegate_ responseBody]).c_str());
-}
-
-TEST_F(HttpTest, SetCookie) {
-  const char kCookieHeader[] = "Cookie";
-  NSString* cookieName =
-      [NSString stringWithFormat:@"SetCookie-%@", [[NSUUID UUID] UUIDString]];
-  NSString* cookieValue = [[NSUUID UUID] UUIDString];
-  NSString* cookieLine =
-      [NSString stringWithFormat:@"%@=%@", cookieName, cookieValue];
-  NSHTTPCookieStorage* systemCookieStorage =
-      [NSHTTPCookieStorage sharedHTTPCookieStorage];
-  NSURL* cookieUrl =
-      net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL(kCookieHeader)));
-  // Verify that cookie is not set in system storage.
-  for (NSHTTPCookie* cookie in [systemCookieStorage cookiesForURL:cookieUrl]) {
-    EXPECT_FALSE([[cookie name] isEqualToString:cookieName]);
-  }
-
-  StartDataTaskAndWaitForCompletion([session_ dataTaskWithURL:cookieUrl]);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_STREQ("Header not found. :(",
-               base::SysNSStringToUTF8([delegate_ responseBody]).c_str());
-
-  NSURL* setCookieUrl = net::NSURLWithGURL(
-      GURL(TestServer::GetSetCookieURL(base::SysNSStringToUTF8(cookieLine))));
-  StartDataTaskAndWaitForCompletion([session_ dataTaskWithURL:setCookieUrl]);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_TRUE([[delegate_ responseBody] containsString:cookieLine]);
-
-  StartDataTaskAndWaitForCompletion([session_ dataTaskWithURL:cookieUrl]);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_TRUE([[delegate_ responseBody] containsString:cookieLine]);
-
-  // Verify that cookie is set in system storage.
-  NSHTTPCookie* systemCookie = nil;
-  for (NSHTTPCookie* cookie in [systemCookieStorage cookiesForURL:cookieUrl]) {
-    if ([cookie.name isEqualToString:cookieName]) {
-      systemCookie = cookie;
-      break;
-    }
-  }
-  EXPECT_TRUE([[systemCookie value] isEqualToString:cookieValue]);
-  [systemCookieStorage deleteCookie:systemCookie];
-}
-
-TEST_F(HttpTest, SetSystemCookie) {
-  const char kCookieHeader[] = "Cookie";
-  NSString* cookieName = [NSString
-      stringWithFormat:@"SetSystemCookie-%@", [[NSUUID UUID] UUIDString]];
-  NSString* cookieValue = [[NSUUID UUID] UUIDString];
-  NSHTTPCookieStorage* systemCookieStorage =
-      [NSHTTPCookieStorage sharedHTTPCookieStorage];
-  NSURL* echoCookieUrl =
-      net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL(kCookieHeader)));
-  NSHTTPCookie* systemCookie = [NSHTTPCookie cookieWithProperties:@{
-    NSHTTPCookiePath : [echoCookieUrl path],
-    NSHTTPCookieName : cookieName,
-    NSHTTPCookieValue : cookieValue,
-    NSHTTPCookieDomain : [echoCookieUrl host],
-  }];
-  [systemCookieStorage setCookie:systemCookie];
-
-  StartDataTaskAndWaitForCompletion([session_ dataTaskWithURL:echoCookieUrl]);
-  [systemCookieStorage deleteCookie:systemCookie];
-  EXPECT_EQ(nil, [delegate_ error]);
-  // Verify that cookie set in system store was sent to the serever.
-  EXPECT_TRUE([[delegate_ responseBody] containsString:cookieName]);
-  EXPECT_TRUE([[delegate_ responseBody] containsString:cookieValue]);
-}
-
-TEST_F(HttpTest, SystemCookieWithNullCreationTime) {
-  const char kCookieHeader[] = "Cookie";
-  NSString* cookieName = [NSString
-      stringWithFormat:@"SetSystemCookie-%@", [[NSUUID UUID] UUIDString]];
-  NSString* cookieValue = [[NSUUID UUID] UUIDString];
-  NSHTTPCookieStorage* systemCookieStorage =
-      [NSHTTPCookieStorage sharedHTTPCookieStorage];
-  NSURL* echoCookieUrl =
-      net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL(kCookieHeader)));
-  NSHTTPCookie* nullCreationTimeCookie = [NSHTTPCookie cookieWithProperties:@{
-    NSHTTPCookiePath : [echoCookieUrl path],
-    NSHTTPCookieName : cookieName,
-    NSHTTPCookieValue : cookieValue,
-    NSHTTPCookieDomain : [echoCookieUrl host],
-    @"Created" : [NSNumber numberWithDouble:0.0],
-  }];
-  [systemCookieStorage setCookie:nullCreationTimeCookie];
-  NSHTTPCookie* normalCookie = [NSHTTPCookie cookieWithProperties:@{
-    NSHTTPCookiePath : [echoCookieUrl path],
-    NSHTTPCookieName : [cookieName stringByAppendingString:@"-normal"],
-    NSHTTPCookieValue : cookieValue,
-    NSHTTPCookieDomain : [echoCookieUrl host],
-  }];
-  [systemCookieStorage setCookie:normalCookie];
-  StartDataTaskAndWaitForCompletion([session_ dataTaskWithURL:echoCookieUrl]);
-  [systemCookieStorage deleteCookie:nullCreationTimeCookie];
-  [systemCookieStorage deleteCookie:normalCookie];
-  EXPECT_EQ(nil, [delegate_ error]);
-  // Verify that cookie set in system store was sent to the serever.
-  EXPECT_TRUE([[delegate_ responseBody] containsString:cookieName]);
-  EXPECT_TRUE([[delegate_ responseBody] containsString:cookieValue]);
-}
-
-TEST_F(HttpTest, FilterOutRequest) {
-  NSURL* url =
-      net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL("User-Agent")));
-  __block BOOL block_used = NO;
-  NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-  [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-    block_used = YES;
-    EXPECT_EQ([request URL], url);
-    return NO;
-  }];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_TRUE(block_used);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_FALSE([[delegate_ responseBody]
-      containsString:base::SysUTF8ToNSString(kUserAgent)]);
-  EXPECT_TRUE([[delegate_ responseBody] containsString:@"CFNetwork"]);
-}
-
-TEST_F(HttpTest, FileSchemeNotSupported) {
-  NSString* fileData = @"Hello, World!";
-  NSString* documentsDirectory = [NSSearchPathForDirectoriesInDomains(
-      NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
-  NSString* filePath = [documentsDirectory
-      stringByAppendingPathComponent:[[NSProcessInfo processInfo]
-                                         globallyUniqueString]];
-  [fileData writeToFile:filePath
-             atomically:YES
-               encoding:NSUTF8StringEncoding
-                  error:nil];
-
-  NSURL* url = [NSURL fileURLWithPath:filePath];
-  NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-  [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-    [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
-    EXPECT_TRUE(false) << "Block should not be called for unsupported requests";
-    return YES;
-  }];
-  StartDataTaskAndWaitForCompletion(task);
-  [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_TRUE([[delegate_ responseBody] containsString:fileData]);
-}
-
-TEST_F(HttpTest, DataSchemeNotSupported) {
-  NSString* testString = @"Hello, World!";
-  NSData* testData = [testString dataUsingEncoding:NSUTF8StringEncoding];
-  NSString* dataString =
-      [NSString stringWithFormat:@"data:text/plain;base64,%@",
-                                 [testData base64EncodedStringWithOptions:0]];
-  NSURL* url = [NSURL URLWithString:dataString];
-  NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-  [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-    EXPECT_TRUE(false) << "Block should not be called for unsupported requests";
-    return YES;
-  }];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_TRUE([[delegate_ responseBody] containsString:testString]);
-}
-
-TEST_F(HttpTest, BrotliAdvertisedTest) {
-  [Cronet shutdownForTesting];
-
-  [Cronet setBrotliEnabled:YES];
-
-  StartCronet(net::QuicSimpleTestServer::GetPort());
-
-  NSURL* url =
-      net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL("Accept-Encoding")));
-  NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_TRUE([[delegate_ responseBody] containsString:@"br"]);
-}
-
-TEST_F(HttpTest, BrotliNotAdvertisedTest) {
-  [Cronet shutdownForTesting];
-
-  [Cronet setBrotliEnabled:NO];
-
-  StartCronet(net::QuicSimpleTestServer::GetPort());
-
-  NSURL* url =
-      net::NSURLWithGURL(GURL(TestServer::GetEchoHeaderURL("Accept-Encoding")));
-  NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_FALSE([[delegate_ responseBody] containsString:@"br"]);
-}
-
-TEST_F(HttpTest, BrotliHandleDecoding) {
-  [Cronet shutdownForTesting];
-
-  [Cronet setBrotliEnabled:YES];
-
-  StartCronet(net::QuicSimpleTestServer::GetPort());
-
-  NSURL* url =
-      net::NSURLWithGURL(GURL(TestServer::GetUseEncodingURL("brotli")));
-  NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-  StartDataTaskAndWaitForCompletion(task);
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_STREQ(base::SysNSStringToUTF8([delegate_ responseBody]).c_str(),
-               "The quick brown fox jumps over the lazy dog");
-}
-
-TEST_F(HttpTest, PostRequest) {
-  // Create request body.
-  NSString* request_body = [NSString stringWithFormat:@"Post Data %i", rand()];
-  NSData* post_data = [request_body dataUsingEncoding:NSUTF8StringEncoding];
-
-  // Prepare the request.
-  NSURL* url = net::NSURLWithGURL(GURL(TestServer::GetEchoRequestBodyURL()));
-  NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url];
-  request.HTTPMethod = @"POST";
-  request.HTTPBody = post_data;
-
-  // Set the request filter to check that the request was handled by the Cronet
-  // stack.
-  __block BOOL block_used = NO;
-  [Cronet setRequestFilterBlock:^(NSURLRequest* req) {
-    block_used = YES;
-    EXPECT_EQ([req URL], url);
-    return YES;
-  }];
-
-  // Send the request and wait for the response.
-  NSURLSessionDataTask* data_task = [session_ dataTaskWithRequest:request];
-  StartDataTaskAndWaitForCompletion(data_task);
-
-  // Verify that the response from the server matches the request body.
-  NSString* response_body = [delegate_ responseBody];
-  ASSERT_EQ(nil, [delegate_ error]);
-  ASSERT_STREQ(base::SysNSStringToUTF8(request_body).c_str(),
-               base::SysNSStringToUTF8(response_body).c_str());
-  ASSERT_TRUE(block_used);
-}
-
-TEST_F(HttpTest, PostRequestWithLargeBody) {
-  // Create request body.
-  std::string request_body(kLargeRequestBodyBufferLength, 'z');
-  NSData* post_data = [NSData dataWithBytes:request_body.c_str()
-                                     length:request_body.length()];
-
-  // Prepare the request.
-  NSURL* url = net::NSURLWithGURL(GURL(TestServer::GetEchoRequestBodyURL()));
-  NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url];
-  request.HTTPMethod = @"POST";
-  request.HTTPBody = post_data;
-
-  // Set the request filter to check that the request was handled by the Cronet
-  // stack.
-  __block BOOL block_used = NO;
-  [Cronet setRequestFilterBlock:^(NSURLRequest* req) {
-    block_used = YES;
-    EXPECT_EQ([req URL], url);
-    return YES;
-  }];
-
-  // Send the request and wait for the response.
-  NSURLSessionDataTask* data_task = [session_ dataTaskWithRequest:request];
-  StartDataTaskAndWaitForCompletion(data_task);
-
-  // Verify that the response from the server matches the request body.
-  NSString* response_body = [delegate_ responseBody];
-  ASSERT_EQ(nil, [delegate_ error]);
-  ASSERT_STREQ(request_body.c_str(),
-               base::SysNSStringToUTF8(response_body).c_str());
-  ASSERT_TRUE(block_used);
-}
-
-// Verify the chunked request body upload function.
-TEST_F(HttpTest, PostRequestWithBodyStream) {
-  // Create request body stream.
-  CFReadStreamRef read_stream = NULL;
-  CFWriteStreamRef write_stream = NULL;
-  CFStreamCreateBoundPair(NULL, &read_stream, &write_stream,
-                          kRequestBodyBufferLength);
-
-  NSInputStream* input_stream = CFBridgingRelease(read_stream);
-  NSOutputStream* output_stream = CFBridgingRelease(write_stream);
-
-  StreamBodyRequestDelegate* stream_delegate =
-      [[StreamBodyRequestDelegate alloc] init];
-  output_stream.delegate = stream_delegate;
-  [stream_delegate setOutputStream:output_stream];
-
-  dispatch_queue_t queue =
-      dispatch_queue_create("data upload queue", DISPATCH_QUEUE_SERIAL);
-  dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
-  dispatch_async(queue, ^{
-    [output_stream scheduleInRunLoop:[NSRunLoop currentRunLoop]
-                             forMode:NSDefaultRunLoopMode];
-    [output_stream open];
-
-    [[NSRunLoop currentRunLoop]
-        runUntilDate:[NSDate dateWithTimeIntervalSinceNow:10.0]];
-
-    dispatch_semaphore_signal(semaphore);
-  });
-
-  // Prepare the request.
-  NSURL* url = net::NSURLWithGURL(GURL(TestServer::GetEchoRequestBodyURL()));
-  NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url];
-  request.HTTPMethod = @"POST";
-  request.HTTPBodyStream = input_stream;
-
-  // Set the request filter to check that the request was handled by the Cronet
-  // stack.
-  __block BOOL block_used = NO;
-  [Cronet setRequestFilterBlock:^(NSURLRequest* req) {
-    block_used = YES;
-    EXPECT_EQ([req URL], url);
-    return YES;
-  }];
-
-  // Send the request and wait for the response.
-  NSURLSessionDataTask* data_task = [session_ dataTaskWithRequest:request];
-  StartDataTaskAndWaitForCompletion(data_task);
-
-  // Verify that the response from the server matches the request body.
-  ASSERT_EQ(nil, [delegate_ error]);
-  NSString* response_body = [delegate_ responseBody];
-  NSMutableString* request_body = [stream_delegate requestBody];
-  ASSERT_STREQ(base::SysNSStringToUTF8(request_body).c_str(),
-               base::SysNSStringToUTF8(response_body).c_str());
-  ASSERT_TRUE(block_used);
-
-  // Wait for the run loop of the child thread exits. Timeout is 5 seconds.
-  dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC);
-  ASSERT_EQ(0, dispatch_semaphore_wait(semaphore, timeout));
-}
-
-// Verify that the chunked data uploader can correctly handle the request body
-// if the stream contains data length exceed the internal upload buffer.
-TEST_F(HttpTest, PostRequestWithLargeBodyStream) {
-  // Create request body stream.
-  CFReadStreamRef read_stream = NULL;
-  CFWriteStreamRef write_stream = NULL;
-  // 100KB data is written in one time.
-  CFStreamCreateBoundPair(NULL, &read_stream, &write_stream,
-                          kLargeRequestBodyBufferLength);
-
-  NSInputStream* input_stream = CFBridgingRelease(read_stream);
-  NSOutputStream* output_stream = CFBridgingRelease(write_stream);
-  [output_stream open];
-
-  uint8_t buffer[kLargeRequestBodyBufferLength];
-  memset(buffer, 'a', kLargeRequestBodyBufferLength);
-  NSUInteger bytes_write =
-      [output_stream write:buffer maxLength:kLargeRequestBodyBufferLength];
-  ASSERT_EQ(kLargeRequestBodyBufferLength, bytes_write);
-  [output_stream close];
-
-  // Prepare the request.
-  NSURL* url = net::NSURLWithGURL(GURL(TestServer::GetEchoRequestBodyURL()));
-  NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url];
-  request.HTTPMethod = @"POST";
-  request.HTTPBodyStream = input_stream;
-
-  // Set the request filter to check that the request was handled by the Cronet
-  // stack.
-  __block BOOL block_used = NO;
-  [Cronet setRequestFilterBlock:^(NSURLRequest* req) {
-    block_used = YES;
-    EXPECT_EQ([req URL], url);
-    return YES;
-  }];
-
-  // Send the request and wait for the response.
-  NSURLSessionDataTask* data_task = [session_ dataTaskWithRequest:request];
-  StartDataTaskAndWaitForCompletion(data_task);
-
-  // Verify that the response from the server matches the request body.
-  ASSERT_EQ(nil, [delegate_ error]);
-  NSString* response_body = [delegate_ responseBody];
-  ASSERT_EQ(kLargeRequestBodyBufferLength, [response_body length]);
-  ASSERT_TRUE(block_used);
-}
-
-// iOS Simulator doesn't support changing thread priorities.
-// Therefore, run these tests only on a physical device.
-#if TARGET_OS_SIMULATOR
-#define MAYBE_ChangeThreadPriorityAfterStart \
-  DISABLED_ChangeThreadPriorityAfterStart
-#define MAYBE_ChangeThreadPriorityBeforeStart \
-  DISABLED_ChangeThreadPriorityBeforeStart
-#else
-#define MAYBE_ChangeThreadPriorityAfterStart ChangeThreadPriorityAfterStart
-#define MAYBE_ChangeThreadPriorityBeforeStart ChangeThreadPriorityBeforeStart
-#endif  // TARGET_OS_SIMULATOR
-
-// Tests that the network thread priority can be changed after
-// Cronet has been started.
-TEST_F(HttpTest, MAYBE_ChangeThreadPriorityAfterStart) {
-  // Get current (default) priority of the network thread.
-  __block double default_priority;
-  PostBlockToNetworkThread(FROM_HERE, ^{
-    default_priority = NSThread.threadPriority;
-  });
-
-  // Modify the network thread priority.
-  const double new_priority = 1.0;
-  [Cronet setNetworkThreadPriority:new_priority];
-
-  // Get modified priority of the network thread.
-  dispatch_semaphore_t lock = dispatch_semaphore_create(0);
-  __block double actual_priority;
-  PostBlockToNetworkThread(FROM_HERE, ^{
-    actual_priority = NSThread.threadPriority;
-    dispatch_semaphore_signal(lock);
-  });
-
-  // Wait until the posted tasks are completed.
-  dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
-
-  EXPECT_EQ(0.5, default_priority);
-
-  // Check that the priority was modified and is close to the set priority.
-  EXPECT_TRUE(abs(actual_priority - new_priority) < 0.01)
-      << "Unexpected thread priority. Expected " << new_priority << " but got "
-      << actual_priority;
-}
-
-// Tests that the network thread priority can be changed before
-// Cronet has been started.
-TEST_F(HttpTest, MAYBE_ChangeThreadPriorityBeforeStart) {
-  // Start a new Cronet engine modifying the network thread priority before the
-  // start.
-  [Cronet shutdownForTesting];
-  const double new_priority = 0.8;
-  [Cronet setNetworkThreadPriority:new_priority];
-  [Cronet start];
-
-  // Get modified priority of the network thread.
-  dispatch_semaphore_t lock = dispatch_semaphore_create(0);
-  __block double actual_priority;
-  PostBlockToNetworkThread(FROM_HERE, ^{
-    actual_priority = NSThread.threadPriority;
-    dispatch_semaphore_signal(lock);
-  });
-
-  // Wait until the posted task is completed.
-  dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
-
-  // Check that the priority was modified and is close to the set priority.
-  EXPECT_TRUE(abs(actual_priority - new_priority) < 0.01)
-      << "Unexpected thread priority. Expected " << new_priority << " but got "
-      << actual_priority;
-}
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-TEST_F(HttpTest, LegacyApi) {
-  NSURL* url = net::NSURLWithGURL(net::QuicSimpleTestServer::GetSimpleURL());
-
-  __block BOOL block_used = NO;
-  [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-    block_used = YES;
-    EXPECT_EQ(request.URL, url);
-    return YES;
-  }];
-
-  NSURLRequest* request = [NSURLRequest requestWithURL:url];
-  NSError* err;
-  NSHTTPURLResponse* response;
-  [NSURLConnection sendSynchronousRequest:request
-                        returningResponse:&response
-                                    error:&err];
-
-  EXPECT_EQ(200, [response statusCode]);
-  EXPECT_TRUE(block_used);
-  EXPECT_FALSE(err);
-}
-#pragma clang diagnostic pop
-
-}  // namespace cronet
diff --git a/components/cronet/ios/test/cronet_metrics_test.mm b/components/cronet/ios/test/cronet_metrics_test.mm
deleted file mode 100644
index e6dba273..0000000
--- a/components/cronet/ios/test/cronet_metrics_test.mm
+++ /dev/null
@@ -1,433 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import <Cronet/Cronet.h>
-
-#include "base/strings/sys_string_conversions.h"
-#include "components/cronet/ios/test/cronet_test_base.h"
-#include "components/cronet/ios/test/start_cronet.h"
-#include "components/cronet/testing/test_server/test_server.h"
-#import "net/base/mac/url_conversions.h"
-#include "net/test/quic_simple_test_server.h"
-#include "testing/gtest_mac.h"
-#include "url/gurl.h"
-
-// Forward declaration of class in cronet_metrics.h for testing.
-NS_AVAILABLE_IOS(10.0)
-@interface CronetTransactionMetrics : NSURLSessionTaskTransactionMetrics
-@end
-
-namespace cronet {
-
-class CronetMetricsTest : public CronetTestBase {
- protected:
-  void SetUpWithMetrics(BOOL metrics_enabled) {
-    TestServer::Start();
-
-    [Cronet setMetricsEnabled:metrics_enabled];
-    StartCronet(net::QuicSimpleTestServer::GetPort());
-
-    [Cronet registerHttpProtocolHandler];
-    NSURLSessionConfiguration* config =
-        [NSURLSessionConfiguration ephemeralSessionConfiguration];
-    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
-    [Cronet installIntoSessionConfiguration:config];
-    session_ = [NSURLSession sessionWithConfiguration:config
-                                             delegate:delegate_
-                                        delegateQueue:nil];
-  }
-
-  void TearDown() override {
-    [Cronet shutdownForTesting];
-
-    TestServer::Shutdown();
-    CronetTestBase::TearDown();
-  }
-
-  NSURLSession* session_;
-};
-
-class CronetEnabledMetricsTest : public CronetMetricsTest {
- protected:
-  void SetUp() override {
-    CronetMetricsTest::SetUp();
-    SetUpWithMetrics(YES);
-  }
-};
-
-class CronetDisabledMetricsTest : public CronetMetricsTest {
- protected:
-  void SetUp() override {
-    CronetMetricsTest::SetUp();
-    SetUpWithMetrics(NO);
-  }
-};
-
-// Tests that metrics data is sane for a QUIC request.
-TEST_F(CronetEnabledMetricsTest, ProtocolIsQuic) {
-  if (@available(iOS 10.2, *)) {
-    NSURL* url = net::NSURLWithGURL(net::QuicSimpleTestServer::GetSimpleURL());
-
-    __block BOOL block_used = NO;
-    NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-    [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-      block_used = YES;
-      EXPECT_EQ(request.URL, url);
-      return YES;
-    }];
-    StartDataTaskAndWaitForCompletion(task);
-    EXPECT_TRUE(block_used);
-    EXPECT_EQ(nil, [delegate_ error]);
-    EXPECT_EQ(net::QuicSimpleTestServer::GetSimpleBodyValue(),
-              base::SysNSStringToUTF8([delegate_ responseBody]));
-
-    NSURLSessionTaskMetrics* task_metrics = delegate_.taskMetrics;
-    ASSERT_TRUE(task_metrics);
-    ASSERT_EQ(1lU, task_metrics.transactionMetrics.count);
-    NSURLSessionTaskTransactionMetrics* metrics =
-        task_metrics.transactionMetrics.firstObject;
-    EXPECT_TRUE([metrics isMemberOfClass:[CronetTransactionMetrics class]]);
-
-    // Confirm that metrics data is the correct type.
-    EXPECT_TRUE([metrics.fetchStartDate isKindOfClass:[NSDate class]]);
-    EXPECT_TRUE([metrics.domainLookupStartDate isKindOfClass:[NSDate class]]);
-    EXPECT_TRUE([metrics.domainLookupEndDate isKindOfClass:[NSDate class]]);
-    EXPECT_TRUE([metrics.connectStartDate isKindOfClass:[NSDate class]]);
-    EXPECT_TRUE(
-        [metrics.secureConnectionStartDate isKindOfClass:[NSDate class]]);
-    EXPECT_TRUE([metrics.secureConnectionEndDate isKindOfClass:[NSDate class]]);
-    EXPECT_TRUE([metrics.connectEndDate isKindOfClass:[NSDate class]]);
-    EXPECT_TRUE([metrics.requestStartDate isKindOfClass:[NSDate class]]);
-    EXPECT_TRUE([metrics.requestEndDate isKindOfClass:[NSDate class]]);
-    EXPECT_TRUE([metrics.responseStartDate isKindOfClass:[NSDate class]]);
-    EXPECT_TRUE([metrics.responseEndDate isKindOfClass:[NSDate class]]);
-    EXPECT_TRUE([metrics.networkProtocolName isKindOfClass:[NSString class]]);
-
-    // Confirm that the metrics values are sane.
-    EXPECT_NE(NSOrderedDescending, [metrics.domainLookupStartDate
-                                       compare:metrics.domainLookupEndDate]);
-    EXPECT_NE(NSOrderedDescending,
-              [metrics.connectStartDate compare:metrics.connectEndDate]);
-    EXPECT_NE(NSOrderedDescending,
-              [metrics.secureConnectionStartDate
-                  compare:metrics.secureConnectionEndDate]);
-    EXPECT_NE(NSOrderedDescending,
-              [metrics.requestStartDate compare:metrics.requestEndDate]);
-    EXPECT_NE(NSOrderedDescending,
-              [metrics.responseStartDate compare:metrics.responseEndDate]);
-
-    EXPECT_FALSE(metrics.proxyConnection);
-
-    EXPECT_TRUE([metrics.networkProtocolName containsString:@"quic"] ||
-                [metrics.networkProtocolName containsString:@"h3"])
-        << base::SysNSStringToUTF8(metrics.networkProtocolName);
-  }
-}
-
-// Tests that metrics data is sane for an HTTP/1.1 request.
-TEST_F(CronetEnabledMetricsTest, ProtocolIsNotQuic) {
-  if (@available(iOS 10.2, *)) {
-    NSURL* url = net::NSURLWithGURL(GURL(TestServer::GetSimpleURL()));
-
-    __block BOOL block_used = NO;
-    NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-    [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-      block_used = YES;
-      EXPECT_EQ(request.URL, url);
-      return YES;
-    }];
-    StartDataTaskAndWaitForCompletion(task);
-    EXPECT_TRUE(block_used);
-    EXPECT_EQ(nil, [delegate_ error]);
-    EXPECT_STREQ("The quick brown fox jumps over the lazy dog.",
-                 base::SysNSStringToUTF8([delegate_ responseBody]).c_str());
-
-    NSURLSessionTaskMetrics* task_metrics = delegate_.taskMetrics;
-    ASSERT_TRUE(task_metrics);
-    ASSERT_EQ(1lU, task_metrics.transactionMetrics.count);
-    NSURLSessionTaskTransactionMetrics* metrics =
-        task_metrics.transactionMetrics.firstObject;
-    EXPECT_TRUE([metrics isMemberOfClass:[CronetTransactionMetrics class]]);
-
-    EXPECT_NSEQ(metrics.networkProtocolName, @"http/1.1");
-  }
-}
-
-// Tests that Cronet provides similar metrics data to iOS.
-TEST_F(CronetEnabledMetricsTest, PlatformComparison) {
-  if (@available(iOS 10.2, *)) {
-    NSURL* url = net::NSURLWithGURL(GURL(TestServer::GetSimpleURL()));
-
-    // Perform a connection using Cronet.
-
-    __block BOOL block_used = NO;
-    NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-    [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-      block_used = YES;
-      EXPECT_EQ(request.URL, url);
-      return YES;
-    }];
-    StartDataTaskAndWaitForCompletion(task);
-    EXPECT_TRUE(block_used);
-    EXPECT_EQ(nil, [delegate_ error]);
-    EXPECT_STREQ("The quick brown fox jumps over the lazy dog.",
-                 base::SysNSStringToUTF8([delegate_ responseBody]).c_str());
-
-    NSURLSessionTaskMetrics* cronet_task_metrics = delegate_.taskMetrics;
-    ASSERT_TRUE(cronet_task_metrics);
-    ASSERT_EQ(1lU, cronet_task_metrics.transactionMetrics.count);
-    NSURLSessionTaskTransactionMetrics* cronet_metrics =
-        cronet_task_metrics.transactionMetrics.firstObject;
-
-    // Perform a connection using the platform stack.
-
-    block_used = NO;
-    task = [session_ dataTaskWithURL:url];
-    [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-      block_used = YES;
-      EXPECT_EQ(request.URL, url);
-      return NO;
-    }];
-    StartDataTaskAndWaitForCompletion(task);
-    EXPECT_TRUE(block_used);
-    EXPECT_EQ(nil, [delegate_ error]);
-    EXPECT_STREQ("The quick brown fox jumps over the lazy dog.",
-                 base::SysNSStringToUTF8([delegate_ responseBody]).c_str());
-
-    NSURLSessionTaskMetrics* platform_task_metrics = delegate_.taskMetrics;
-    ASSERT_TRUE(platform_task_metrics);
-    ASSERT_EQ(1lU, platform_task_metrics.transactionMetrics.count);
-    NSURLSessionTaskTransactionMetrics* platform_metrics =
-        platform_task_metrics.transactionMetrics.firstObject;
-
-    // Compare platform and Cronet metrics data.
-
-    EXPECT_NSEQ(cronet_metrics.networkProtocolName,
-                platform_metrics.networkProtocolName);
-  }
-}
-
-// Tests that the metrics API behaves sanely when making a request to an
-// invalid URL.
-TEST_F(CronetEnabledMetricsTest, InvalidURL) {
-  if (@available(iOS 10.2, *)) {
-    NSURL* url = net::NSURLWithGURL(GURL("http://notfound.example.com"));
-
-    __block BOOL block_used = NO;
-    NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-    [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-      block_used = YES;
-      EXPECT_EQ(request.URL, url);
-      return YES;
-    }];
-    StartDataTaskAndWaitForCompletion(task);
-    EXPECT_TRUE(block_used);
-    EXPECT_TRUE([delegate_ error]);
-
-    NSURLSessionTaskMetrics* task_metrics = delegate_.taskMetrics;
-    ASSERT_TRUE(task_metrics);
-    ASSERT_EQ(1lU, task_metrics.transactionMetrics.count);
-    NSURLSessionTaskTransactionMetrics* metrics =
-        task_metrics.transactionMetrics.firstObject;
-    EXPECT_TRUE([metrics isMemberOfClass:[CronetTransactionMetrics class]]);
-
-    EXPECT_TRUE(metrics.fetchStartDate);
-    EXPECT_FALSE(metrics.domainLookupStartDate);
-    EXPECT_FALSE(metrics.domainLookupEndDate);
-    EXPECT_FALSE(metrics.connectStartDate);
-    EXPECT_FALSE(metrics.secureConnectionStartDate);
-    EXPECT_FALSE(metrics.secureConnectionEndDate);
-    EXPECT_FALSE(metrics.connectEndDate);
-    EXPECT_FALSE(metrics.requestStartDate);
-    EXPECT_FALSE(metrics.requestEndDate);
-    EXPECT_FALSE(metrics.responseStartDate);
-  }
-}
-
-// Tests that the metrics API behaves sanely when the request is canceled.
-TEST_F(CronetEnabledMetricsTest, CanceledRequest) {
-  if (@available(iOS 10.2, *)) {
-    NSURL* url = net::NSURLWithGURL(net::QuicSimpleTestServer::GetSimpleURL());
-
-    __block BOOL block_used = NO;
-    NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-    [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-      block_used = YES;
-      EXPECT_EQ(request.URL, url);
-      return YES;
-    }];
-
-    StartDataTaskAndWaitForCompletion(task, 1);
-    [task cancel];
-
-    EXPECT_TRUE(block_used);
-    EXPECT_NE(nil, [delegate_ error]);
-  }
-}
-
-// Tests the metrics data for a reused connection is correct.
-TEST_F(CronetEnabledMetricsTest, ReusedConnection) {
-  if (@available(iOS 10.2, *)) {
-    NSURL* url = net::NSURLWithGURL(net::QuicSimpleTestServer::GetSimpleURL());
-
-    __block BOOL block_used = NO;
-    NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-    [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-      block_used = YES;
-      EXPECT_EQ(request.URL, url);
-      return YES;
-    }];
-    StartDataTaskAndWaitForCompletion(task);
-    EXPECT_TRUE(block_used);
-    EXPECT_EQ(nil, [delegate_ error]);
-    EXPECT_EQ(net::QuicSimpleTestServer::GetSimpleBodyValue(),
-              base::SysNSStringToUTF8([delegate_ responseBody]));
-
-    NSURLSessionTaskMetrics* task_metrics = [delegate_ taskMetrics];
-    ASSERT_TRUE(task_metrics);
-    ASSERT_EQ(1lU, task_metrics.transactionMetrics.count);
-    NSURLSessionTaskTransactionMetrics* metrics =
-        task_metrics.transactionMetrics.firstObject;
-    EXPECT_TRUE([metrics isMemberOfClass:[CronetTransactionMetrics class]]);
-
-    // Second connection
-
-    block_used = NO;
-    task = [session_ dataTaskWithURL:url];
-    [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-      block_used = YES;
-      EXPECT_EQ(request.URL, url);
-      return YES;
-    }];
-    StartDataTaskAndWaitForCompletion(task);
-    EXPECT_TRUE(block_used);
-    EXPECT_EQ(nil, [delegate_ error]);
-    EXPECT_EQ(net::QuicSimpleTestServer::GetSimpleBodyValue(),
-              base::SysNSStringToUTF8([delegate_ responseBody]));
-
-    task_metrics = delegate_.taskMetrics;
-    ASSERT_TRUE(task_metrics);
-    ASSERT_EQ(1lU, task_metrics.transactionMetrics.count);
-    metrics = task_metrics.transactionMetrics.firstObject;
-
-    EXPECT_TRUE(metrics.isReusedConnection);
-    EXPECT_FALSE(metrics.domainLookupStartDate);
-    EXPECT_FALSE(metrics.domainLookupEndDate);
-    EXPECT_FALSE(metrics.connectStartDate);
-    EXPECT_FALSE(metrics.secureConnectionStartDate);
-    EXPECT_FALSE(metrics.secureConnectionEndDate);
-    EXPECT_FALSE(metrics.connectEndDate);
-  }
-}
-
-// Checks that there is no crash if the session delegate is not set when a
-// NSURLSession is created. Also checks that the internal metrics map is cleaned
-// and contains 0 records at the end of the request. This is a regression test
-// for http://crbug/834401.
-TEST_F(CronetEnabledMetricsTest, SessionWithoutDelegate) {
-  if (@available(iOS 10.2, *)) {
-    NSURLSessionConfiguration* default_config =
-        [NSURLSessionConfiguration defaultSessionConfiguration];
-    [Cronet installIntoSessionConfiguration:default_config];
-    NSURLSession* default_session =
-        [NSURLSession sessionWithConfiguration:default_config];
-    NSURL* url = net::NSURLWithGURL(net::QuicSimpleTestServer::GetSimpleURL());
-    NSURLRequest* request = [NSURLRequest requestWithURL:url];
-
-    __block BOOL no_error = NO;
-    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
-    NSURLSessionDataTask* task = [default_session
-        dataTaskWithRequest:request
-          completionHandler:^(NSData* data, NSURLResponse* response,
-                              NSError* error) {
-            EXPECT_TRUE(error == nil)
-                << base::SysNSStringToUTF8([error description]);
-            no_error = YES;
-            dispatch_semaphore_signal(semaphore);
-          }];
-    __block BOOL block_used = NO;
-    [Cronet setRequestFilterBlock:^(NSURLRequest* nsUrlRequest) {
-      block_used = YES;
-      EXPECT_EQ(nsUrlRequest.URL, url);
-      return YES;
-    }];
-
-    [task resume];
-    long wait_result = dispatch_semaphore_wait(
-        semaphore, dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC));
-
-    // Check results
-    EXPECT_EQ(0, wait_result);
-    EXPECT_TRUE(block_used);
-    EXPECT_TRUE(no_error);
-    EXPECT_EQ(0UL, [Cronet getMetricsMapSize]);
-  }
-}
-
-// Tests that the metrics disable switch works.
-TEST_F(CronetDisabledMetricsTest, MetricsDisabled) {
-  if (@available(iOS 10.2, *)) {
-    NSURL* url = net::NSURLWithGURL(net::QuicSimpleTestServer::GetSimpleURL());
-
-    __block BOOL block_used = NO;
-    NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-    [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-      block_used = YES;
-      EXPECT_EQ(request.URL, url);
-      return YES;
-    }];
-    StartDataTaskAndWaitForCompletion(task);
-    EXPECT_TRUE(block_used);
-    EXPECT_EQ(nil, [delegate_ error]);
-    EXPECT_EQ(net::QuicSimpleTestServer::GetSimpleBodyValue(),
-              base::SysNSStringToUTF8([delegate_ responseBody]));
-
-    NSURLSessionTaskMetrics* task_metrics = [delegate_ taskMetrics];
-    ASSERT_TRUE(task_metrics);
-    ASSERT_EQ(1lU, task_metrics.transactionMetrics.count);
-    NSURLSessionTaskTransactionMetrics* metrics =
-        task_metrics.transactionMetrics.firstObject;
-    EXPECT_FALSE([metrics isMemberOfClass:[CronetTransactionMetrics class]]);
-
-    EXPECT_TRUE(metrics.fetchStartDate);
-    EXPECT_FALSE(metrics.domainLookupStartDate);
-    EXPECT_FALSE(metrics.domainLookupEndDate);
-    EXPECT_FALSE(metrics.connectStartDate);
-    EXPECT_FALSE(metrics.secureConnectionStartDate);
-    EXPECT_FALSE(metrics.secureConnectionEndDate);
-    EXPECT_FALSE(metrics.connectEndDate);
-    EXPECT_FALSE(metrics.requestStartDate);
-    EXPECT_FALSE(metrics.requestEndDate);
-    EXPECT_FALSE(metrics.responseStartDate);
-    EXPECT_FALSE(metrics.responseEndDate);
-    EXPECT_FALSE(metrics.networkProtocolName);
-  }
-}
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-TEST_F(CronetEnabledMetricsTest, LegacyApi) {
-  NSURL* url = net::NSURLWithGURL(net::QuicSimpleTestServer::GetSimpleURL());
-
-  __block BOOL block_used = NO;
-  [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-    block_used = YES;
-    EXPECT_EQ(request.URL, url);
-    return YES;
-  }];
-
-  NSURLRequest* request = [NSURLRequest requestWithURL:url];
-  NSError* err;
-  NSHTTPURLResponse* response;
-  [NSURLConnection sendSynchronousRequest:request
-                        returningResponse:&response
-                                    error:&err];
-
-  EXPECT_EQ(200, [response statusCode]);
-  EXPECT_TRUE(block_used);
-  EXPECT_FALSE(err);
-}
-#pragma clang diagnostic pop
-
-}  // namespace cronet
diff --git a/components/cronet/ios/test/cronet_netlog_test.mm b/components/cronet/ios/test/cronet_netlog_test.mm
deleted file mode 100644
index 5224ca7..0000000
--- a/components/cronet/ios/test/cronet_netlog_test.mm
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2016 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import <Cronet/Cronet.h>
-#import <Foundation/Foundation.h>
-
-#include "components/cronet/ios/test/cronet_test_base.h"
-#include "components/cronet/ios/test/start_cronet.h"
-#include "net/test/quic_simple_test_server.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cronet {
-
-class NetLogTest : public ::testing::Test {
- protected:
-  NetLogTest() {}
-  ~NetLogTest() override {}
-
-  void SetUp() override { StartCronet(net::QuicSimpleTestServer::GetPort()); }
-
-  void TearDown() override {
-    [Cronet stopNetLog];
-    [Cronet shutdownForTesting];
-  }
-};
-
-TEST_F(NetLogTest, OpenFile) {
-  bool netlog_started =
-      [Cronet startNetLogToFile:@"cronet_netlog.json" logBytes:YES];
-
-  EXPECT_TRUE(netlog_started);
-}
-
-TEST_F(NetLogTest, CreateFile) {
-  NSString* filename = [[[NSProcessInfo processInfo] globallyUniqueString]
-      stringByAppendingString:@"_netlog.json"];
-  bool netlog_started = [Cronet startNetLogToFile:filename logBytes:YES];
-  [Cronet stopNetLog];
-
-  bool file_created = [[NSFileManager defaultManager]
-      fileExistsAtPath:[Cronet getNetLogPathForFile:filename]];
-
-  [[NSFileManager defaultManager]
-      removeItemAtPath:[Cronet getNetLogPathForFile:filename]
-                 error:nil];
-
-  EXPECT_TRUE(netlog_started);
-  EXPECT_TRUE(file_created);
-}
-
-TEST_F(NetLogTest, NonExistantDir) {
-  NSString* notdir = [[[NSProcessInfo processInfo] globallyUniqueString]
-      stringByAppendingString:@"/netlog.json"];
-  bool netlog_started = [Cronet startNetLogToFile:notdir logBytes:NO];
-
-  EXPECT_FALSE(netlog_started);
-}
-
-TEST_F(NetLogTest, ExistantDir) {
-  NSString* dir = [[NSProcessInfo processInfo] globallyUniqueString];
-
-  bool dir_created = [[NSFileManager defaultManager]
-            createDirectoryAtPath:[Cronet getNetLogPathForFile:dir]
-      withIntermediateDirectories:NO
-                       attributes:nil
-                            error:nil];
-
-  bool netlog_started =
-      [Cronet startNetLogToFile:[dir stringByAppendingString:@"/netlog.json"]
-                       logBytes:NO];
-
-  [Cronet stopNetLog];
-
-  [[NSFileManager defaultManager]
-      removeItemAtPath:[Cronet
-                           getNetLogPathForFile:
-                               [dir stringByAppendingString:@"/netlog.json"]]
-                 error:nil];
-
-  [[NSFileManager defaultManager]
-      removeItemAtPath:[Cronet getNetLogPathForFile:dir]
-                 error:nil];
-
-  EXPECT_TRUE(dir_created);
-  EXPECT_TRUE(netlog_started);
-}
-
-TEST_F(NetLogTest, EmptyFilename) {
-  bool netlog_started = [Cronet startNetLogToFile:@"" logBytes:NO];
-
-  EXPECT_FALSE(netlog_started);
-}
-
-TEST_F(NetLogTest, AbsoluteFilename) {
-  bool netlog_started =
-      [Cronet startNetLogToFile:@"/home/netlog.json" logBytes:NO];
-
-  EXPECT_FALSE(netlog_started);
-}
-
-TEST_F(NetLogTest, ExperimentalOptions) {
-  [Cronet shutdownForTesting];
-  NSString* netlog_file = @"cronet_netlog.json";
-  NSString* netlog_path = [Cronet getNetLogPathForFile:netlog_file];
-
-  // Remove old netlog if any.
-  [[NSFileManager defaultManager] removeItemAtPath:netlog_path error:nil];
-
-  // Set experimental options and start the netlog.
-  [Cronet
-      setExperimentalOptions:
-          @"{ \"QUIC\" : {\"max_server_configs_stored_in_properties\" : 8} }"];
-
-  StartCronet(net::QuicSimpleTestServer::GetPort());
-  bool netlog_started =
-      [Cronet startNetLogToFile:@"cronet_netlog.json" logBytes:NO];
-  ASSERT_TRUE(netlog_started);
-
-  // Stop the netlog and check that it contains the experimental options.
-  [Cronet stopNetLog];
-
-  NSError* error = nil;
-  NSString* netlog_content =
-      [NSString stringWithContentsOfFile:netlog_path
-                                encoding:NSASCIIStringEncoding
-                                   error:&error];
-  ASSERT_FALSE(error) << error.localizedDescription.UTF8String;
-  ASSERT_TRUE(netlog_content);
-  ASSERT_TRUE([netlog_content
-      containsString:@"\"cronetExperimentalParams\":{\"QUIC\":{\"max_server_"
-                     @"configs_stored_in_properties\":8}}"])
-      << "Netlog doesn't contain 'cronetExperimentalParams'.";
-}
-}
diff --git a/components/cronet/ios/test/cronet_performance_test.mm b/components/cronet/ios/test/cronet_performance_test.mm
deleted file mode 100644
index 7ce16ad..0000000
--- a/components/cronet/ios/test/cronet_performance_test.mm
+++ /dev/null
@@ -1,271 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import <Cronet/Cronet.h>
-#import <Foundation/Foundation.h>
-
-#include <stdint.h>
-
-#include "base/logging.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/sys_string_conversions.h"
-#include "components/cronet/ios/test/cronet_test_base.h"
-#include "components/cronet/testing/test_server/test_server.h"
-#include "net/base/mac/url_conversions.h"
-#include "net/base/net_errors.h"
-#include "net/cert/mock_cert_verifier.h"
-#include "net/test/quic_simple_test_server.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/gtest_mac.h"
-#include "url/gurl.h"
-
-namespace {
-
-const int kTestIterations = 10;
-const BOOL kUseExternalUrl = NO;
-const int kDownloadSize = 19307439;  // used for internal server only
-const char* kExternalUrl = "https://www.gstatic.com/chat/hangouts/bg/davec.jpg";
-
-struct PerfResult {
-  NSTimeInterval total;
-  NSTimeInterval mean;
-  NSTimeInterval max;
-  int64_t total_bytes_downloaded;
-  int failed_requests;
-  int total_requests;
-};
-
-struct TestConfig {
-  BOOL quic;
-  BOOL http2;
-  BOOL akd4;
-  BOOL cronet;
-};
-
-bool operator<(TestConfig a, TestConfig b) {
-  return std::tie(a.quic, a.http2, a.akd4, a.cronet) <
-         std::tie(b.quic, b.http2, b.akd4, b.cronet);
-}
-
-const TestConfig test_combinations[] = {
-    //  QUIC   HTTP2  AKD4   Cronet
-    { false, false, false, false, },
-    { false, false, false, true, },
-    { false, true, false, true, },
-    { true, false, false, true, },
-    { true, false, true, true, },
-};
-
-}  // namespace
-
-namespace cronet {
-
-class PerfTest : public CronetTestBase,
-                 public ::testing::WithParamInterface<TestConfig> {
- public:
-  static void TearDownTestCase() {
-    NSMutableString* perf_data_acc = [NSMutableString stringWithCapacity:0];
-
-    LOG(INFO) << "Performance Data:";
-    for (auto const& entry : perf_test_results) {
-      NSString* formatted_entry = [NSString
-          stringWithFormat:
-              @"Quic %i\tHttp2 %i\tAKD4 %i\tCronet %i: Mean: %fs "
-              @"(%fmbps)\tMax: "
-              @"%fs with %i fails out of %i total requests.",
-              entry.first.quic, entry.first.http2, entry.first.akd4,
-              entry.first.cronet, entry.second.mean,
-              entry.second.total ? 8 * entry.second.total_bytes_downloaded /
-                                       entry.second.total / 1e6
-                                 : 0,
-              entry.second.max, entry.second.failed_requests,
-              entry.second.total_requests];
-
-      [perf_data_acc appendFormat:@"%@\n", formatted_entry];
-
-      LOG(INFO) << base::SysNSStringToUTF8(formatted_entry);
-    }
-
-    NSString* filename = [NSString
-        stringWithFormat:@"performance_metrics-%@.txt",
-                         [[NSDate date]
-                             descriptionWithLocale:[NSLocale currentLocale]]];
-    NSString* path =
-        [[[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
-                                                  inDomains:NSUserDomainMask]
-            lastObject] URLByAppendingPathComponent:filename] path];
-
-    NSData* filedata = [perf_data_acc dataUsingEncoding:NSUTF8StringEncoding];
-    [[NSFileManager defaultManager] createFileAtPath:path
-                                            contents:filedata
-                                          attributes:nil];
-  }
-
- protected:
-  static std::map<TestConfig, PerfResult> perf_test_results;
-
-  PerfTest() {}
-  ~PerfTest() override {}
-
-  void SetUp() override {
-    CronetTestBase::SetUp();
-    TestServer::Start();
-
-    // These are normally called by StartCronet(), but because of the test
-    // parameterization we need to call them inline, and not use StartCronet()
-    [Cronet setUserAgent:@"CronetTest/1.0.0.0" partial:NO];
-    [Cronet setQuicEnabled:GetParam().quic];
-    [Cronet setHttp2Enabled:GetParam().http2];
-    [Cronet setAcceptLanguages:@"en-US,en"];
-    if (kUseExternalUrl) {
-      NSString* external_host = [[NSURL
-          URLWithString:[NSString stringWithUTF8String:kExternalUrl]] host];
-      [Cronet addQuicHint:external_host port:443 altPort:443];
-    } else {
-      [Cronet addQuicHint:@"test.example.com" port:443 altPort:443];
-    }
-    [Cronet enableTestCertVerifierForTesting];
-    [Cronet setHttpCacheType:CRNHttpCacheTypeDisabled];
-    if (GetParam().akd4) {
-      [Cronet setExperimentalOptions:
-                  @"{\"QUIC\":{\"connection_options\":\"AKD4\"}}"];
-    }
-
-    [Cronet start];
-
-    NSString* rules = base::SysUTF8ToNSString(
-        base::StringPrintf("MAP test.example.com 127.0.0.1:%d,"
-                           "MAP notfound.example.com ^NOTFOUND",
-                           net::QuicSimpleTestServer::GetPort()));
-    [Cronet setHostResolverRulesForTesting:rules];
-    // This is the end of the behavior normally performed by StartCronet()
-
-    NSURLSessionConfiguration* config =
-        [NSURLSessionConfiguration ephemeralSessionConfiguration];
-    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
-    if (GetParam().cronet) {
-      [Cronet registerHttpProtocolHandler];
-      [Cronet installIntoSessionConfiguration:config];
-    } else {
-      [Cronet unregisterHttpProtocolHandler];
-    }
-    session_ = [NSURLSession sessionWithConfiguration:config
-                                             delegate:delegate_
-                                        delegateQueue:nil];
-  }
-
-  void TearDown() override {
-    TestServer::Shutdown();
-
-    [Cronet shutdownForTesting];
-    CronetTestBase::TearDown();
-  }
-
-  NSURLSession* session_;
-};
-
-// static
-std::map<TestConfig, PerfResult> PerfTest::perf_test_results;
-
-TEST_P(PerfTest, NSURLSessionReceivesImageLoop) {
-  int iterations = kTestIterations;
-  int failed_iterations = 0;
-  int64_t total_bytes_received = 0;
-  NSTimeInterval elapsed_total = 0;
-  NSTimeInterval elapsed_max = 0;
-
-  int first_log = false;
-
-  LOG(INFO) << "Running with parameters: "
-            << "QUIC: " << GetParam().quic << "\t"
-            << "HTTP2: " << GetParam().http2 << "\t"
-            << "AKD4: " << GetParam().akd4 << "\t"
-            << "Cronet: " << GetParam().cronet << "\t";
-
-  NSURL* url;
-  if (kUseExternalUrl) {
-    url = net::NSURLWithGURL(GURL(kExternalUrl));
-  } else {
-    LOG(INFO) << "Downloading " << kDownloadSize << " bytes per iteration";
-    url =
-        net::NSURLWithGURL(GURL(TestServer::PrepareBigDataURL(kDownloadSize)));
-  }
-
-  for (int i = 0; i < iterations; ++i) {
-    __block BOOL block_used = NO;
-    NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-    [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-      block_used = YES;
-      EXPECT_EQ([request URL], url);
-      return YES;
-    }];
-
-    NSDate* start = [NSDate date];
-    BOOL success = StartDataTaskAndWaitForCompletion(task);
-
-    if (!success) {
-      [task cancel];
-    }
-
-    success = success && IsResponseSuccessful(task);
-
-    NSTimeInterval elapsed = -[start timeIntervalSinceNow];
-
-    // Do not tolerate failures on internal server.
-    if (!kUseExternalUrl) {
-      CHECK(success);
-    }
-
-    if (kUseExternalUrl && success && !first_log) {
-      LOG(INFO) << "Downloaded "
-                << [[delegate_ totalBytesReceivedPerTask][task] intValue]
-                << " bytes on first iteration.";
-      first_log = true;
-    }
-
-    if (!success) {
-      if ([delegate_ errorPerTask][task]) {
-        LOG(WARNING) << "Request failed during performance testing: "
-                     << base::SysNSStringToUTF8([[delegate_ errorPerTask][task]
-                            localizedDescription]);
-      } else {
-        LOG(WARNING) << "Request timed out during performance testing.";
-      }
-      ++failed_iterations;
-    } else {
-      // Checking that the correct amount of data was downloaded only makes
-      // sense if the request succeeded.
-      EXPECT_EQ([[delegate_ expectedContentLengthPerTask][task] intValue],
-                [[delegate_ totalBytesReceivedPerTask][task] intValue]);
-
-      elapsed_total += elapsed;
-      elapsed_max = MAX(elapsed, elapsed_max);
-
-      total_bytes_received +=
-          [[delegate_ totalBytesReceivedPerTask][task] intValue];
-    }
-
-    EXPECT_EQ(block_used, GetParam().cronet);
-  }
-
-  LOG(INFO) << "Elapsed Total:" << elapsed_total * 1000 << "ms";
-
-  // Reject performance data from too many failures.
-  if (kUseExternalUrl) {
-    CHECK_LE(failed_iterations, iterations / 2);
-  }
-
-  perf_test_results[GetParam()] = {
-      elapsed_total,        elapsed_total / iterations, elapsed_max,
-      total_bytes_received, failed_iterations,          iterations};
-
-  if (!kUseExternalUrl) {
-    TestServer::ReleaseBigDataURL();
-  }
-}
-
-INSTANTIATE_TEST_SUITE_P(Loops,
-                         PerfTest,
-                         ::testing::ValuesIn(test_combinations));
-}  // namespace cronet
diff --git a/components/cronet/ios/test/cronet_pkp_test.mm b/components/cronet/ios/test/cronet_pkp_test.mm
deleted file mode 100644
index 542e36d6..0000000
--- a/components/cronet/ios/test/cronet_pkp_test.mm
+++ /dev/null
@@ -1,272 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import <Cronet/Cronet.h>
-
-#include "base/strings/sys_string_conversions.h"
-#include "components/cronet/ios/test/cronet_test_base.h"
-#include "components/cronet/ios/test/start_cronet.h"
-#include "net/base/mac/url_conversions.h"
-#include "net/cert/mock_cert_verifier.h"
-#include "net/test/cert_test_util.h"
-#include "net/test/quic_simple_test_server.h"
-#include "net/test/test_data_directory.h"
-#include "testing/gtest_mac.h"
-#include "url/gurl.h"
-
-namespace {
-const bool kIncludeSubdomains = true;
-const bool kExcludeSubdomains = false;
-const bool kSuccess = true;
-const bool kError = false;
-const std::string kServerCert = "quic-chain.pem";
-NSDate* const kDistantFuture = [NSDate distantFuture];
-}  // namespace
-
-namespace cronet {
-// Tests public-key-pinning functionality.
-class PkpTest : public CronetTestBase {
- protected:
-  void SetUp() override {
-    CronetTestBase::SetUp();
-
-    server_host_ =
-        base::SysUTF8ToNSString(net::QuicSimpleTestServer::GetHost());
-    server_domain_ =
-        base::SysUTF8ToNSString(net::QuicSimpleTestServer::GetDomain());
-    request_url_ =
-        net::NSURLWithGURL(net::QuicSimpleTestServer::GetSimpleURL());
-
-    // Create a Cronet enabled NSURLSession.
-    NSURLSessionConfiguration* sessionConfig =
-        [NSURLSessionConfiguration defaultSessionConfiguration];
-    [Cronet installIntoSessionConfiguration:sessionConfig];
-    url_session_ = [NSURLSession sessionWithConfiguration:sessionConfig
-                                                 delegate:delegate_
-                                            delegateQueue:nil];
-
-    // Set mock cert verifier.
-    [Cronet setMockCertVerifierForTesting:CreateMockCertVerifier({kServerCert},
-                                                                 YES)];
-  }
-
-  void TearDown() override {
-    // It is safe to call the shutdownForTesting method even if a test
-    // didn't call StartCronet().
-    [Cronet shutdownForTesting];
-    CronetTestBase::TearDown();
-  }
-
-  // Sends a request to a given URL, waits for the response and asserts that
-  // the response is either successful or containing an error depending on
-  // the value of the passed |expected_success| parameter.
-  void sendRequestAndAssertResult(NSURL* url, bool expected_success) {
-    NSURLSessionDataTask* dataTask =
-        [url_session_ dataTaskWithURL:request_url_];
-    StartDataTaskAndWaitForCompletion(dataTask);
-    if (expected_success) {
-      ASSERT_TRUE(IsResponseSuccessful(dataTask));
-    } else {
-      ASSERT_FALSE(IsResponseSuccessful(dataTask));
-      ASSERT_FALSE(IsResponseCanceled(dataTask));
-    }
-  }
-
-  // Adds a given public-key-pin and starts a Cronet engine for testing.
-  void AddPkpAndStartCronet(NSString* host,
-                            NSData* hash,
-                            BOOL include_subdomains,
-                            NSDate* expiration_date) {
-    [Cronet setEnablePublicKeyPinningBypassForLocalTrustAnchors:NO];
-    NSSet* hashes = [NSSet setWithObject:hash];
-    NSError* error;
-    BOOL success = [Cronet addPublicKeyPinsForHost:host
-                                         pinHashes:hashes
-                                 includeSubdomains:include_subdomains
-                                    expirationDate:(NSDate*)expiration_date
-                                             error:&error];
-    CHECK(success);
-    CHECK(!error);
-    StartCronet(net::QuicSimpleTestServer::GetPort());
-  }
-
-  // Returns an arbitrary public key hash that doesn't match with any test
-  // certificate.
-  static NSData* NonMatchingHash() {
-    const int length = 32;
-    std::string hash(length, '\077');
-    return [NSData dataWithBytes:hash.c_str() length:length];
-  }
-
-  // Returns hash value that matches the hash of the public key certificate used
-  // for testing.
-  static NSData* MatchingHash() {
-    scoped_refptr<net::X509Certificate> cert =
-        net::ImportCertFromFile(net::GetTestCertsDirectory(), kServerCert);
-    net::HashValue hash_value;
-    CalculatePublicKeySha256(*cert, &hash_value);
-    CHECK_EQ(32ul, hash_value.size());
-    return [NSData dataWithBytes:hash_value.data() length:hash_value.size()];
-  }
-
-  NSURLSession* url_session_;
-  NSURL* request_url_;       // "https://test.example.com/simple.txt"
-  NSString* server_host_;    // test.example.com
-  NSString* server_domain_;  // example.com
-};                           // class PkpTest
-
-// Tests the case when a mismatching pin is set for some host that is
-// different from the one the client wants to access. In that case the other
-// host pinning policy should not be applied and the client is expected to
-// receive the successful response with the response code 200.
-TEST_F(PkpTest, TestSuccessIfPinSetForDifferentHost) {
-  AddPkpAndStartCronet(@"some-other-host.com", NonMatchingHash(),
-                       kExcludeSubdomains, kDistantFuture);
-  ASSERT_NO_FATAL_FAILURE(sendRequestAndAssertResult(request_url_, kSuccess));
-}
-
-// Tests the case when the pin hash does not match. The client is expected to
-// receive the error response.
-TEST_F(PkpTest, TestErrorIfPinDoesNotMatch) {
-  AddPkpAndStartCronet(server_host_, NonMatchingHash(), kExcludeSubdomains,
-                       kDistantFuture);
-  ASSERT_NO_FATAL_FAILURE(sendRequestAndAssertResult(request_url_, kError));
-}
-
-// Tests the case when the pin hash matches. The client is expected to
-// receive the successful response with the response code 200.
-TEST_F(PkpTest, TestSuccessIfPinMatches) {
-  AddPkpAndStartCronet(server_host_, MatchingHash(), kExcludeSubdomains,
-                       kDistantFuture);
-  ASSERT_NO_FATAL_FAILURE(sendRequestAndAssertResult(request_url_, kSuccess));
-}
-
-TEST_F(PkpTest, TestBypass) {
-  [Cronet setEnablePublicKeyPinningBypassForLocalTrustAnchors:YES];
-
-  NSSet* hashes = [NSSet setWithObject:NonMatchingHash()];
-  NSError* error;
-  BOOL success = [Cronet addPublicKeyPinsForHost:server_host_
-                                       pinHashes:hashes
-                               includeSubdomains:kExcludeSubdomains
-                                  expirationDate:(NSDate*)kDistantFuture
-                                           error:&error];
-
-  EXPECT_FALSE(success);
-  EXPECT_EQ([error code], CRNErrorUnsupportedConfig);
-}
-
-// Tests the case when the pin hash does not match and the client accesses the
-// subdomain of the configured PKP host with includeSubdomains flag set to true.
-// The client is expected to receive the error response.
-TEST_F(PkpTest, TestIncludeSubdomainsFlagEqualTrue) {
-  AddPkpAndStartCronet(server_domain_, NonMatchingHash(), kIncludeSubdomains,
-                       kDistantFuture);
-  ASSERT_NO_FATAL_FAILURE(sendRequestAndAssertResult(request_url_, kError));
-}
-
-// Tests the case when the pin hash does not match and the client accesses the
-// subdomain of the configured PKP host with includeSubdomains flag set to
-// false. The client is expected to receive the successful response with the
-// response code 200.
-TEST_F(PkpTest, TestIncludeSubdomainsFlagEqualFalse) {
-  AddPkpAndStartCronet(server_domain_, NonMatchingHash(), kExcludeSubdomains,
-                       kDistantFuture);
-  ASSERT_NO_FATAL_FAILURE(sendRequestAndAssertResult(request_url_, kSuccess));
-}
-
-// Tests a mismatching pin that will expire in 10 seconds. The pins should be
-// still valid and enforced during the request; thus returning the pin match
-// error.
-TEST_F(PkpTest, TestSoonExpiringPin) {
-  AddPkpAndStartCronet(server_host_, NonMatchingHash(), kExcludeSubdomains,
-                       [NSDate dateWithTimeIntervalSinceNow:10]);
-  ASSERT_NO_FATAL_FAILURE(sendRequestAndAssertResult(request_url_, kError));
-}
-
-// Tests mismatching pin that expired 1 second ago. Since the pin has
-// expired, it should not be enforced during the request; thus a successful
-// response is expected.
-TEST_F(PkpTest, TestRecentlyExpiredPin) {
-  AddPkpAndStartCronet(server_host_, NonMatchingHash(), kExcludeSubdomains,
-                       [NSDate dateWithTimeIntervalSinceNow:-1]);
-  ASSERT_NO_FATAL_FAILURE(sendRequestAndAssertResult(request_url_, kSuccess));
-}
-
-// Tests that host pinning is not persisted between multiple CronetEngine
-// instances.
-TEST_F(PkpTest, TestPinsAreNotPersisted) {
-  AddPkpAndStartCronet(server_host_, NonMatchingHash(), kExcludeSubdomains,
-                       kDistantFuture);
-  ASSERT_NO_FATAL_FAILURE(sendRequestAndAssertResult(request_url_, kError));
-  [Cronet shutdownForTesting];
-
-  // Restart Cronet engine and try the same request again. Since the pins are
-  // not persisted, a successful response is expected.
-  StartCronet(net::QuicSimpleTestServer::GetPort());
-  ASSERT_NO_FATAL_FAILURE(sendRequestAndAssertResult(request_url_, kSuccess));
-}
-
-// Tests that an error is returned when PKP hash size is not equal to 256 bits.
-TEST_F(PkpTest, TestHashLengthError) {
-  [Cronet setEnablePublicKeyPinningBypassForLocalTrustAnchors:NO];
-  char hash[31];
-  NSData* shortHash = [NSData dataWithBytes:hash length:sizeof(hash)];
-  NSSet* hashes = [NSSet setWithObject:shortHash];
-  NSError* error;
-  BOOL success = [Cronet addPublicKeyPinsForHost:server_host_
-                                       pinHashes:hashes
-                               includeSubdomains:kExcludeSubdomains
-                                  expirationDate:kDistantFuture
-                                           error:&error];
-  EXPECT_FALSE(success);
-  ASSERT_TRUE(error != nil);
-  EXPECT_STREQ([CRNCronetErrorDomain cStringUsingEncoding:NSUTF8StringEncoding],
-               [error.domain cStringUsingEncoding:NSUTF8StringEncoding]);
-  EXPECT_EQ(CRNErrorInvalidArgument, error.code);
-  EXPECT_TRUE([error.description rangeOfString:@"Invalid argument"].location !=
-              NSNotFound);
-  EXPECT_TRUE([error.description rangeOfString:@"pinHashes"].location !=
-              NSNotFound);
-  EXPECT_STREQ("pinHashes", [error.userInfo[CRNInvalidArgumentKey]
-                                cStringUsingEncoding:NSUTF8StringEncoding]);
-}
-
-// Tests that setting pins for the same host second time overrides the previous
-// pins.
-TEST_F(PkpTest, TestPkpOverrideNonMatchingToMatching) {
-  [Cronet setEnablePublicKeyPinningBypassForLocalTrustAnchors:NO];
-  // Add non-matching pin.
-  BOOL success =
-      [Cronet addPublicKeyPinsForHost:server_host_
-                            pinHashes:[NSSet setWithObject:NonMatchingHash()]
-                    includeSubdomains:kExcludeSubdomains
-                       expirationDate:kDistantFuture
-                                error:nil];
-  ASSERT_TRUE(success);
-  // Add matching pin.
-  AddPkpAndStartCronet(server_host_, MatchingHash(), kExcludeSubdomains,
-                       kDistantFuture);
-  ASSERT_NO_FATAL_FAILURE(sendRequestAndAssertResult(request_url_, kSuccess));
-}
-
-// Tests that setting pins for the same host second time overrides the previous
-// pins.
-TEST_F(PkpTest, TestPkpOverrideMatchingToNonMatching) {
-  [Cronet setEnablePublicKeyPinningBypassForLocalTrustAnchors:NO];
-  // Add matching pin.
-  BOOL success =
-      [Cronet addPublicKeyPinsForHost:server_host_
-                            pinHashes:[NSSet setWithObject:MatchingHash()]
-                    includeSubdomains:kExcludeSubdomains
-                       expirationDate:kDistantFuture
-                                error:nil];
-  ASSERT_TRUE(success);
-  // Add non-matching pin.
-  AddPkpAndStartCronet(server_host_, NonMatchingHash(), kExcludeSubdomains,
-                       kDistantFuture);
-  ASSERT_NO_FATAL_FAILURE(sendRequestAndAssertResult(request_url_, kError));
-}
-
-}  // namespace cronet
diff --git a/components/cronet/ios/test/cronet_prefs_test.mm b/components/cronet/ios/test/cronet_prefs_test.mm
deleted file mode 100644
index e0dbd11..0000000
--- a/components/cronet/ios/test/cronet_prefs_test.mm
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/location.h"
-#include "base/path_service.h"
-#include "components/cronet/ios/test/cronet_test_base.h"
-#include "components/cronet/ios/test/start_cronet.h"
-#include "components/cronet/testing/test_server/test_server.h"
-#include "net/base/mac/url_conversions.h"
-#include "net/test/quic_simple_test_server.h"
-#include "testing/gtest_mac.h"
-#include "url/gurl.h"
-
-namespace cronet {
-
-class PrefsTest : public CronetTestBase {
- protected:
-  void SetUp() override {
-    CronetTestBase::SetUp();
-    TestServer::Start();
-
-    [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-      return YES;
-    }];
-    NSURLSessionConfiguration* config =
-        [NSURLSessionConfiguration ephemeralSessionConfiguration];
-    [Cronet installIntoSessionConfiguration:config];
-    session_ = [NSURLSession sessionWithConfiguration:config
-                                             delegate:delegate_
-                                        delegateQueue:nil];
-  }
-
-  void TearDown() override {
-    TestServer::Shutdown();
-    [Cronet stopNetLog];
-    [Cronet shutdownForTesting];
-    CronetTestBase::TearDown();
-  }
-
-  NSString* GetFileContentWaitUntilCreated(NSString* file,
-                                           NSTimeInterval timeout,
-                                           NSError** error) {
-    // Wait until the file appears on disk.
-    NSFileManager* file_manager = [NSFileManager defaultManager];
-    NSLog(@"Waiting for file %@.", file);
-    while (timeout > 0) {
-      if ([file_manager fileExistsAtPath:file]) {
-        NSLog(@"File %@ exists.", file);
-        break;
-      }
-      NSLog(@"Time left: %i seconds", (int)timeout);
-      NSTimeInterval sleep_interval = fmin(5.0, timeout);
-      [NSThread sleepForTimeInterval:sleep_interval];
-      timeout -= sleep_interval;
-    }
-
-    // Read the file on the file thread to avoid reading the changing file.
-    dispatch_semaphore_t lock = dispatch_semaphore_create(0);
-    __block NSString* file_content = nil;
-    __block NSError* block_error = nil;
-    PostBlockToFileThread(FROM_HERE, ^{
-      file_content = [NSString stringWithContentsOfFile:file
-                                               encoding:NSUTF8StringEncoding
-                                                  error:&block_error];
-      dispatch_semaphore_signal(lock);
-    });
-
-    // Wait for the file thread to finish reading the file content.
-    dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
-    if (block_error) {
-      *error = block_error;
-    }
-    return file_content;
-  }
-
-  NSURLSession* session_;
-};
-
-TEST_F(PrefsTest, HttpServerProperties) {
-  base::FilePath storage_path;
-  bool result = base::PathService::Get(base::DIR_CACHE, &storage_path);
-  ASSERT_TRUE(result);
-  storage_path =
-      storage_path.Append(FILE_PATH_LITERAL("cronet/prefs/local_prefs.json"));
-  NSString* prefs_file_name =
-      [NSString stringWithCString:storage_path.AsUTF8Unsafe().c_str()
-                         encoding:NSUTF8StringEncoding];
-
-  // Delete the prefs file if it exists.
-  [[NSFileManager defaultManager] removeItemAtPath:prefs_file_name error:nil];
-
-  // Add "max_server_configs_stored_in_properties" experimental option.
-  NSString* options =
-      @"{ \"QUIC\" : {\"max_server_configs_stored_in_properties\" : 5} }";
-  [Cronet setExperimentalOptions:options];
-
-  // Start Cronet Engine
-  StartCronet(net::QuicSimpleTestServer::GetPort());
-
-  // Start the request
-  NSURL* url = net::NSURLWithGURL(net::QuicSimpleTestServer::GetSimpleURL());
-  NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
-  StartDataTaskAndWaitForCompletion(task);
-
-  // Wait 80 seconds for the prefs file to appear on the disk.
-  NSError* error = nil;
-  NSString* prefs_file_content =
-      GetFileContentWaitUntilCreated(prefs_file_name, 80, &error);
-  ASSERT_FALSE(error) << "Unable to read " << storage_path << " file. Error: "
-                      << error.localizedDescription.UTF8String;
-
-  // Check the file content
-  ASSERT_TRUE(prefs_file_content);
-  ASSERT_TRUE(
-      [prefs_file_content containsString:@"{\"http_server_properties\":"])
-      << "Unable to find 'http_server_properties' in the JSON prefs: "
-      << prefs_file_content.UTF8String;
-  ASSERT_TRUE([prefs_file_content containsString:@"\"supports_quic\":"])
-      << "Unable to find 'supports_quic' in the JSON prefs: "
-      << prefs_file_content.UTF8String;
-
-  // Delete the prefs file to avoid side effects with other tests.
-  [[NSFileManager defaultManager] removeItemAtPath:prefs_file_name error:nil];
-}
-
-}  // namespace cronet
diff --git a/components/cronet/ios/test/cronet_quic_test.mm b/components/cronet/ios/test/cronet_quic_test.mm
deleted file mode 100644
index dfd09be..0000000
--- a/components/cronet/ios/test/cronet_quic_test.mm
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import <Cronet/Cronet.h>
-
-#include "base/strings/stringprintf.h"
-#include "base/strings/sys_string_conversions.h"
-#include "components/cronet/ios/test/cronet_test_base.h"
-#include "net/base/mac/url_conversions.h"
-#include "net/cert/mock_cert_verifier.h"
-#include "net/test/quic_simple_test_server.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/gtest_mac.h"
-#include "url/gurl.h"
-
-namespace cronet {
-
-class QuicTest : public CronetTestBase {
- protected:
-  QuicTest() {}
-  ~QuicTest() override {}
-
-  void SetUp() override {
-    CronetTestBase::SetUp();
-
-    // Prepare Cronet
-    [Cronet setUserAgent:@"CronetTest/1.0.0.0" partial:NO];
-    [Cronet setHttp2Enabled:false];
-    [Cronet setQuicEnabled:true];
-    [Cronet setAcceptLanguages:@"en-US,en"];
-    [Cronet addQuicHint:@"test.example.com" port:443 altPort:443];
-    [Cronet enableTestCertVerifierForTesting];
-    [Cronet setHttpCacheType:CRNHttpCacheTypeDisabled];
-    [Cronet setMetricsEnabled:YES];
-    [Cronet setRequestFilterBlock:^(NSURLRequest* request) {
-      return YES;
-    }];
-
-    // QUIC Server simple URL.
-    simple_url_ = net::NSURLWithGURL(net::QuicSimpleTestServer::GetSimpleURL());
-  }
-
-  void TearDown() override {
-    [Cronet stopNetLog];
-    [Cronet shutdownForTesting];
-    CronetTestBase::TearDown();
-  }
-
-  void StartCronet() {
-    [Cronet start];
-
-    // Add URL mapping to test server.
-    NSString* rules = base::SysUTF8ToNSString(
-        base::StringPrintf("MAP test.example.com 127.0.0.1:%d,"
-                           "MAP notfound.example.com ^NOTFOUND",
-                           net::QuicSimpleTestServer::GetPort()));
-    [Cronet setHostResolverRulesForTesting:rules];
-
-    // Prepare a session.
-    NSURLSessionConfiguration* config =
-        [NSURLSessionConfiguration ephemeralSessionConfiguration];
-    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
-    [Cronet installIntoSessionConfiguration:config];
-    session_ = [NSURLSession sessionWithConfiguration:config
-                                             delegate:delegate_
-                                        delegateQueue:nil];
-  }
-
-  NSURLSession* session_;
-  NSURL* simple_url_;
-};
-
-TEST_F(QuicTest, InvalidQuicHost) {
-  BOOL success =
-      [Cronet addQuicHint:@"https://test.example.com/" port:443 altPort:443];
-
-  EXPECT_FALSE(success);
-}
-
-TEST_F(QuicTest, ValidQuicHost) {
-  BOOL success = [Cronet addQuicHint:@"test.example.com" port:443 altPort:443];
-
-  EXPECT_TRUE(success);
-}
-
-// Tests a request with enabled "enable_socket_recv_optimization" QUIC
-// experimental option.
-TEST_F(QuicTest, RequestWithSocketOptimizationEnabled) {
-  // Apply test specific Cronet configuration and start it.
-  [Cronet setExperimentalOptions:
-              @"{\"QUIC\" : {\"enable_socket_recv_optimization\" : true} }"];
-  StartCronet();
-
-  // Make request and wait for the response.
-  NSURLSessionDataTask* task = [session_ dataTaskWithURL:simple_url_];
-  StartDataTaskAndWaitForCompletion(task);
-
-  // Check that a successful response was received using QUIC.
-  EXPECT_EQ(nil, [delegate_ error]);
-  EXPECT_EQ(net::QuicSimpleTestServer::GetSimpleBodyValue(),
-            base::SysNSStringToUTF8(delegate_.responseBody));
-  if (@available(iOS 10.2, *)) {
-    NSURLSessionTaskTransactionMetrics* metrics =
-        delegate_.taskMetrics.transactionMetrics[0];
-    EXPECT_TRUE([metrics.networkProtocolName containsString:@"quic"] ||
-                [metrics.networkProtocolName containsString:@"h3"])
-        << base::SysNSStringToUTF8(metrics.networkProtocolName);
-  }
-}
-}
diff --git a/components/cronet/ios/test/cronet_test_base.h b/components/cronet/ios/test/cronet_test_base.h
deleted file mode 100644
index 771a7ec..0000000
--- a/components/cronet/ios/test/cronet_test_base.h
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_CRONET_IOS_TEST_CRONET_TEST_BASE_H_
-#define COMPONENTS_CRONET_IOS_TEST_CRONET_TEST_BASE_H_
-
-#include <Cronet/Cronet.h>
-
-#include "base/functional/bind.h"
-#include "net/cert/cert_verifier.h"
-#include "net/cert/x509_certificate.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#pragma mark
-
-namespace base {
-class Location;
-class SingleThreadTaskRunner;
-class Thread;
-}
-
-namespace {
-typedef void (^BlockType)(void);
-}  // namespace
-
-// Exposes private test-only methods of the Cronet class.
-@interface Cronet (ExposedForTesting)
-+ (void)shutdownForTesting;
-+ (void)setMockCertVerifierForTesting:
-    (std::unique_ptr<net::CertVerifier>)certVerifier;
-+ (void)setEnablePublicKeyPinningBypassForLocalTrustAnchors:(BOOL)enable;
-+ (base::SingleThreadTaskRunner*)getFileThreadRunnerForTesting;
-+ (base::SingleThreadTaskRunner*)getNetworkThreadRunnerForTesting;
-+ (size_t)getMetricsMapSize;
-@end
-
-// NSURLSessionDataDelegate delegate implementation used by the tests to
-// wait for a response and check its status.
-@interface TestDelegate : NSObject<NSURLSessionDataDelegate>
-
-// Error the request this delegate is attached to failed with, if any.
-@property(retain, atomic)
-    NSMutableDictionary<NSURLSessionTask*, NSError*>* errorPerTask;
-
-// Contains total amount of received data.
-@property(readonly) NSMutableDictionary<NSURLSessionDataTask*, NSNumber*>*
-    totalBytesReceivedPerTask;
-
-// Contains the expected amount of received data.
-@property(readonly) NSMutableDictionary<NSURLSessionDataTask*, NSNumber*>*
-    expectedContentLengthPerTask;
-
-// Contains metrics data.
-@property(readonly) NSURLSessionTaskMetrics* taskMetrics NS_AVAILABLE_IOS(10.0);
-
-// Contains NSHTTPURLResponses for the tasks.
-@property(readonly)
-    NSMutableDictionary<NSURLSessionDataTask*, NSHTTPURLResponse*>*
-        responsePerTask;
-
-// Resets the delegate, so it can be used again for another request.
-- (void)reset;
-
-// Contains the response body.
-- (NSString*)responseBody:(NSURLSessionDataTask*)task;
-
-/// Waits for a single request to complete.
-
-/// @return  |NO| if the request didn't complete and the method timed-out.
-- (BOOL)waitForDone:(NSURLSessionDataTask*)task
-        withTimeout:(int64_t)deadline_ns;
-
-// Convenience functions for single-task delegates
-- (NSError*)error;
-- (long)totalBytesReceived;
-- (long)expectedContentLength;
-- (NSString*)responseBody;
-
-@end
-
-// Forward declaration.
-namespace net {
-class MockCertVerifier;
-}
-
-namespace cronet {
-
-// A base class that should be extended by all other Cronet tests.
-// The class automatically starts and stops the test QUIC server.
-class CronetTestBase : public ::testing::Test {
- protected:
-  static bool CalculatePublicKeySha256(const net::X509Certificate& cert,
-                                       net::HashValue* out_hash_value);
-
-  void SetUp() override;
-  void TearDown() override;
-  bool StartDataTaskAndWaitForCompletion(NSURLSessionDataTask* task,
-                                         int64_t deadline_ns = 15 *
-                                                               NSEC_PER_SEC);
-  std::unique_ptr<net::MockCertVerifier> CreateMockCertVerifier(
-      const std::vector<std::string>& certs,
-      bool known_root);
-
-  void PostBlockToFileThread(const base::Location& from_here, BlockType block);
-  void PostBlockToNetworkThread(const base::Location& from_here,
-                                BlockType block);
-
-  ::testing::AssertionResult IsResponseSuccessful(NSURLSessionDataTask* task);
-  ::testing::AssertionResult IsResponseCanceled(NSURLSessionDataTask* task);
-
-  TestDelegate* delegate_;
-
- private:
-  void ExecuteBlock(BlockType block);
-
-};  // class CronetTestBase
-
-}  // namespace cronet
-
-#endif  // COMPONENTS_CRONET_IOS_TEST_CRONET_TEST_BASE_H_
diff --git a/components/cronet/ios/test/cronet_test_base.mm b/components/cronet/ios/test/cronet_test_base.mm
deleted file mode 100644
index 3246117..0000000
--- a/components/cronet/ios/test/cronet_test_base.mm
+++ /dev/null
@@ -1,328 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cronet_test_base.h"
-
-#include "base/location.h"
-#import "base/task/single_thread_task_runner.h"
-#include "base/threading/thread.h"
-#include "crypto/sha2.h"
-#include "net/base/net_errors.h"
-#include "net/cert/asn1_util.h"
-#include "net/cert/mock_cert_verifier.h"
-#include "net/cert/x509_util.h"
-#include "net/test/cert_test_util.h"
-#include "net/test/quic_simple_test_server.h"
-#include "net/test/test_data_directory.h"
-
-#pragma mark
-
-@implementation TestDelegate {
-  // Dictionary which maps tasks to completion semaphores for this TestDelegate.
-  // When a request this delegate is attached to finishes (either successfully
-  // or with an error), this delegate signals that task's semaphore.
-  NSMutableDictionary<NSURLSessionTask*, dispatch_semaphore_t>* _semaphores;
-
-  NSMutableDictionary<NSURLSessionDataTask*, NSMutableArray<NSData*>*>*
-      _responseDataPerTask;
-}
-
-@synthesize errorPerTask = _errorPerTask;
-@synthesize totalBytesReceivedPerTask = _totalBytesReceivedPerTask;
-@synthesize expectedContentLengthPerTask = _expectedContentLengthPerTask;
-@synthesize taskMetrics = _taskMetrics;
-@synthesize responsePerTask = _responsePerTask;
-
-- (id)init {
-  if (self = [super init]) {
-    _semaphores = [NSMutableDictionary dictionaryWithCapacity:0];
-  }
-  return self;
-}
-
-- (void)reset {
-  _semaphores = [NSMutableDictionary dictionaryWithCapacity:0];
-  _responseDataPerTask = [NSMutableDictionary dictionaryWithCapacity:0];
-  _errorPerTask = [NSMutableDictionary dictionaryWithCapacity:0];
-  _totalBytesReceivedPerTask = [NSMutableDictionary dictionaryWithCapacity:0];
-  _expectedContentLengthPerTask =
-      [NSMutableDictionary dictionaryWithCapacity:0];
-  _responsePerTask = [NSMutableDictionary dictionaryWithCapacity:0];
-  _taskMetrics = nil;
-}
-
-- (NSError*)error {
-  if ([_errorPerTask count] == 0)
-    return nil;
-
-  DCHECK([_errorPerTask count] == 1);
-  return [[_errorPerTask objectEnumerator] nextObject];
-}
-
-- (long)totalBytesReceived {
-  DCHECK([_totalBytesReceivedPerTask count] == 1);
-  return [[[_totalBytesReceivedPerTask objectEnumerator] nextObject] intValue];
-}
-
-- (long)expectedContentLength {
-  DCHECK([_expectedContentLengthPerTask count] == 1);
-  return
-      [[[_expectedContentLengthPerTask objectEnumerator] nextObject] intValue];
-}
-
-- (NSString*)responseBody {
-  if ([_responseDataPerTask count] == 0)
-    return nil;
-
-  DCHECK([_responseDataPerTask count] == 1);
-  NSURLSessionDataTask* task =
-      [[_responseDataPerTask keyEnumerator] nextObject];
-
-  return [self responseBody:task];
-}
-
-- (NSString*)responseBody:(NSURLSessionDataTask*)task {
-  if (_responseDataPerTask[task] == nil) {
-    return nil;
-  }
-  NSMutableString* body = [NSMutableString string];
-  for (NSData* data in _responseDataPerTask[task]) {
-    [body appendString:[[NSString alloc] initWithData:data
-                                             encoding:NSUTF8StringEncoding]];
-  }
-  VLOG(3) << "responseBody size:" << [body length]
-          << " chunks:" << [_responseDataPerTask[task] count];
-  return body;
-}
-
-- (dispatch_semaphore_t)getSemaphoreForTask:(NSURLSessionTask*)task {
-  @synchronized(_semaphores) {
-    if (!_semaphores[task]) {
-      _semaphores[task] = dispatch_semaphore_create(0);
-    }
-    return _semaphores[task];
-  }
-}
-
-// |timeout_ns|, if positive, specifies how long to wait before timing out in
-// nanoseconds, a value of 0 or less means do not ever time out.
-- (BOOL)waitForDone:(NSURLSessionDataTask*)task
-        withTimeout:(int64_t)timeout_ns {
-  BOOL request_completed = NO;
-  dispatch_semaphore_t semaphore = [self getSemaphoreForTask:task];
-  if (timeout_ns > 0) {
-    request_completed =
-        dispatch_semaphore_wait(
-            semaphore, dispatch_time(DISPATCH_TIME_NOW, timeout_ns)) == 0;
-    if (!request_completed) {
-      // Cancel the pending request; otherwise, the request is still active and
-      // may invoke the delegate methods later.
-      [task cancel];
-      LOG(WARNING) << "The request was canceled due to timeout.";
-      // Give the canceled request some time to execute didCompleteWithError
-      // method with NSURLErrorCancelled error code.
-      dispatch_semaphore_wait(
-          semaphore, dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC));
-    }
-  } else {
-    request_completed =
-        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) == 0;
-  }
-  @synchronized(_semaphores) {
-    if (request_completed) {
-      [_semaphores removeObjectForKey:task];
-    }
-  }
-  return request_completed;
-}
-
-- (void)URLSession:(NSURLSession*)session
-    didBecomeInvalidWithError:(NSError*)error {
-}
-
-- (void)URLSession:(NSURLSession*)session
-                    task:(NSURLSessionTask*)task
-    didCompleteWithError:(NSError*)error {
-  if (error)
-    _errorPerTask[task] = error;
-
-  dispatch_semaphore_t _semaphore = [self getSemaphoreForTask:task];
-  dispatch_semaphore_signal(_semaphore);
-}
-
-- (void)URLSession:(NSURLSession*)session
-                   task:(NSURLSessionTask*)task
-    didReceiveChallenge:(NSURLAuthenticationChallenge*)challenge
-      completionHandler:
-          (void (^)(NSURLSessionAuthChallengeDisposition disp,
-                    NSURLCredential* credential))completionHandler {
-  completionHandler(NSURLSessionAuthChallengeUseCredential, nil);
-}
-
-- (void)URLSession:(NSURLSession*)session
-                          task:(NSURLSessionTask*)task
-    didFinishCollectingMetrics:(NSURLSessionTaskMetrics*)metrics
-    NS_AVAILABLE_IOS(10.0) {
-  _taskMetrics = metrics;
-}
-
-- (void)URLSession:(NSURLSession*)session
-              dataTask:(NSURLSessionDataTask*)dataTask
-    didReceiveResponse:(NSURLResponse*)response
-     completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))
-                           completionHandler {
-  _expectedContentLengthPerTask[dataTask] =
-      [NSNumber numberWithInt:[response expectedContentLength]];
-  _responsePerTask[dataTask] = static_cast<NSHTTPURLResponse*>(response);
-  completionHandler(NSURLSessionResponseAllow);
-}
-
-- (void)URLSession:(NSURLSession*)session
-          dataTask:(NSURLSessionDataTask*)dataTask
-    didReceiveData:(NSData*)data {
-  if (_totalBytesReceivedPerTask[dataTask]) {
-    _totalBytesReceivedPerTask[dataTask] = [NSNumber
-        numberWithInt:[_totalBytesReceivedPerTask[dataTask] intValue] +
-                      [data length]];
-  } else {
-    _totalBytesReceivedPerTask[dataTask] =
-        [NSNumber numberWithInt:[data length]];
-  }
-
-  if (_responseDataPerTask[dataTask] == nil) {
-    _responseDataPerTask[dataTask] = [[NSMutableArray alloc] init];
-  }
-  [_responseDataPerTask[dataTask] addObject:data];
-}
-
-- (void)URLSession:(NSURLSession*)session
-             dataTask:(NSURLSessionDataTask*)dataTask
-    willCacheResponse:(NSCachedURLResponse*)proposedResponse
-    completionHandler:
-        (void (^)(NSCachedURLResponse* cachedResponse))completionHandler {
-  completionHandler(proposedResponse);
-}
-
-@end
-
-namespace cronet {
-
-void CronetTestBase::SetUp() {
-  ::testing::Test::SetUp();
-  net::QuicSimpleTestServer::Start();
-  delegate_ = [[TestDelegate alloc] init];
-}
-
-void CronetTestBase::TearDown() {
-  net::QuicSimpleTestServer::Shutdown();
-  ::testing::Test::TearDown();
-}
-
-// Launches the supplied |task| and blocks until it completes, with a default
-// timeout of 20 seconds.  |deadline_ns|, if specified, is in nanoseconds.
-// If |deadline_ns| is 0 or negative, the request will not time out.
-bool CronetTestBase::StartDataTaskAndWaitForCompletion(
-    NSURLSessionDataTask* task,
-    int64_t deadline_ns) {
-  [delegate_ reset];
-  [task resume];
-  return [delegate_ waitForDone:task withTimeout:deadline_ns];
-}
-
-::testing::AssertionResult CronetTestBase::IsResponseSuccessful(
-    NSURLSessionDataTask* task) {
-  if ([delegate_ errorPerTask][task]) {
-    return ::testing::AssertionFailure() << "error in response: " <<
-           [[[delegate_ error] description]
-               cStringUsingEncoding:NSUTF8StringEncoding];
-  }
-
-  if (![delegate_ responsePerTask][task]) {
-    return ::testing::AssertionFailure() << " no response has been received";
-  }
-
-  NSInteger statusCode = [delegate_ responsePerTask][task].statusCode;
-  if (statusCode < 200 || statusCode > 299) {
-    return ::testing::AssertionFailure()
-           << " the response code was " << statusCode;
-  }
-
-  return ::testing::AssertionSuccess() << "no errors in response";
-}
-
-::testing::AssertionResult CronetTestBase::IsResponseCanceled(
-    NSURLSessionDataTask* task) {
-  NSError* error = [delegate_ errorPerTask][task];
-  if (error && [error code] == NSURLErrorCancelled)
-    return ::testing::AssertionSuccess() << "the response is canceled";
-  return ::testing::AssertionFailure() << "the response is not canceled."
-                                       << " The response error is " <<
-         [[error description] cStringUsingEncoding:NSUTF8StringEncoding];
-}
-
-std::unique_ptr<net::MockCertVerifier> CronetTestBase::CreateMockCertVerifier(
-    const std::vector<std::string>& certs,
-    bool known_root) {
-  std::unique_ptr<net::MockCertVerifier> mock_cert_verifier(
-      new net::MockCertVerifier());
-  for (const auto& cert : certs) {
-    net::CertVerifyResult verify_result;
-    verify_result.verified_cert =
-        net::ImportCertFromFile(net::GetTestCertsDirectory(), cert);
-
-    // By default, HPKP verification is enabled for known trust roots only.
-    verify_result.is_issued_by_known_root = known_root;
-
-    // Calculate the public key hash and add it to the verify_result.
-    net::HashValue hashValue;
-    CHECK(CalculatePublicKeySha256(*verify_result.verified_cert.get(),
-                                   &hashValue));
-    verify_result.public_key_hashes.push_back(hashValue);
-
-    mock_cert_verifier->AddResultForCert(verify_result.verified_cert.get(),
-                                         verify_result, net::OK);
-  }
-  return mock_cert_verifier;
-}
-
-void CronetTestBase::PostBlockToFileThread(const base::Location& from_here,
-                                           BlockType block) {
-  base::SingleThreadTaskRunner* file_runner =
-      [Cronet getFileThreadRunnerForTesting];
-  file_runner->PostTask(from_here,
-                        base::BindOnce(&CronetTestBase::ExecuteBlock,
-                                       base::Unretained(this), block));
-}
-
-void CronetTestBase::PostBlockToNetworkThread(const base::Location& from_here,
-                                              BlockType block) {
-  base::SingleThreadTaskRunner* network_runner =
-      [Cronet getNetworkThreadRunnerForTesting];
-  network_runner->PostTask(from_here,
-                           base::BindOnce(&CronetTestBase::ExecuteBlock,
-                                          base::Unretained(this), block));
-}
-
-bool CronetTestBase::CalculatePublicKeySha256(const net::X509Certificate& cert,
-                                              net::HashValue* out_hash_value) {
-  // Extract the public key from the cert.
-  base::StringPiece spki_bytes;
-  if (!net::asn1::ExtractSPKIFromDERCert(
-          net::x509_util::CryptoBufferAsStringPiece(cert.cert_buffer()),
-          &spki_bytes)) {
-    LOG(INFO) << "Unable to retrieve the public key from the DER cert";
-    return false;
-  }
-  // Calculate SHA256 hash of public key bytes.
-  *out_hash_value = net::HashValue(net::HASH_VALUE_SHA256);
-  crypto::SHA256HashString(spki_bytes, out_hash_value->data(),
-                           crypto::kSHA256Length);
-  return true;
-}
-
-void CronetTestBase::ExecuteBlock(BlockType block) {
-  block();
-}
-
-}  // namespace cronet
diff --git a/components/cronet/ios/test/get_stream_engine.mm b/components/cronet/ios/test/get_stream_engine.mm
deleted file mode 100644
index af9a9b7f..0000000
--- a/components/cronet/ios/test/get_stream_engine.mm
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import <Cronet/Cronet.h>
-#import <Foundation/Foundation.h>
-
-#include "components/cronet/ios/test/start_cronet.h"
-#include "components/grpc_support/test/get_stream_engine.h"
-
-@interface Cronet (ExposedForTesting)
-+ (void)shutdownForTesting;
-@end
-
-namespace grpc_support {
-
-stream_engine* GetTestStreamEngine(int port) {
-  return [Cronet getGlobalEngine];
-}
-
-void StartTestStreamEngine(int port) {
-  cronet::StartCronet(port);
-}
-
-void ShutdownTestStreamEngine() {
-  [Cronet shutdownForTesting];
-}
-
-}  // namespace grpc_support
diff --git a/components/cronet/ios/test/start_cronet.h b/components/cronet/ios/test/start_cronet.h
deleted file mode 100644
index 1f8be0db..0000000
--- a/components/cronet/ios/test/start_cronet.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2016 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_CRONET_IOS_TEST_START_CRONET_H_
-#define COMPONENTS_CRONET_IOS_TEST_START_CRONET_H_
-
-namespace cronet {
-
-// Starts Cronet, or restarts if Cronet is already running.  Will have Cronet
-// point test.example.com" to "localhost:|port|".
-void StartCronet(int port);
-
-}  // namespace cronet
-
-#endif  // COMPONENTS_CRONET_IOS_TEST_START_CRONET_H_
diff --git a/components/cronet/ios/test/start_cronet.mm b/components/cronet/ios/test/start_cronet.mm
deleted file mode 100644
index 56a8b29..0000000
--- a/components/cronet/ios/test/start_cronet.mm
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import <Cronet/Cronet.h>
-
-#include "components/cronet/ios/test/start_cronet.h"
-
-#include "base/strings/stringprintf.h"
-#include "base/strings/sys_string_conversions.h"
-
-namespace cronet {
-
-void StartCronet(int port) {
-  [Cronet setUserAgent:@"CronetTest/1.0.0.0" partial:NO];
-  [Cronet setHttp2Enabled:true];
-  [Cronet setQuicEnabled:true];
-  [Cronet setAcceptLanguages:@"en-US,en"];
-  [Cronet addQuicHint:@"test.example.com" port:443 altPort:443];
-  [Cronet enableTestCertVerifierForTesting];
-  [Cronet setHttpCacheType:CRNHttpCacheTypeDisabled];
-
-  [Cronet start];
-
-  NSString* rules = base::SysUTF8ToNSString(
-      base::StringPrintf("MAP test.example.com 127.0.0.1:%d,"
-                         "MAP notfound.example.com ^NOTFOUND",
-                         port));
-  [Cronet setHostResolverRulesForTesting:rules];
-}
-
-}  // namespace cronet
diff --git a/components/cronet/native/cronet.idl b/components/cronet/native/cronet.idl
index ddb3ad5b..8e83cb0 100644
--- a/components/cronet/native/cronet.idl
+++ b/components/cronet/native/cronet.idl
@@ -602,7 +602,6 @@
   /**
    * Optional network thread priority. NAN indicates unset, use default.
    * On Android, corresponds to android.os.Process.setThreadPriority() values.
-   * On iOS, corresponds to NSThread::setThreadPriority values.
    * Do not specify for other platforms.
    */
   double network_thread_priority = double.NAN;
diff --git a/components/cronet/native/test_instructions.md b/components/cronet/native/test_instructions.md
index 5654983..d29c1ab 100644
--- a/components/cronet/native/test_instructions.md
+++ b/components/cronet/native/test_instructions.md
@@ -8,7 +8,7 @@
 platforms.
 
 TODO(caraitto): Add mobile test information for the native API in the
-Android and iOS pages as instructions for testing vary by platform.
+Android page as instructions for testing vary by platform.
 
 ## Checkout and build
 
diff --git a/components/cronet/testing/BUILD.gn b/components/cronet/testing/BUILD.gn
index 9bb1cff..1d0b060e 100644
--- a/components/cronet/testing/BUILD.gn
+++ b/components/cronet/testing/BUILD.gn
@@ -48,8 +48,4 @@
     "test_server/test_server.cc",
     "test_server/test_server.h",
   ]
-
-  if (is_ios) {
-    deps += [ ":test_support_bundle_data" ]
-  }
 }
diff --git a/components/cronet/tools/cr_cronet.py b/components/cronet/tools/cr_cronet.py
index 92584d56..097c9bc 100755
--- a/components/cronet/tools/cr_cronet.py
+++ b/components/cronet/tools/cr_cronet.py
@@ -73,16 +73,6 @@
              extra_options)
 
 
-def test_ios(out_dir, extra_options):
-  return run([out_dir + '/iossim', '-c', quoted_args(extra_options),
-             out_dir + '/cronet_test.app'])
-
-
-def unittest_ios(out_dir, extra_options):
-  return run([out_dir + '/iossim', '-c', quoted_args(extra_options),
-             out_dir + '/cronet_unittests_ios.app'])
-
-
 def debug(extra_options):
   return run(['build/android/adb_gdb', '--start',
              '--activity=.CronetTestActivity',
@@ -131,40 +121,6 @@
   return builder_name
 
 
-def get_ios_gn_args(is_release, target_cpu):
-  print(is_release, target_cpu)
-  gn_args = [
-      'target_os = "ios"',
-      'enable_websockets = false',
-      'disable_file_support = true',
-      'disable_brotli_filter = false',
-      'is_component_build = false',
-      'use_crash_key_stubs = true',
-      'use_partition_alloc = false',
-      'include_transport_security_state_preload_list = false',
-      use_goma(),
-      'use_platform_icu_alternatives = true',
-      'is_cronet_build = true',
-      'enable_remoting = false',
-      'ios_app_bundle_id_prefix = "org.chromium"',
-      'ios_deployment_target = "10.0"',
-      'enable_dsyms = true',
-      'ios_stack_profiler_enabled = false',
-      f'target_cpu = "{target_cpu}"',
-  ]
-  if is_release:
-    gn_args += [
-        'is_debug = false',
-        'is_official_build = true',
-    ]
-  return ' '.join(gn_args)
-
-
-def ios_gn_gen(is_release, target_cpu, out_dir):
-  gn_extra = ['--ide=xcode', '--filters=//components/cronet/*']
-  return gn(out_dir, get_ios_gn_args(is_release, target_cpu), gn_extra)
-
-
 def filter_gn_args(gn_args):
   gn_arg_matcher = re.compile("^.*=.*$")
   # `mb_py lookup` prints out a bunch of metadata lines which we don't
@@ -195,14 +151,7 @@
   return gn(out_dir, ' '.join(gn_args))
 
 
-def gn_gen(is_release, target_cpu, out_dir, is_ios):
-  if is_ios:
-    return ios_gn_gen(is_release, target_cpu, out_dir)
-  return android_gn_gen(is_release, target_cpu, out_dir)
-
-
 def main():
-  is_ios = (sys.platform == 'darwin')
   parser = argparse.ArgumentParser()
   parser.add_argument('command',
                       choices=['gn',
@@ -229,44 +178,27 @@
                       help='use release configuration')
   parser.add_argument('-a', '--asan', action='store_true',
                       help='use address sanitizer')
-  if is_ios:
-    parser.add_argument('-i', '--iphoneos', action='store_true',
-                      help='build for physical iphone')
-    parser.add_argument('-b', '--bundle-id-prefix', action='store',
-                      dest='bundle_id_prefix', default='org.chromium',
-                      help='configure bundle id prefix')
 
   options, extra_options = parser.parse_known_args()
   print("Options:", options)
   print("Extra options:", extra_options)
 
-  if is_ios:
-    test_target = 'cronet_test'
-    unit_target = 'cronet_unittests_ios'
-    if options.iphoneos:
-      out_dir_suffix = '-iphoneos'
-      target_cpu = 'arm64'
-    elif options.riscv64:
-      parser.error('iOS builds do not support riscv64.')
-    else:
-      out_dir_suffix = '-iphonesimulator'
-      target_cpu = 'x64'
-  else:  # is_android
-    test_target = 'cronet_test_instrumentation_apk'
-    unit_target = 'cronet_unittests_android'
-    if options.x86:
-      target_cpu = 'x86'
-      out_dir_suffix = '-x86'
-    elif options.riscv64:
-      target_cpu = 'riscv64'
-      out_dir_suffix = '-riscv64'
-    else:
-      target_cpu = 'arm64'
-      out_dir_suffix = '-arm64'
-    if options.asan:
-      # ASAN on Android requires one-time setup described here:
-      # https://www.chromium.org/developers/testing/addresssanitizer
-      out_dir_suffix += '-asan'
+  test_target = 'cronet_test_instrumentation_apk'
+  unit_target = 'cronet_unittests_android'
+  if options.x86:
+    target_cpu = 'x86'
+    out_dir_suffix = '-x86'
+  elif options.riscv64:
+    target_cpu = 'riscv64'
+    out_dir_suffix = '-riscv64'
+  else:
+    target_cpu = 'arm64'
+    out_dir_suffix = '-arm64'
+
+  if options.asan:
+    # ASAN on Android requires one-time setup described here:
+    # https://www.chromium.org/developers/testing/addresssanitizer
+    out_dir_suffix += '-asan'
 
   if options.out_dir:
     out_dir = options.out_dir
@@ -277,41 +209,31 @@
       out_dir = 'out/Debug' + out_dir_suffix
 
   if (options.command=='gn'):
-    return gn_gen(options.release, target_cpu, out_dir, is_ios)
+    return android_gn_gen(options.release, target_cpu, out_dir)
   if (options.command=='sync'):
     return run(['git', 'pull', '--rebase']) or run(['gclient', 'sync'])
   if (options.command=='build'):
     return build(out_dir, test_target, extra_options)
-  if (not is_ios):
-    if (options.command=='install'):
-      return install(out_dir)
-    if (options.command=='proguard'):
-      return build(out_dir, 'cronet_sample_proguard_apk')
-    if (options.command=='test'):
-      return install(out_dir) or test(out_dir, extra_options)
-    if (options.command=='build-test'):
-      return build(out_dir, test_target) or install(out_dir) or \
-          test(out_dir, extra_options)
-    if (options.command=='stack'):
-      return stack(out_dir)
-    if (options.command=='debug'):
-      return install(out_dir) or debug(extra_options)
-    if (options.command=='build-debug'):
-      return build(out_dir, test_target) or install(out_dir) or \
-          debug(extra_options)
-    if (options.command=='unit'):
-      return unittest(out_dir, extra_options)
-    if (options.command=='build-unit'):
-      return build(out_dir, unit_target) or unittest(out_dir, extra_options)
-  else:
-    if (options.command=='test'):
-      return test_ios(out_dir, extra_options)
-    if (options.command=='build-test'):
-      return build(out_dir, test_target) or test_ios(out_dir, extra_options)
-    if (options.command=='unit'):
-      return unittest_ios(out_dir, extra_options)
-    if (options.command=='build-unit'):
-      return build(out_dir, unit_target) or unittest_ios(out_dir, extra_options)
+  if (options.command == 'install'):
+    return install(out_dir)
+  if (options.command == 'proguard'):
+    return build(out_dir, 'cronet_sample_proguard_apk')
+  if (options.command == 'test'):
+    return install(out_dir) or test(out_dir, extra_options)
+  if (options.command == 'build-test'):
+    return build(out_dir, test_target) or install(out_dir) or \
+        test(out_dir, extra_options)
+  if (options.command == 'stack'):
+    return stack(out_dir)
+  if (options.command == 'debug'):
+    return install(out_dir) or debug(extra_options)
+  if (options.command == 'build-debug'):
+    return build(out_dir, test_target) or install(out_dir) or \
+        debug(extra_options)
+  if (options.command == 'unit'):
+    return unittest(out_dir, extra_options)
+  if (options.command == 'build-unit'):
+    return build(out_dir, unit_target) or unittest(out_dir, extra_options)
 
   parser.print_help()
   return 1
diff --git a/components/cronet/tools/hide_symbols.py b/components/cronet/tools/hide_symbols.py
deleted file mode 100755
index fe6af2b..0000000
--- a/components/cronet/tools/hide_symbols.py
+++ /dev/null
@@ -1,143 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2017 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Create a static library which exposes only symbols which are explicitly marked
-# as visible e.g., by __attribute__((visibility("default"))).
-#
-# See BUILD.gn in this directory for usage example.
-#
-# This way, we can reduce risk of symbol conflict when linking it into apps
-# by exposing internal symbols, especially in third-party libraries.
-
-
-
-import glob
-import argparse
-import os
-import subprocess
-import sys
-
-
-# Mapping from GN's target_cpu attribute to ld's -arch parameter.
-# Taken from the definition of config("compiler") in:
-#   //build/config/mac/BUILD.gn
-GN_CPU_TO_LD_ARCH = {
-  'x64': 'x86_64',
-  'x86': 'i386',
-  'armv7': 'armv7',
-  'arm': 'armv7',
-  'arm64': 'arm64',
-}
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument(
-      '--input_libs',
-      help='Comma-separated paths to input .a files which contain symbols '
-           'which must be always linked.')
-  parser.add_argument(
-      '--deps_lib',
-      help='The path to a complete static library (.a file) which contains all '
-           'dependencies of --input_libs. .o files in this library are also '
-           'added to the output library, but only if they are referred from '
-           '--input_libs.')
-  parser.add_argument(
-      '--output_obj',
-      help='Outputs the generated .o file here. This is an intermediate file.')
-  parser.add_argument(
-      '--output_lib',
-      help='Outputs the generated .a file here.')
-  parser.add_argument(
-      '--current_cpu',
-      help='The current processor architecture in the format of the target_cpu '
-           'attribute in GN.')
-  parser.add_argument(
-      '--use_custom_libcxx', default=False, action='store_true',
-      help='Confirm there is a custom libc++ linked in.')
-  args, unknownargs = parser.parse_known_args()
-  assert not unknownargs
-
-  developer_dir = subprocess.check_output(
-      ['xcode-select', '--print-path'], universal_newlines=True).strip()
-
-  xctoolchain_libs = glob.glob(developer_dir
-      + '/Toolchains/XcodeDefault.xctoolchain/usr/lib'
-      + '/clang/*/lib/darwin/*.ios.a')
-  print("Adding xctoolchain_libs: ", xctoolchain_libs)
-
-  # ld -r concatenates multiple .o files and .a files into a single .o file,
-  # while "hiding" symbols not marked as visible.
-  command = [
-    'xcrun', 'ld',
-    '-arch', GN_CPU_TO_LD_ARCH[args.current_cpu],
-    '-r',
-  ]
-  for input_lib in args.input_libs.split(','):
-    # By default, ld only pulls .o files out of a static library if needed to
-    # resolve some symbol reference. We apply -force_load option to input_lib
-    # (but not to deps_lib) to force pulling all .o files.
-    command += ['-force_load', input_lib]
-  command += xctoolchain_libs
-  command += [
-    args.deps_lib,
-    '-o', args.output_obj
-  ]
-  try:
-    subprocess.check_call(command)
-  except subprocess.CalledProcessError:
-    # Work around LD failure for x86 Debug buiilds when it fails with error:
-    # ld: scattered reloc r_address too large for architecture i386
-    if args.current_cpu == "x86":
-      # Combmine input lib with dependencies into output lib.
-      command = [
-        'xcrun', 'libtool', '-static', '-no_warning_for_no_symbols',
-        '-o', args.output_lib,
-        args.input_libs, args.deps_lib,
-      ]
-      subprocess.check_call(command)
-      # Strip debug info from output lib so its size doesn't exceed 512mb.
-      command = [
-        'xcrun', 'strip', '-S', args.output_lib,
-      ]
-      subprocess.check_call(command)
-      return
-
-    sys.exit(1)
-
-  if os.path.exists(args.output_lib):
-    os.remove(args.output_lib)
-
-  # Creates a .a file which contains a single .o file.
-  command = [
-    'xcrun', 'ar', '-r',
-    args.output_lib,
-    args.output_obj,
-  ]
-
-  # When compiling for 64bit targets, the symbols in call_with_eh_frame.o are
-  # referenced in assembly and eventually stripped by the call to ld -r above,
-  # perhaps because the linker incorrectly assumes that those symbols are not
-  # used. Using -keep_private_externs fixes the compile issue, but breaks
-  # other parts of cronet. Instead, simply add a second .o file with the
-  # personality routine. Note that this issue was not caught by Chrome tests,
-  # it was only detected when apps tried to link the resulting .a file.
-  if args.current_cpu in ('x64', 'arm64'):
-    command += [ 'obj/base/base/call_with_eh_frame.o' ]
-
-  subprocess.check_call(command)
-
-  if args.use_custom_libcxx:
-    ret = os.system('xcrun nm -u "' + args.output_obj +
-                    '" | grep ___cxa_pure_virtual')
-    if ret == 0:
-      print("ERROR: Found undefined libc++ symbols, "
-            "is libc++ included in dependencies?")
-      sys.exit(2)
-
-
-if __name__ == "__main__":
-  main()
diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc
index 9e42496..5fb9a2d4 100644
--- a/components/cronet/url_request_context_config.cc
+++ b/components/cronet/url_request_context_config.cc
@@ -90,7 +90,6 @@
     "enable_socket_recv_optimization";
 const char kQuicVersion[] = "quic_version";
 const char kQuicFlags[] = "set_quic_flags";
-const char kQuicIOSNetworkServiceType[] = "ios_network_service_type";
 const char kRetryWithoutAltSvcOnQuicErrors[] =
     "retry_without_alt_svc_on_quic_errors";
 const char kInitialDelayForBrokenAlternativeServiceSeconds[] =
@@ -186,14 +185,6 @@
 // specified by CronetManifest's documentation.
 const char kEnableTelemetry[] = "enable_telemetry";
 
-// "goaway_sessions_on_ip_change" is default on for iOS unless overridden via
-// experimental options explicitly.
-#if BUILDFLAG(IS_IOS)
-const bool kDefaultQuicGoAwaySessionsOnIpChange = true;
-#else
-const bool kDefaultQuicGoAwaySessionsOnIpChange = false;
-#endif
-
 // Serializes a base::Value into a string that can be used as the value of
 // JFV-encoded HTTP header [1].  If |value| is a list, we remove the outermost
 // [] delimiters from the result.
@@ -500,14 +491,6 @@
       quic_params->close_sessions_on_ip_change =
           quic_args.FindBool(kQuicCloseSessionsOnIpChange)
               .value_or(quic_params->close_sessions_on_ip_change);
-      if (quic_params->close_sessions_on_ip_change &&
-          kDefaultQuicGoAwaySessionsOnIpChange) {
-        // "close_sessions_on_ip_change" and "goaway_sessions_on_ip_change"
-        // are mutually exclusive. Turn off the goaway option which is
-        // default on for iOS if "close_sessions_on_ip_change" is set via
-        // experimental options.
-        quic_params->goaway_sessions_on_ip_change = false;
-      }
 
       quic_params->goaway_sessions_on_ip_change =
           quic_args.FindBool(kQuicGoAwaySessionsOnIpChange)
@@ -615,10 +598,6 @@
           net::SetQuicFlagByName(tokens[0], tokens[1]);
         }
       }
-
-      quic_params->ios_network_service_type =
-          quic_args.FindInt(kQuicIOSNetworkServiceType)
-              .value_or(quic_params->ios_network_service_type);
     } else if (iter->first == kAsyncDnsFieldTrialName) {
       if (!iter->second.is_dict()) {
         LOG(ERROR) << "\"" << iter->first << "\" config params \""
@@ -854,10 +833,7 @@
   session_params.enable_quic = enable_quic;
   auto quic_context = std::make_unique<net::QuicContext>();
   if (enable_quic) {
-    // Note goaway sessions on ip change will be turned on by default
-    // for iOS unless overrided via experiemental options.
-    quic_context->params()->goaway_sessions_on_ip_change =
-        kDefaultQuicGoAwaySessionsOnIpChange;
+    quic_context->params()->goaway_sessions_on_ip_change = false;
     // Explicitly disable network-change migration on Cronet. This is tracked
     // at crbug.com/1430096.
     quic_context->params()->migrate_sessions_on_network_change_v2 = false;
diff --git a/components/cronet/url_request_context_config.h b/components/cronet/url_request_context_config.h
index 844132b..6c38c6d6 100644
--- a/components/cronet/url_request_context_config.h
+++ b/components/cronet/url_request_context_config.h
@@ -166,7 +166,6 @@
 
   // Optional network thread priority.
   // On Android, corresponds to android.os.Process.setThreadPriority() values.
-  // On iOS, corresponds to NSThread::setThreadPriority values.
   const absl::optional<double> network_thread_priority;
 
   // Whether the connection status of active bidirectional streams should be
@@ -213,8 +212,7 @@
       bool bypass_public_key_pinning_for_local_trust_anchors,
       // Optional network thread priority.
       // On Android, corresponds to android.os.Process.setThreadPriority()
-      // values. On iOS, corresponds to NSThread::setThreadPriority values. Do
-      // not specify for other targets.
+      // values. Do not specify for other targets.
       absl::optional<double> network_thread_priority);
 
  private:
@@ -248,8 +246,7 @@
       bool bypass_public_key_pinning_for_local_trust_anchors,
       // Optional network thread priority.
       // On Android, corresponds to android.os.Process.setThreadPriority()
-      // values. On iOS, corresponds to NSThread::setThreadPriority values. Do
-      // not specify for other targets.
+      // values. Do not specify for other targets.
       absl::optional<double> network_thread_priority);
 
   // Parses experimental options from their JSON format to the format used
@@ -326,7 +323,6 @@
 
   // Optional network thread priority.
   // On Android, corresponds to android.os.Process.setThreadPriority() values.
-  // On iOS, corresponds to NSThread::setThreadPriority values.
   // Do not specify for other targets.
   absl::optional<double> network_thread_priority;
 };
diff --git a/components/cronet/url_request_context_config_unittest.cc b/components/cronet/url_request_context_config_unittest.cc
index e7a3366..3f01ef6de 100644
--- a/components/cronet/url_request_context_config_unittest.cc
+++ b/components/cronet/url_request_context_config_unittest.cc
@@ -138,7 +138,6 @@
   // See http://crbug.com/696569.
   options.Set("disable_ipv6_on_wifi", true);
   options.Set("spdy_go_away_on_ip_change", true);
-  options.SetByDottedPath({"QUIC.ios_network_service_type"}, 2);
   std::string options_json;
   EXPECT_TRUE(base::JSONWriter::Write(options, &options_json));
 
@@ -220,11 +219,8 @@
   EXPECT_FALSE(quic_params->exponential_backoff_on_initial_delay.has_value());
   EXPECT_FALSE(quic_params->delay_main_job_with_available_spdy_session);
 
-  // Check network_service_type for iOS.
-  EXPECT_EQ(2, quic_params->ios_network_service_type);
-
 #if defined(ENABLE_BUILT_IN_DNS)
-  // Check AsyncDNS resolver is enabled (not supported on iOS).
+  // Check AsyncDNS resolver is enabled.
   EXPECT_TRUE(context->host_resolver()->GetDnsConfigAsValue());
 #endif  // defined(ENABLE_BUILT_IN_DNS)
 
@@ -533,75 +529,10 @@
   EXPECT_TRUE(quic_params->allow_server_migration);
 }
 
-// Test that goaway_sessions_on_ip_change is set on by default for iOS.
-#if BUILDFLAG(IS_IOS)
-#define MAYBE_SetQuicGoAwaySessionsOnIPChangeByDefault \
-  SetQuicGoAwaySessionsOnIPChangeByDefault
-#else
-#define MAYBE_SetQuicGoAwaySessionsOnIPChangeByDefault \
-  DISABLED_SetQuicGoAwaySessionsOnIPChangeByDefault
-#endif
-TEST(URLRequestContextConfigTest,
-     MAYBE_SetQuicGoAwaySessionsOnIPChangeByDefault) {
-  base::test::TaskEnvironment task_environment_(
-      base::test::TaskEnvironment::MainThreadType::IO);
-
-  std::unique_ptr<URLRequestContextConfig> config =
-      URLRequestContextConfig::CreateURLRequestContextConfig(
-          // Enable QUIC.
-          true,
-          // Enable SPDY.
-          true,
-          // Enable Brotli.
-          false,
-          // Type of http cache.
-          URLRequestContextConfig::HttpCacheType::DISK,
-          // Max size of http cache in bytes.
-          1024000,
-          // Disable caching for HTTP responses. Other information may be stored
-          // in the cache.
-          false,
-          // Storage path for http cache and cookie storage.
-          "/data/data/org.chromium.net/app_cronet_test/test_storage",
-          // Accept-Language request header field.
-          "foreign-language",
-          // User-Agent request header field.
-          "fake agent",
-          // JSON encoded experimental options.
-          "{\"QUIC\":{}}",
-          // MockCertVerifier to use for testing purposes.
-          std::unique_ptr<net::CertVerifier>(),
-          // Enable network quality estimator.
-          false,
-          // Enable Public Key Pinning bypass for local trust anchors.
-          true,
-          // Optional network thread priority.
-          absl::optional<double>());
-
-  net::URLRequestContextBuilder builder;
-  config->ConfigureURLRequestContextBuilder(&builder);
-  // Set a ProxyConfigService to avoid DCHECK failure when building.
-  builder.set_proxy_config_service(
-      std::make_unique<net::ProxyConfigServiceFixed>(
-          net::ProxyConfigWithAnnotation::CreateDirect()));
-  std::unique_ptr<net::URLRequestContext> context(builder.Build());
-  const net::QuicParams* quic_params = context->quic_context()->params();
-
-  EXPECT_FALSE(quic_params->close_sessions_on_ip_change);
-  EXPECT_TRUE(quic_params->goaway_sessions_on_ip_change);
-}
-
 // Tests that goaway_sessions_on_ip_changes can be set on via
-// experimental options on non-iOS.
-#if !BUILDFLAG(IS_IOS)
-#define MAYBE_SetQuicGoAwaySessionsOnIPChangeViaExperimentOptions \
-  SetQuicGoAwaySessionsOnIPChangeViaExperimentOptions
-#else
-#define MAYBE_SetQuicGoAwaySessionsOnIPChangeViaExperimentOptions \
-  DISABLED_SetQuicGoAwaySessionsOnIPChangeViaExperimentOptions
-#endif
+// experimental options.
 TEST(URLRequestContextConfigTest,
-     MAYBE_SetQuicGoAwaySessionsOnIPChangeViaExperimentOptions) {
+     SetQuicGoAwaySessionsOnIPChangeViaExperimentOptions) {
   base::test::TaskEnvironment task_environment_(
       base::test::TaskEnvironment::MainThreadType::IO);
 
@@ -650,65 +581,6 @@
   EXPECT_TRUE(quic_params->goaway_sessions_on_ip_change);
 }
 
-// Test that goaway_sessions_on_ip_change can be set to false via
-// experimental options on iOS.
-#if BUILDFLAG(IS_IOS)
-#define MAYBE_DisableQuicGoAwaySessionsOnIPChangeViaExperimentOptions \
-  DisableQuicGoAwaySessionsOnIPChangeViaExperimentOptions
-#else
-#define MAYBE_DisableQuicGoAwaySessionsOnIPChangeViaExperimentOptions \
-  DISABLED_DisableQuicGoAwaySessionsOnIPChangeViaExperimentOptions
-#endif
-TEST(URLRequestContextConfigTest,
-     MAYBE_DisableQuicGoAwaySessionsOnIPChangeViaExperimentOptions) {
-  base::test::TaskEnvironment task_environment_(
-      base::test::TaskEnvironment::MainThreadType::IO);
-
-  std::unique_ptr<URLRequestContextConfig> config =
-      URLRequestContextConfig::CreateURLRequestContextConfig(
-          // Enable QUIC.
-          true,
-          // Enable SPDY.
-          true,
-          // Enable Brotli.
-          false,
-          // Type of http cache.
-          URLRequestContextConfig::HttpCacheType::DISK,
-          // Max size of http cache in bytes.
-          1024000,
-          // Disable caching for HTTP responses. Other information may be stored
-          // in the cache.
-          false,
-          // Storage path for http cache and cookie storage.
-          "/data/data/org.chromium.net/app_cronet_test/test_storage",
-          // Accept-Language request header field.
-          "foreign-language",
-          // User-Agent request header field.
-          "fake agent",
-          // JSON encoded experimental options.
-          "{\"QUIC\":{\"goaway_sessions_on_ip_change\":false}}",
-          // MockCertVerifier to use for testing purposes.
-          std::unique_ptr<net::CertVerifier>(),
-          // Enable network quality estimator.
-          false,
-          // Enable Public Key Pinning bypass for local trust anchors.
-          true,
-          // Optional network thread priority.
-          absl::optional<double>());
-
-  net::URLRequestContextBuilder builder;
-  config->ConfigureURLRequestContextBuilder(&builder);
-  // Set a ProxyConfigService to avoid DCHECK failure when building.
-  builder.set_proxy_config_service(
-      std::make_unique<net::ProxyConfigServiceFixed>(
-          net::ProxyConfigWithAnnotation::CreateDirect()));
-  std::unique_ptr<net::URLRequestContext> context(builder.Build());
-  const net::QuicParams* quic_params = context->quic_context()->params();
-
-  EXPECT_FALSE(quic_params->close_sessions_on_ip_change);
-  EXPECT_FALSE(quic_params->goaway_sessions_on_ip_change);
-}
-
 TEST(URLRequestContextConfigTest, SetQuicConnectionMigrationV2Options) {
   base::test::TaskEnvironment task_environment_(
       base::test::TaskEnvironment::MainThreadType::IO);
@@ -735,11 +607,7 @@
           // User-Agent request header field.
           "fake agent",
           // JSON encoded experimental options.
-          // Explicitly turn off "goaway_sessions_on_ip_change" which is default
-          // enabled on iOS but cannot be simultaneously set with migration
-          // option.
           "{\"QUIC\":{\"migrate_sessions_on_network_change_v2\":true,"
-          "\"goaway_sessions_on_ip_change\":false,"
           "\"migrate_sessions_early_v2\":true,"
           "\"retry_on_alternate_network_before_handshake\":true,"
           "\"migrate_idle_sessions\":true,"
diff --git a/components/exo/wayland/zwp_linux_dmabuf.cc b/components/exo/wayland/zwp_linux_dmabuf.cc
index 7f76bab..defecea4 100644
--- a/components/exo/wayland/zwp_linux_dmabuf.cc
+++ b/components/exo/wayland/zwp_linux_dmabuf.cc
@@ -159,20 +159,7 @@
 
   gfx::NativePixmapHandle handle;
 
-  // A lot of clients (arc++, arcvm, sommelier etc) pass 0
-  // (DRM_FORMAT_MOD_LINEAR) when they don't know the format modifier.
-  // They're supposed to pass DRM_FORMAT_MOD_INVALID, which triggers
-  // EGL import without an explicit modifier and lets the driver pick
-  // up the buffer layout from out-of-band channels like kernel ioctls.
-  //
-  // We can't fix all the clients in one go, but we can preserve the
-  // behaviour that 0 means implicit modifier, but only setting the
-  // handle modifier if we get a non-0 modifier.
-  //
-  // TODO(hoegsberg): Once we've fixed all relevant clients, we should
-  // remove this so as to catch future misuse.
-  if (linux_buffer_params->planes[0].modifier != 0)
-    handle.modifier = linux_buffer_params->planes[0].modifier;
+  handle.modifier = linux_buffer_params->planes[0].modifier;
 
   for (uint32_t i = 0; i < linux_buffer_params->planes.size(); ++i) {
     auto& plane = linux_buffer_params->planes[i];
diff --git a/components/gcm_driver/crypto/gcm_key_store.cc b/components/gcm_driver/crypto/gcm_key_store.cc
index f1c2f66c..6417acc6 100644
--- a/components/gcm_driver/crypto/gcm_key_store.cc
+++ b/components/gcm_driver/crypto/gcm_key_store.cc
@@ -177,8 +177,6 @@
                                const std::string& auth_secret,
                                KeysCallback callback,
                                bool success) {
-  UMA_HISTOGRAM_BOOLEAN("GCM.Crypto.CreateKeySuccessRate", success);
-
   if (!success) {
     DVLOG(1) << "Unable to store the created key in the GCM Key Store.";
 
diff --git a/components/gcm_driver/gcm_stats_recorder_impl.cc b/components/gcm_driver/gcm_stats_recorder_impl.cc
index 2b8099c..70bc4539 100644
--- a/components/gcm_driver/gcm_stats_recorder_impl.cc
+++ b/components/gcm_driver/gcm_stats_recorder_impl.cc
@@ -350,9 +350,8 @@
                          retries_left));
 }
 
-void GCMStatsRecorderImpl::RecordUnregistrationSent(
-    const std::string& app_id, const std::string& source) {
-  UMA_HISTOGRAM_COUNTS_1M("GCM.UnregistrationRequest", 1);
+void GCMStatsRecorderImpl::RecordUnregistrationSent(const std::string& app_id,
+                                                    const std::string& source) {
   if (!is_recording_)
     return;
   RecordRegistration(app_id, source, "Unregistration request sent",
diff --git a/components/history_clusters/core/config.h b/components/history_clusters/core/config.h
index 70494747..04da466 100644
--- a/components/history_clusters/core/config.h
+++ b/components/history_clusters/core/config.h
@@ -328,7 +328,7 @@
 
   // The `kJourneysZeroStateFiltering` feature and child params.
 
-  bool apply_zero_state_filtering = false;
+  bool apply_zero_state_filtering = true;
 
   // The `kNtpChromeCartInHistoryClusterModule` child params.
 
diff --git a/components/history_clusters/core/features.cc b/components/history_clusters/core/features.cc
index 613707c..df5cc4d 100644
--- a/components/history_clusters/core/features.cc
+++ b/components/history_clusters/core/features.cc
@@ -99,7 +99,7 @@
 
 BASE_FEATURE(kJourneysZeroStateFiltering,
              "JourneysZeroStateFiltering",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 }  // namespace internal
 
diff --git a/components/optimization_guide/core/model_execution/on_device_model_execution_config_interpreter.cc b/components/optimization_guide/core/model_execution/on_device_model_execution_config_interpreter.cc
index 199c513..efe92af 100644
--- a/components/optimization_guide/core/model_execution/on_device_model_execution_config_interpreter.cc
+++ b/components/optimization_guide/core/model_execution/on_device_model_execution_config_interpreter.cc
@@ -59,7 +59,7 @@
 // Returns whether `condition` applies based on `message`.
 bool EvaluateCondition(const google::protobuf::MessageLite& message,
                        const proto::Condition& condition) {
-  absl::optional<proto::Value> proto_value =
+  std::optional<proto::Value> proto_value =
       GetProtoValue(message, condition.proto_field());
   if (!proto_value) {
     return false;
@@ -151,32 +151,43 @@
   feature_configs_.clear();
 }
 
-absl::optional<std::string>
+std::optional<
+    OnDeviceModelExecutionConfigInterpreter::InputStringConstructionResult>
 OnDeviceModelExecutionConfigInterpreter::ConstructInputString(
     proto::ModelExecutionFeature feature,
-    const google::protobuf::MessageLite& request) const {
+    const google::protobuf::MessageLite& request,
+    bool want_input_context) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // Get the config to construct the input string.
   if (!HasConfigForFeature(feature)) {
-    return absl::nullopt;
+    return std::nullopt;
   }
   auto feature_config = feature_configs_.at(feature);
   if (!feature_config.has_input_config()) {
-    return absl::nullopt;
+    return std::nullopt;
   }
   const auto input_config = feature_config.input_config();
   if (input_config.request_base_name() != request.GetTypeName()) {
-    return absl::nullopt;
+    return std::nullopt;
   }
 
   // Construct string.
   std::vector<std::string> substitutions;
-  for (const auto& substitution : input_config.execute_substitutions()) {
+  bool should_ignore_input_context = false;
+  google::protobuf::RepeatedPtrField<proto::SubstitutedString>
+      config_substitutions =
+          want_input_context ? input_config.input_context_substitutions()
+                             : input_config.execute_substitutions();
+  for (const auto& substitution : config_substitutions) {
     if (!DoConditionsApply(request, substitution.conditions())) {
       continue;
     }
 
+    if (substitution.should_ignore_input_context()) {
+      should_ignore_input_context = true;
+    }
+
     std::vector<std::string> args;
     for (const auto& arg : substitution.args()) {
       if (!DoConditionsApply(request, arg.conditions())) {
@@ -186,23 +197,25 @@
       if (arg.has_raw_string()) {
         args.push_back(arg.raw_string());
       } else if (arg.has_proto_field()) {
-        absl::optional<proto::Value> value =
+        std::optional<proto::Value> value =
             GetProtoValue(request, arg.proto_field());
         if (!value) {
-          return absl::nullopt;
+          return std::nullopt;
         }
         args.push_back(GetStringFromValue(*value));
       }
     }
     if (static_cast<size_t>(substitution.expected_num_args()) != args.size()) {
-      return absl::nullopt;
+      return std::nullopt;
     }
 
     substitutions.push_back(
         StringPrintfVector(substitution.string_template(), std::move(args)));
   }
 
-  return base::StrCat(substitutions);
+  return InputStringConstructionResult{
+      .input_string = base::StrCat(substitutions),
+      .should_ignore_input_context = should_ignore_input_context};
 }
 
 }  // namespace optimization_guide
diff --git a/components/optimization_guide/core/model_execution/on_device_model_execution_config_interpreter.h b/components/optimization_guide/core/model_execution/on_device_model_execution_config_interpreter.h
index e0ba4fe..1caf518 100644
--- a/components/optimization_guide/core/model_execution/on_device_model_execution_config_interpreter.h
+++ b/components/optimization_guide/core/model_execution/on_device_model_execution_config_interpreter.h
@@ -5,6 +5,7 @@
 #define COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_ON_DEVICE_MODEL_EXECUTION_CONFIG_INTERPRETER_H_
 
 #include <memory>
+#include <optional>
 #include <string>
 
 #include "base/containers/flat_map.h"
@@ -14,7 +15,6 @@
 #include "base/sequence_checker.h"
 #include "base/task/sequenced_task_runner.h"
 #include "components/optimization_guide/proto/model_execution.pb.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace optimization_guide {
 
@@ -30,12 +30,22 @@
   // Whether there is an on-device model execution config for `feature`.
   bool HasConfigForFeature(proto::ModelExecutionFeature feature) const;
 
-  // Constructs the input string for `feature` and `request`. Will return
-  // absl::nullopt if there is not a valid config for the feature or the request
-  // could not be fulfilled for any reason.
-  absl::optional<std::string> ConstructInputString(
+  struct InputStringConstructionResult {
+    // The input string for the feature and request. Will return
+    // std::nullopt if there is not a valid config for the feature or the
+    // request could not be fulfilled for any reason.
+    std::string input_string;
+
+    // If this is not a request for input context, this returns whether the
+    // existing input context should be ignored for the execution.
+    bool should_ignore_input_context = false;
+  };
+
+  // Constructs the input string for `feature` and `request`.
+  std::optional<InputStringConstructionResult> ConstructInputString(
       proto::ModelExecutionFeature feature,
-      const google::protobuf::MessageLite& request) const;
+      const google::protobuf::MessageLite& request,
+      bool want_input_context) const;
 
  private:
   // Populates `feature_configs_` based on `config`.
diff --git a/components/optimization_guide/core/model_execution/on_device_model_execution_config_interpreter_unittest.cc b/components/optimization_guide/core/model_execution/on_device_model_execution_config_interpreter_unittest.cc
index be5f2fc..b126320 100644
--- a/components/optimization_guide/core/model_execution/on_device_model_execution_config_interpreter_unittest.cc
+++ b/components/optimization_guide/core/model_execution/on_device_model_execution_config_interpreter_unittest.cc
@@ -129,10 +129,11 @@
        ConstructInputStringNoOnDeviceConfig) {
   base::test::TestMessage test;
   test.set_test("some test");
-  auto maybe_string = interpreter()->ConstructInputString(
-      proto::MODEL_EXECUTION_FEATURE_COMPOSE, test);
+  auto result = interpreter()->ConstructInputString(
+      proto::MODEL_EXECUTION_FEATURE_COMPOSE, test,
+      /*want_input_context=*/false);
 
-  EXPECT_FALSE(maybe_string.has_value());
+  EXPECT_FALSE(result);
 }
 
 TEST_F(OnDeviceModelExecutionConfigInterpeterTest,
@@ -144,10 +145,11 @@
 
   base::test::TestMessage test;
   test.set_test("some test");
-  auto maybe_string = interpreter()->ConstructInputString(
-      proto::MODEL_EXECUTION_FEATURE_COMPOSE, test);
+  auto result = interpreter()->ConstructInputString(
+      proto::MODEL_EXECUTION_FEATURE_COMPOSE, test,
+      /*want_input_context=*/false);
 
-  EXPECT_FALSE(maybe_string.has_value());
+  EXPECT_FALSE(result);
 }
 
 TEST_F(OnDeviceModelExecutionConfigInterpeterTest,
@@ -159,10 +161,11 @@
 
   base::test::TestMessage test;
   test.set_test("some test");
-  auto maybe_string = interpreter()->ConstructInputString(
-      proto::MODEL_EXECUTION_FEATURE_COMPOSE, test);
+  auto result = interpreter()->ConstructInputString(
+      proto::MODEL_EXECUTION_FEATURE_COMPOSE, test,
+      /*want_input_context=*/false);
 
-  EXPECT_FALSE(maybe_string.has_value());
+  EXPECT_FALSE(result);
 }
 
 TEST_F(OnDeviceModelExecutionConfigInterpeterTest,
@@ -176,10 +179,11 @@
 
   base::test::TestMessage test;
   test.set_test("some test");
-  auto maybe_string = interpreter()->ConstructInputString(
-      proto::MODEL_EXECUTION_FEATURE_COMPOSE, test);
+  auto result = interpreter()->ConstructInputString(
+      proto::MODEL_EXECUTION_FEATURE_COMPOSE, test,
+      /*want_input_context=*/false);
 
-  EXPECT_FALSE(maybe_string.has_value());
+  EXPECT_FALSE(result);
 }
 
 TEST_F(OnDeviceModelExecutionConfigInterpeterTest,
@@ -198,10 +202,36 @@
 
   base::test::TestMessage test;
   test.set_test("some test");
-  auto maybe_string = interpreter()->ConstructInputString(
-      proto::MODEL_EXECUTION_FEATURE_COMPOSE, test);
+  auto result = interpreter()->ConstructInputString(
+      proto::MODEL_EXECUTION_FEATURE_COMPOSE, test,
+      /*want_input_context=*/false);
 
-  EXPECT_FALSE(maybe_string.has_value());
+  EXPECT_FALSE(result);
+}
+
+TEST_F(OnDeviceModelExecutionConfigInterpeterTest,
+       ConstructInputStringSimpleRawStringInputContext) {
+  proto::OnDeviceModelExecutionConfig config;
+  auto* fc = config.add_feature_configs();
+  fc->set_feature(proto::MODEL_EXECUTION_FEATURE_COMPOSE);
+  auto* input_config = fc->mutable_input_config();
+  input_config->set_request_base_name("base.test.TestMessage");
+  auto* substitution = input_config->add_input_context_substitutions();
+  substitution->set_string_template("hello this is a %s");
+  substitution->set_expected_num_args(1);
+  substitution->add_args()->set_raw_string("test");
+  auto* execute_substitution = input_config->add_execute_substitutions();
+  execute_substitution->set_string_template("this should be ignored");
+  UpdateInterpreterWithConfig(config);
+
+  base::test::TestMessage test;
+  test.set_test("some test");
+  auto result = interpreter()->ConstructInputString(
+      proto::MODEL_EXECUTION_FEATURE_COMPOSE, test,
+      /*want_input_context=*/true);
+
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(result->input_string, "hello this is a test");
 }
 
 TEST_F(OnDeviceModelExecutionConfigInterpeterTest,
@@ -219,11 +249,13 @@
 
   base::test::TestMessage test;
   test.set_test("some test");
-  auto maybe_string = interpreter()->ConstructInputString(
-      proto::MODEL_EXECUTION_FEATURE_COMPOSE, test);
+  auto result = interpreter()->ConstructInputString(
+      proto::MODEL_EXECUTION_FEATURE_COMPOSE, test,
+      /*want_input_context=*/false);
 
-  ASSERT_TRUE(maybe_string);
-  EXPECT_EQ(*maybe_string, "hello this is a test");
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(result->input_string, "hello this is a test");
+  EXPECT_FALSE(result->should_ignore_input_context);
 }
 
 TEST_F(OnDeviceModelExecutionConfigInterpeterTest,
@@ -234,9 +266,12 @@
   auto* input_config = fc->mutable_input_config();
   input_config->set_request_base_name(
       "optimization_guide.proto.ComposeRequest");
+  auto* input_substitutions = input_config->add_input_context_substitutions();
+  input_substitutions->set_string_template("this is ignored");
   auto* substitution = input_config->add_execute_substitutions();
   substitution->set_string_template("hello this is a test: %s %s %s");
   substitution->set_expected_num_args(3);
+  substitution->set_should_ignore_input_context(true);
   auto* proto_field = substitution->add_args()->mutable_proto_field();
   proto_field->add_proto_descriptors()->set_tag_number(2);
   auto* proto_field2 = substitution->add_args()->mutable_proto_field();
@@ -251,12 +286,14 @@
   request.set_user_input("this is my input");
   request.mutable_page_metadata()->set_page_title("nested");
   request.mutable_generate_params()->set_user_input("inner type");
-  auto maybe_string = interpreter()->ConstructInputString(
-      proto::MODEL_EXECUTION_FEATURE_COMPOSE, request);
+  auto result = interpreter()->ConstructInputString(
+      proto::MODEL_EXECUTION_FEATURE_COMPOSE, request,
+      /*want_input_context=*/false);
 
-  ASSERT_TRUE(maybe_string);
-  EXPECT_EQ(*maybe_string,
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(result->input_string,
             "hello this is a test: this is my input nested inner type");
+  EXPECT_TRUE(result->should_ignore_input_context);
 }
 
 TEST_F(OnDeviceModelExecutionConfigInterpeterTest,
@@ -277,10 +314,11 @@
   proto::ComposeRequest request;
   request.set_user_input("this is my input");
   request.mutable_page_metadata()->set_page_title("nested");
-  auto maybe_string = interpreter()->ConstructInputString(
-      proto::MODEL_EXECUTION_FEATURE_COMPOSE, request);
+  auto result = interpreter()->ConstructInputString(
+      proto::MODEL_EXECUTION_FEATURE_COMPOSE, request,
+      /*want_input_context=*/false);
 
-  EXPECT_FALSE(maybe_string.has_value());
+  EXPECT_FALSE(result);
 }
 
 TEST_F(OnDeviceModelExecutionConfigInterpeterTest,
@@ -350,11 +388,14 @@
   request.mutable_page_metadata()->set_page_title("title");
   request.mutable_page_metadata()->set_page_url("url");
   request.set_length(proto::COMPOSE_LONGER);
-  auto maybe_string = interpreter()->ConstructInputString(
-      proto::MODEL_EXECUTION_FEATURE_COMPOSE, request);
+  auto result = interpreter()->ConstructInputString(
+      proto::MODEL_EXECUTION_FEATURE_COMPOSE, request,
+      /*want_input_context=*/false);
 
-  ASSERT_TRUE(maybe_string);
-  EXPECT_EQ(*maybe_string, "hello this is a test: this is my input title");
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(result->input_string,
+            "hello this is a test: this is my input title");
+  EXPECT_FALSE(result->should_ignore_input_context);
 }
 
 }  // namespace
diff --git a/components/optimization_guide/proto/model_execution.proto b/components/optimization_guide/proto/model_execution.proto
index 0a3a2fb..ca22e49 100644
--- a/components/optimization_guide/proto/model_execution.proto
+++ b/components/optimization_guide/proto/model_execution.proto
@@ -59,12 +59,20 @@
   // for.
   optional string request_base_name = 1;
 
-  // TODO(b/302402959): Add support for context substitutions.
+  // An ordered list of substituted strings to apply for input context.
+  //
+  // These will be concatenated in the order they appear here if the conditions
+  // apply based on the input request.
+  repeated SubstitutedString input_context_substitutions = 3;
 
   // An ordered list of substituted strings to apply when the model is executed.
   //
   // These will be concatenated in the order they appear here if the conditions
   // apply based on the input request.
+  //
+  // It is expected that the resulting string here will be concatenated with the
+  // resulting string for the input context if `should_ignore_input_context` is
+  // not set on any of the used substitutions.
   repeated SubstitutedString execute_substitutions = 2;
 }
 
@@ -81,6 +89,10 @@
 
   // The conditions for which to apply this substituted string.
   optional ConditionList conditions = 4;
+
+  // Whether the input context should be ignored if this substituted string is
+  // applied.
+  optional bool should_ignore_input_context = 5;
 }
 
 message StringArg {
diff --git a/components/page_load_metrics/browser/fake_page_load_metrics_observer_delegate.cc b/components/page_load_metrics/browser/fake_page_load_metrics_observer_delegate.cc
index 4a20435..f8e1a34 100644
--- a/components/page_load_metrics/browser/fake_page_load_metrics_observer_delegate.cc
+++ b/components/page_load_metrics/browser/fake_page_load_metrics_observer_delegate.cc
@@ -145,15 +145,15 @@
   return normalized_cls_data_;
 }
 
-const NormalizedResponsivenessMetrics&
-FakePageLoadMetricsObserverDelegate::GetNormalizedResponsivenessMetrics()
+const ResponsivenessMetricsNormalization&
+FakePageLoadMetricsObserverDelegate::GetResponsivenessMetricsNormalization()
     const {
-  return normalized_responsiveness_metrics_;
+  return responsiveness_metrics_normalization_;
 }
 
-const NormalizedResponsivenessMetrics& FakePageLoadMetricsObserverDelegate::
-    GetSoftNavigationIntervalNormalizedResponsivenessMetrics() const {
-  return normalized_responsiveness_metrics_;
+const ResponsivenessMetricsNormalization& FakePageLoadMetricsObserverDelegate::
+    GetSoftNavigationIntervalResponsivenessMetricsNormalization() const {
+  return responsiveness_metrics_normalization_;
 }
 
 const mojom::InputTiming&
diff --git a/components/page_load_metrics/browser/fake_page_load_metrics_observer_delegate.h b/components/page_load_metrics/browser/fake_page_load_metrics_observer_delegate.h
index 4cbecb7..fa2caa6 100644
--- a/components/page_load_metrics/browser/fake_page_load_metrics_observer_delegate.h
+++ b/components/page_load_metrics/browser/fake_page_load_metrics_observer_delegate.h
@@ -62,10 +62,10 @@
       BfcacheStrategy bfcache_strategy) const override;
   const NormalizedCLSData& GetSoftNavigationIntervalNormalizedCLSData()
       const override;
-  const NormalizedResponsivenessMetrics& GetNormalizedResponsivenessMetrics()
-      const override;
-  const NormalizedResponsivenessMetrics&
-  GetSoftNavigationIntervalNormalizedResponsivenessMetrics() const override;
+  const ResponsivenessMetricsNormalization&
+  GetResponsivenessMetricsNormalization() const override;
+  const ResponsivenessMetricsNormalization&
+  GetSoftNavigationIntervalResponsivenessMetricsNormalization() const override;
   const mojom::InputTiming& GetPageInputTiming() const override;
   const absl::optional<blink::SubresourceLoadMetrics>&
   GetSubresourceLoadMetrics() const override;
@@ -103,7 +103,7 @@
   mojom::FrameMetadata subframe_metadata_;
   PageRenderData page_render_data_;
   NormalizedCLSData normalized_cls_data_;
-  NormalizedResponsivenessMetrics normalized_responsiveness_metrics_;
+  ResponsivenessMetricsNormalization responsiveness_metrics_normalization_;
   mojom::InputTiming page_input_timing_;
   absl::optional<blink::SubresourceLoadMetrics> subresource_load_metrics_;
   PageRenderData main_frame_render_data_;
diff --git a/components/page_load_metrics/browser/observers/back_forward_cache_page_load_metrics_observer.cc b/components/page_load_metrics/browser/observers/back_forward_cache_page_load_metrics_observer.cc
index 1905ab3..5b7669c 100644
--- a/components/page_load_metrics/browser/observers/back_forward_cache_page_load_metrics_observer.cc
+++ b/components/page_load_metrics/browser/observers/back_forward_cache_page_load_metrics_observer.cc
@@ -335,38 +335,37 @@
   if (!has_ever_entered_back_forward_cache_)
     return;
   // Normalized Responsiveness Metrics.
-  const page_load_metrics::NormalizedResponsivenessMetrics&
-      normalized_responsiveness_metrics =
-          GetDelegate().GetNormalizedResponsivenessMetrics();
+  const page_load_metrics::ResponsivenessMetricsNormalization&
+      responsiveness_metrics_normalization =
+          GetDelegate().GetResponsivenessMetricsNormalization();
 
-  if (!normalized_responsiveness_metrics.num_user_interactions)
+  if (!responsiveness_metrics_normalization.num_user_interactions()) {
     return;
+  }
 
-  auto& max_event_durations =
-      normalized_responsiveness_metrics.normalized_max_event_durations;
   // HistoryNavigation is a singular event, and we share the same instance as
   // long as we use the same source ID.
   ukm::builders::HistoryNavigation builder(
       GetLastUkmSourceIdForBackForwardCacheRestore());
   builder
       .SetWorstUserInteractionLatencyAfterBackForwardCacheRestore_MaxEventDuration2(
-          max_event_durations.worst_latency.InMilliseconds());
+          responsiveness_metrics_normalization.worst_latency()
+              .value()
+              .InMilliseconds());
   UmaHistogramCustomTimes(
       internal::
           kWorstUserInteractionLatency_MaxEventDuration_AfterBackForwardCacheRestore,
-      max_event_durations.worst_latency, base::Milliseconds(1),
-      base::Seconds(60), 50);
+      responsiveness_metrics_normalization.worst_latency().value(),
+      base::Milliseconds(1), base::Seconds(60), 50);
 
-  base::TimeDelta high_percentile2_max_event_duration = page_load_metrics::
-      ResponsivenessMetricsNormalization::ApproximateHighPercentile(
-          normalized_responsiveness_metrics.num_user_interactions,
-          max_event_durations.worst_ten_latencies);
+  base::TimeDelta high_percentile2_max_event_duration =
+      responsiveness_metrics_normalization.ApproximateHighPercentile().value();
   builder
       .SetUserInteractionLatencyAfterBackForwardCacheRestore_HighPercentile2_MaxEventDuration(
           high_percentile2_max_event_duration.InMilliseconds());
   builder.SetNumInteractionsAfterBackForwardCacheRestore(
       ukm::GetExponentialBucketMinForCounts1000(
-          normalized_responsiveness_metrics.num_user_interactions));
+          responsiveness_metrics_normalization.num_user_interactions()));
 
   UmaHistogramCustomTimes(
       internal::
@@ -375,7 +374,7 @@
       base::Seconds(60), 50);
   base::UmaHistogramCounts1000(
       internal::kNumInteractions_AfterBackForwardCacheRestore,
-      normalized_responsiveness_metrics.num_user_interactions);
+      responsiveness_metrics_normalization.num_user_interactions());
 
   builder.Record(ukm::UkmRecorder::Get());
 }
diff --git a/components/page_load_metrics/browser/observers/core/uma_page_load_metrics_observer.cc b/components/page_load_metrics/browser/observers/core/uma_page_load_metrics_observer.cc
index 1de0250..d43ed1e6 100644
--- a/components/page_load_metrics/browser/observers/core/uma_page_load_metrics_observer.cc
+++ b/components/page_load_metrics/browser/observers/core/uma_page_load_metrics_observer.cc
@@ -898,28 +898,24 @@
 }
 
 void UmaPageLoadMetricsObserver::RecordNormalizedResponsivenessMetrics() {
-  const page_load_metrics::NormalizedResponsivenessMetrics&
-      normalized_responsiveness_metrics =
-          GetDelegate().GetNormalizedResponsivenessMetrics();
-  if (!normalized_responsiveness_metrics.num_user_interactions)
+  const page_load_metrics::ResponsivenessMetricsNormalization&
+      responsiveness_metrics_normalization =
+          GetDelegate().GetResponsivenessMetricsNormalization();
+  if (!responsiveness_metrics_normalization.num_user_interactions()) {
     return;
-  auto& max_event_durations =
-      normalized_responsiveness_metrics.normalized_max_event_durations;
+  }
 
   UmaHistogramCustomTimes(
       internal::kHistogramWorstUserInteractionLatencyMaxEventDuration,
-      max_event_durations.worst_latency, base::Milliseconds(1),
-      base::Seconds(60), 50);
+      responsiveness_metrics_normalization.worst_latency().value(),
+      base::Milliseconds(1), base::Seconds(60), 50);
   UmaHistogramCustomTimes(
       internal::kHistogramUserInteractionLatencyHighPercentile2MaxEventDuration,
-      page_load_metrics::ResponsivenessMetricsNormalization::
-          ApproximateHighPercentile(
-              normalized_responsiveness_metrics.num_user_interactions,
-              max_event_durations.worst_ten_latencies),
+      responsiveness_metrics_normalization.ApproximateHighPercentile().value(),
       base::Milliseconds(1), base::Seconds(60), 50);
   base::UmaHistogramCounts1000(
       internal::kHistogramNumInteractions,
-      normalized_responsiveness_metrics.num_user_interactions);
+      responsiveness_metrics_normalization.num_user_interactions());
 }
 
 void UmaPageLoadMetricsObserver::RecordForegroundDurationHistograms(
diff --git a/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc b/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc
index 2eda78f8..8ad77dcb 100644
--- a/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc
+++ b/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc
@@ -399,25 +399,20 @@
 
   DCHECK(GetDelegate().WasPrerenderedThenActivatedInForeground());
 
-  const page_load_metrics::NormalizedResponsivenessMetrics&
-      normalized_responsiveness_metrics =
-          GetDelegate().GetNormalizedResponsivenessMetrics();
-  if (!normalized_responsiveness_metrics.num_user_interactions) {
+  const page_load_metrics::ResponsivenessMetricsNormalization&
+      responsiveness_metrics_normalization =
+          GetDelegate().GetResponsivenessMetricsNormalization();
+  if (!responsiveness_metrics_normalization.num_user_interactions()) {
     return;
   }
 
-  const page_load_metrics::NormalizedInteractionLatencies& max_event_durations =
-      normalized_responsiveness_metrics.normalized_max_event_durations;
-
-  base::TimeDelta high_percentile2_max_event_duration = page_load_metrics::
-      ResponsivenessMetricsNormalization::ApproximateHighPercentile(
-          normalized_responsiveness_metrics.num_user_interactions,
-          max_event_durations.worst_ten_latencies);
+  base::TimeDelta high_percentile2_max_event_duration =
+      responsiveness_metrics_normalization.ApproximateHighPercentile().value();
 
   UmaHistogramCustomTimes(
       internal::kHistogramPrerenderWorstUserInteractionLatencyMaxEventDuration,
-      max_event_durations.worst_latency, base::Milliseconds(1),
-      base::Seconds(60), 50);
+      responsiveness_metrics_normalization.worst_latency().value(),
+      base::Milliseconds(1), base::Seconds(60), 50);
   UmaHistogramCustomTimes(
       internal::
           kHistogramPrerenderUserInteractionLatencyHighPercentile2MaxEventDuration,
@@ -425,18 +420,20 @@
       base::Seconds(60), 50);
   base::UmaHistogramCounts1000(
       internal::kHistogramPrerenderNumInteractions,
-      normalized_responsiveness_metrics.num_user_interactions);
+      responsiveness_metrics_normalization.num_user_interactions());
 
   ukm::builders::PrerenderPageLoad builder(GetDelegate().GetPageUkmSourceId());
   builder.SetInteractiveTiming_WorstUserInteractionLatency_MaxEventDuration(
-      max_event_durations.worst_latency.InMilliseconds());
+      responsiveness_metrics_normalization.worst_latency()
+          .value()
+          .InMilliseconds());
 
   builder
       .SetInteractiveTiming_UserInteractionLatency_HighPercentile2_MaxEventDuration(
           high_percentile2_max_event_duration.InMilliseconds());
   builder.SetInteractiveTiming_NumInteractions(
       ukm::GetExponentialBucketMinForCounts1000(
-          normalized_responsiveness_metrics.num_user_interactions));
+          responsiveness_metrics_normalization.num_user_interactions()));
 
   builder.Record(ukm::UkmRecorder::Get());
 }
diff --git a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
index f4fdd49..d4bf918 100644
--- a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
+++ b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
@@ -358,6 +358,10 @@
               kStorageAccessAPI_requestStorageAccess_BeyondCookies_revokeObjectURL,
           WebFeature::
               kStorageAccessAPI_requestStorageAccess_BeyondCookies_revokeObjectURL_Use,
+          WebFeature::
+              kStorageAccessAPI_requestStorageAccess_BeyondCookies_BroadcastChannel,
+          WebFeature::
+              kStorageAccessAPI_requestStorageAccess_BeyondCookies_BroadcastChannel_Use,
       }));
   return *opt_in_features;
 }
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h b/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h
index f780c32..cd988e9 100644
--- a/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h
+++ b/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h
@@ -185,14 +185,13 @@
       BfcacheStrategy bfcache_strategy) const = 0;
   virtual const NormalizedCLSData& GetSoftNavigationIntervalNormalizedCLSData()
       const = 0;
-  // Returns normalized responsiveness metrics data. Currently we normalize
-  // user interaction latencies from all renderer frames in a few different
-  // ways.
-  virtual const NormalizedResponsivenessMetrics&
-  GetNormalizedResponsivenessMetrics() const = 0;
+  // Returns normalized responsiveness metrics data. Normalization explained in
+  // https://web.dev/inp.
+  virtual const ResponsivenessMetricsNormalization&
+  GetResponsivenessMetricsNormalization() const = 0;
 
-  virtual const NormalizedResponsivenessMetrics&
-  GetSoftNavigationIntervalNormalizedResponsivenessMetrics() const = 0;
+  virtual const ResponsivenessMetricsNormalization&
+  GetSoftNavigationIntervalResponsivenessMetricsNormalization() const = 0;
 
   // InputTiming data accumulated across all frames.
   virtual const mojom::InputTiming& GetPageInputTiming() const = 0;
diff --git a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
index 00ebda9..28a6d8c4 100644
--- a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
+++ b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
@@ -218,16 +218,14 @@
                ? layout_shift_normalization_for_bfcache_.normalized_cls_data()
                : layout_shift_normalization_.normalized_cls_data();
   }
-  const NormalizedResponsivenessMetrics& normalized_responsiveness_metrics()
-      const {
-    return responsiveness_metrics_normalization_
-        .GetNormalizedResponsivenessMetrics();
+  const ResponsivenessMetricsNormalization&
+  responsiveness_metrics_normalization() const {
+    return responsiveness_metrics_normalization_;
   }
 
-  const NormalizedResponsivenessMetrics&
-  soft_navigation_interval_normalized_responsiveness_metrics() const {
-    return soft_navigation_interval_responsiveness_metrics_normalization_
-        .GetNormalizedResponsivenessMetrics();
+  const ResponsivenessMetricsNormalization&
+  soft_navigation_interval_responsiveness_metrics_normalization() const {
+    return soft_navigation_interval_responsiveness_metrics_normalization_;
   }
 
   const NormalizedCLSData& soft_navigation_interval_normalized_layout_shift()
@@ -235,7 +233,7 @@
     return soft_nav_interval_layout_shift_normalization_.normalized_cls_data();
   }
 
-  void ResetSoftNavigationIntervalNormalizedResponsivenessMetrics() {
+  void ResetSoftNavigationIntervalResponsivenessMetricsNormalization() {
     soft_navigation_interval_responsiveness_metrics_normalization_
         .ClearAllUserInteractionLatencies();
   }
diff --git a/components/page_load_metrics/browser/page_load_tracker.cc b/components/page_load_metrics/browser/page_load_tracker.cc
index 22bb54b8..0fd8a95 100644
--- a/components/page_load_metrics/browser/page_load_tracker.cc
+++ b/components/page_load_metrics/browser/page_load_tracker.cc
@@ -1134,7 +1134,7 @@
   // when a new soft nav comes in.
   if (new_soft_navigation_metrics.count > soft_navigation_metrics_->count) {
     metrics_update_dispatcher_
-        .ResetSoftNavigationIntervalNormalizedResponsivenessMetrics();
+        .ResetSoftNavigationIntervalResponsivenessMetricsNormalization();
     metrics_update_dispatcher_.ResetSoftNavigationIntervalLayoutShift();
   }
 
@@ -1325,16 +1325,16 @@
       .soft_navigation_interval_normalized_layout_shift();
 }
 
-const NormalizedResponsivenessMetrics&
-PageLoadTracker::GetNormalizedResponsivenessMetrics() const {
-  return metrics_update_dispatcher_.normalized_responsiveness_metrics();
+const ResponsivenessMetricsNormalization&
+PageLoadTracker::GetResponsivenessMetricsNormalization() const {
+  return metrics_update_dispatcher_.responsiveness_metrics_normalization();
 }
 
-const NormalizedResponsivenessMetrics&
-PageLoadTracker::GetSoftNavigationIntervalNormalizedResponsivenessMetrics()
+const ResponsivenessMetricsNormalization&
+PageLoadTracker::GetSoftNavigationIntervalResponsivenessMetricsNormalization()
     const {
   return metrics_update_dispatcher_
-      .soft_navigation_interval_normalized_responsiveness_metrics();
+      .soft_navigation_interval_responsiveness_metrics_normalization();
 }
 
 const mojom::InputTiming& PageLoadTracker::GetPageInputTiming() const {
diff --git a/components/page_load_metrics/browser/page_load_tracker.h b/components/page_load_metrics/browser/page_load_tracker.h
index fad6912..08e0865 100644
--- a/components/page_load_metrics/browser/page_load_tracker.h
+++ b/components/page_load_metrics/browser/page_load_tracker.h
@@ -287,10 +287,10 @@
       BfcacheStrategy bfcache_strategy) const override;
   const NormalizedCLSData& GetSoftNavigationIntervalNormalizedCLSData()
       const override;
-  const NormalizedResponsivenessMetrics& GetNormalizedResponsivenessMetrics()
-      const override;
-  const NormalizedResponsivenessMetrics&
-  GetSoftNavigationIntervalNormalizedResponsivenessMetrics() const override;
+  const ResponsivenessMetricsNormalization&
+  GetResponsivenessMetricsNormalization() const override;
+  const ResponsivenessMetricsNormalization&
+  GetSoftNavigationIntervalResponsivenessMetricsNormalization() const override;
   const mojom::InputTiming& GetPageInputTiming() const override;
   const absl::optional<blink::SubresourceLoadMetrics>&
   GetSubresourceLoadMetrics() const override;
diff --git a/components/page_load_metrics/browser/responsiveness_metrics_normalization.cc b/components/page_load_metrics/browser/responsiveness_metrics_normalization.cc
index 8382156..37d729e 100644
--- a/components/page_load_metrics/browser/responsiveness_metrics_normalization.cc
+++ b/components/page_load_metrics/browser/responsiveness_metrics_normalization.cc
@@ -6,66 +6,64 @@
 
 namespace page_load_metrics {
 
-NormalizedInteractionLatencies::NormalizedInteractionLatencies() = default;
-NormalizedInteractionLatencies::~NormalizedInteractionLatencies() = default;
-
-NormalizedResponsivenessMetrics::NormalizedResponsivenessMetrics() = default;
-NormalizedResponsivenessMetrics::~NormalizedResponsivenessMetrics() = default;
-
 ResponsivenessMetricsNormalization::ResponsivenessMetricsNormalization() =
     default;
 ResponsivenessMetricsNormalization::~ResponsivenessMetricsNormalization() =
     default;
 
-// static
-base::TimeDelta ResponsivenessMetricsNormalization::ApproximateHighPercentile(
-    uint64_t num_interactions,
-    std::priority_queue<base::TimeDelta,
-                        std::vector<base::TimeDelta>,
-                        std::greater<>> worst_ten_latencies) {
-  DCHECK(num_interactions);
-  int index = std::max(0, static_cast<int>(worst_ten_latencies.size()) - 1 -
-                              static_cast<int>(num_interactions /
-                                               kHighPercentileUpdateFrequency));
-  for (; index > 0; index--) {
-    worst_ten_latencies.pop();
+absl::optional<base::TimeDelta>
+ResponsivenessMetricsNormalization::ApproximateHighPercentile() const {
+  absl::optional<base::TimeDelta> approximate_high_percentile;
+  if (worst_ten_latencies_.size()) {
+    int index = static_cast<int>(num_user_interactions_ /
+                                 kHighPercentileUpdateFrequency);
+    approximate_high_percentile = worst_ten_latencies_[index];
   }
+  return approximate_high_percentile;
+}
 
-  return worst_ten_latencies.top();
+absl::optional<base::TimeDelta>
+ResponsivenessMetricsNormalization::worst_latency() const {
+  absl::optional<base::TimeDelta> worst_latency;
+  if (worst_ten_latencies_.size()) {
+    worst_latency = worst_ten_latencies_[0];
+  }
+  return worst_latency;
 }
 
 void ResponsivenessMetricsNormalization::AddNewUserInteractionLatencies(
     uint64_t num_new_interactions,
     const mojom::UserInteractionLatencies& max_event_durations) {
-  uint64_t last_num_user_interactions =
-      normalized_responsiveness_metrics_.num_user_interactions;
-  normalized_responsiveness_metrics_.num_user_interactions +=
-      num_new_interactions;
-  DCHECK(max_event_durations.is_user_interaction_latencies() ||
-         max_event_durations.is_worst_interaction_latency());
+  num_user_interactions_ += num_new_interactions;
   // Normalize max event durations.
-  NormalizeUserInteractionLatencies(
-      max_event_durations,
-      normalized_responsiveness_metrics_.normalized_max_event_durations,
-      last_num_user_interactions,
-      normalized_responsiveness_metrics_.num_user_interactions);
+  NormalizeUserInteractionLatencies(max_event_durations);
+}
+
+void ResponsivenessMetricsNormalization::ClearAllUserInteractionLatencies() {
+  num_user_interactions_ = 0;
+  worst_ten_latencies_ = std::vector<base::TimeDelta>();
 }
 
 void ResponsivenessMetricsNormalization::NormalizeUserInteractionLatencies(
-    const mojom::UserInteractionLatencies& user_interaction_latencies,
-    NormalizedInteractionLatencies& normalized_event_durations,
-    uint64_t last_num_user_interactions,
-    uint64_t current_num_user_interactions) {
+    const mojom::UserInteractionLatencies& user_interaction_latencies) {
   DCHECK(user_interaction_latencies.is_user_interaction_latencies());
+
+  // Insert each latency into the list if it is one of the worst ten seen so
+  // far. Use inplace_merge to keep the list sorted after appending an element.
   for (const mojom::UserInteractionLatencyPtr& user_interaction :
        user_interaction_latencies.get_user_interaction_latencies()) {
-    normalized_event_durations.worst_latency =
-        std::max(normalized_event_durations.worst_latency,
-                 user_interaction->interaction_latency);
-    normalized_event_durations.worst_ten_latencies.push(
-        user_interaction->interaction_latency);
-    if (normalized_event_durations.worst_ten_latencies.size() == 11) {
-      normalized_event_durations.worst_ten_latencies.pop();
+    if (worst_ten_latencies_.size() < 10) {
+      worst_ten_latencies_.push_back(user_interaction->interaction_latency);
+    } else if (user_interaction->interaction_latency >
+               worst_ten_latencies_.back()) {
+      worst_ten_latencies_.back() = user_interaction->interaction_latency;
+    } else {
+      continue;
+    }
+    if (worst_ten_latencies_.size() > 1) {
+      std::inplace_merge(worst_ten_latencies_.begin(),
+                         std::prev(worst_ten_latencies_.end()),
+                         worst_ten_latencies_.end(), std::greater<>());
     }
   }
 }
diff --git a/components/page_load_metrics/browser/responsiveness_metrics_normalization.h b/components/page_load_metrics/browser/responsiveness_metrics_normalization.h
index b36f2b3..a739936 100644
--- a/components/page_load_metrics/browser/responsiveness_metrics_normalization.h
+++ b/components/page_load_metrics/browser/responsiveness_metrics_normalization.h
@@ -14,31 +14,6 @@
 namespace page_load_metrics {
 
 constexpr uint64_t kHighPercentileUpdateFrequency = 50;
-// The struct that stores normalized user interactions latencies.
-struct NormalizedInteractionLatencies {
-  NormalizedInteractionLatencies();
-  ~NormalizedInteractionLatencies();
-
-  // The maximum value of user interaction latencies.
-  base::TimeDelta worst_latency;
-
-  // A min priority queue. The top is the smallest base::TimeDelta in the queue.
-  // We use the worst 10 latencies to approximate a high percentile.
-  std::priority_queue<base::TimeDelta,
-                      std::vector<base::TimeDelta>,
-                      std::greater<>>
-      worst_ten_latencies;
-};
-
-// The struct that stores all normalization results for a page load.
-struct NormalizedResponsivenessMetrics {
-  NormalizedResponsivenessMetrics();
-  ~NormalizedResponsivenessMetrics();
-  uint64_t num_user_interactions = 0;
-  // Max event duration
-  NormalizedInteractionLatencies normalized_max_event_durations;
-};
-
 // ResponsivenessMetricsNormalization implements some experimental normalization
 // strategies for responsiveness metrics. We aggregate user interaction latency
 // data from all renderer frames and calculate a score per page load.
@@ -56,28 +31,23 @@
       uint64_t num_new_interactions,
       const mojom::UserInteractionLatencies& max_event_durations);
 
-  const NormalizedResponsivenessMetrics& GetNormalizedResponsivenessMetrics()
-      const {
-    return normalized_responsiveness_metrics_;
-  }
-  void ClearAllUserInteractionLatencies() {
-    normalized_responsiveness_metrics_ = NormalizedResponsivenessMetrics();
-  }
+  void ClearAllUserInteractionLatencies();
 
   // Approximate a high percentile of user interaction latency.
-  static base::TimeDelta ApproximateHighPercentile(
-      uint64_t num_interactions,
-      std::priority_queue<base::TimeDelta,
-                          std::vector<base::TimeDelta>,
-                          std::greater<>> worst_ten_latencies);
+  absl::optional<base::TimeDelta> ApproximateHighPercentile() const;
+
+  uint64_t num_user_interactions() const { return num_user_interactions_; }
+
+  absl::optional<base::TimeDelta> worst_latency() const;
 
  private:
   void NormalizeUserInteractionLatencies(
-      const mojom::UserInteractionLatencies& user_interaction_latencies,
-      NormalizedInteractionLatencies& normalized_event_durations,
-      uint64_t last_num_user_interactions,
-      uint64_t current_num_user_interactions);
-  NormalizedResponsivenessMetrics normalized_responsiveness_metrics_;
+      const mojom::UserInteractionLatencies& user_interaction_latencies);
+
+  // A sorted list of the worst ten latencies, used to approximate a high
+  // percentile.
+  std::vector<base::TimeDelta> worst_ten_latencies_;
+  uint64_t num_user_interactions_ = 0;
 };
 
 }  // namespace page_load_metrics
diff --git a/components/page_load_metrics/browser/responsiveness_metrics_normalization_unittest.cc b/components/page_load_metrics/browser/responsiveness_metrics_normalization_unittest.cc
index 5263aa3..c71c422 100644
--- a/components/page_load_metrics/browser/responsiveness_metrics_normalization_unittest.cc
+++ b/components/page_load_metrics/browser/responsiveness_metrics_normalization_unittest.cc
@@ -24,10 +24,17 @@
         num_new_interactions, max_event_durations);
   }
 
-  const page_load_metrics::NormalizedResponsivenessMetrics&
-  normalized_responsiveness_metrics() const {
-    return responsiveness_metrics_normalization_
-        .GetNormalizedResponsivenessMetrics();
+  uint64_t GetNumInteractions() {
+    return responsiveness_metrics_normalization_.num_user_interactions();
+  }
+
+  base::TimeDelta GetWorstInteraction() {
+    return responsiveness_metrics_normalization_.worst_latency().value();
+  }
+
+  base::TimeDelta GetHighPercentileInteraction() {
+    return responsiveness_metrics_normalization_.ApproximateHighPercentile()
+        .value();
   }
 
  private:
@@ -36,30 +43,44 @@
 };
 
 TEST_F(ResponsivenessMetricsNormalizationTest, SendAllInteractions) {
-  UserInteractionLatenciesPtr max_event_durations =
+  // Check that we get the correct count, worst, and high percentile
+  // with 3 interactions.
+  UserInteractionLatenciesPtr user_interaction_latencies_ptr =
       UserInteractionLatencies::NewUserInteractionLatencies({});
-  auto& user_interaction_latencies1 =
-      max_event_durations->get_user_interaction_latencies();
-  user_interaction_latencies1.emplace_back(UserInteractionLatency::New(
-      base::Milliseconds(50), UserInteractionType::kKeyboard));
-  user_interaction_latencies1.emplace_back(UserInteractionLatency::New(
-      base::Milliseconds(100), UserInteractionType::kTapOrClick));
-  user_interaction_latencies1.emplace_back(UserInteractionLatency::New(
-      base::Milliseconds(150), UserInteractionType::kDrag));
+  auto& user_interaction_latencies =
+      user_interaction_latencies_ptr->get_user_interaction_latencies();
+  user_interaction_latencies.emplace_back(UserInteractionLatency::New(
+      base::Milliseconds(3000), UserInteractionType::kTapOrClick));
+  user_interaction_latencies.emplace_back(UserInteractionLatency::New(
+      base::Milliseconds(3500), UserInteractionType::kTapOrClick));
+  user_interaction_latencies.emplace_back(UserInteractionLatency::New(
+      base::Milliseconds(2000), UserInteractionType::kTapOrClick));
+  AddNewUserInteractions(3, *user_interaction_latencies_ptr);
+  EXPECT_EQ(GetNumInteractions(), 3u);
+  EXPECT_EQ(GetWorstInteraction(), base::Milliseconds(3500));
+  EXPECT_EQ(GetHighPercentileInteraction(), base::Milliseconds(3500));
 
-  AddNewUserInteractions(3, *max_event_durations);
-  auto worst_ten_max_event_durations =
-      normalized_responsiveness_metrics()
-          .normalized_max_event_durations.worst_ten_latencies;
-  EXPECT_EQ(worst_ten_max_event_durations.size(), 3u);
-  EXPECT_EQ(worst_ten_max_event_durations.top(), base::Milliseconds(50));
-  worst_ten_max_event_durations.pop();
-  EXPECT_EQ(worst_ten_max_event_durations.top(), base::Milliseconds(100));
-  worst_ten_max_event_durations.pop();
-  EXPECT_EQ(worst_ten_max_event_durations.top(), base::Milliseconds(150));
+  // After adding 50 additional interactions, the high percentile should shift
+  // to the second highest interaction duration.
+  user_interaction_latencies.clear();
+  for (uint64_t i = 0; i < 50; i++) {
+    user_interaction_latencies.emplace_back(UserInteractionLatency::New(
+        base::Milliseconds(i + 100), UserInteractionType::kTapOrClick));
+  }
+  AddNewUserInteractions(50, *user_interaction_latencies_ptr);
+  EXPECT_EQ(GetNumInteractions(), 53u);
+  EXPECT_EQ(GetWorstInteraction(), base::Milliseconds(3500));
+  EXPECT_EQ(GetHighPercentileInteraction(), base::Milliseconds(3000));
 
-  auto& normalized_max_event_durations =
-      normalized_responsiveness_metrics().normalized_max_event_durations;
-  EXPECT_EQ(normalized_max_event_durations.worst_latency,
-            base::Milliseconds(150));
+  // After adding 50 more interactions, the high percentile should shift
+  // to the third highest interaction duration.
+  user_interaction_latencies.clear();
+  for (uint64_t i = 0; i < 50; i++) {
+    user_interaction_latencies.emplace_back(UserInteractionLatency::New(
+        base::Milliseconds(300 - i), UserInteractionType::kTapOrClick));
+  }
+  AddNewUserInteractions(50, *user_interaction_latencies_ptr);
+  EXPECT_EQ(GetNumInteractions(), 103u);
+  EXPECT_EQ(GetWorstInteraction(), base::Milliseconds(3500));
+  EXPECT_EQ(GetHighPercentileInteraction(), base::Milliseconds(2000));
 }
\ No newline at end of file
diff --git a/components/password_manager/core/browser/password_autofill_manager.cc b/components/password_manager/core/browser/password_autofill_manager.cc
index 4d421ad..c8e2481 100644
--- a/components/password_manager/core/browser/password_autofill_manager.cc
+++ b/components/password_manager/core/browser/password_autofill_manager.cc
@@ -477,8 +477,7 @@
           ->SelectPasskey(
               absl::holds_alternative<autofill::Suggestion::BackendId>(
                   suggestion.payload)
-                  ? absl::get<autofill::Suggestion::BackendId>(
-                        suggestion.payload)
+                  ? suggestion.GetBackendId<autofill::Suggestion::Guid>()
                         .value()
                   : std::string());
       break;
@@ -736,7 +735,7 @@
           suggestion.icon = autofill::Suggestion::Icon::kGlobe;
           suggestion.popup_item_id = autofill::PopupItemId::kWebauthnCredential;
           suggestion.custom_icon = page_favicon_;
-          suggestion.payload = autofill::Suggestion::BackendId(
+          suggestion.payload = autofill::Suggestion::Guid(
               base::Base64Encode(passkey.credential_id()));
           suggestion.labels = {
               {autofill::Suggestion::Text(passkey.GetAuthenticatorLabel())}};
diff --git a/components/password_manager/core/browser/password_autofill_manager_unittest.cc b/components/password_manager/core/browser/password_autofill_manager_unittest.cc
index 00044f3..fc1ae86c 100644
--- a/components/password_manager/core/browser/password_autofill_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_autofill_manager_unittest.cc
@@ -2045,8 +2045,8 @@
                   autofill::PopupItemId::kSeparator,
 #endif  // !BUILDFLAG(IS_ANDROID)
                   autofill::PopupItemId::kAllSavedPasswordsEntry));
-  EXPECT_EQ(open_args.suggestions[0].GetPayload<Suggestion::BackendId>(),
-            Suggestion::BackendId(kIdBase64));
+  EXPECT_EQ(open_args.suggestions[0].GetBackendId<Suggestion::Guid>().value(),
+            kIdBase64);
   EXPECT_EQ(open_args.suggestions[0].popup_item_id,
             autofill::PopupItemId::kWebauthnCredential);
   EXPECT_EQ(open_args.suggestions[0].main_text.value, kName);
@@ -2063,7 +2063,7 @@
               PreviewSuggestion(kName, /*password=*/std::u16string(u"")));
   const Suggestion suggestion = autofill::test::CreateAutofillSuggestion(
       autofill::PopupItemId::kWebauthnCredential, kName,
-      autofill::Suggestion::BackendId(kIdBase64));
+      autofill::Suggestion::Guid(kIdBase64));
   password_autofill_manager_->DidSelectSuggestion(suggestion);
   testing::Mock::VerifyAndClearExpectations(client.mock_driver());
 
diff --git a/components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java b/components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java
index b4f7a2b..73570cf 100644
--- a/components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java
+++ b/components/prefs/android/java/src/org/chromium/components/prefs/PrefService.java
@@ -84,6 +84,22 @@
      * @param preference The name of the preference.
      * @return value The value of the specified preference.
      */
+    public double getDouble(@NonNull String preference) {
+        return PrefServiceJni.get().getDouble(mNativePrefServiceAndroid, preference);
+    }
+
+    /**
+     * @param preference The name of the preference.
+     * @param value The value the specified preference will be set to.
+     */
+    public void setDouble(@NonNull String preference, double value) {
+        PrefServiceJni.get().setDouble(mNativePrefServiceAndroid, preference, value);
+    }
+
+    /**
+     * @param preference The name of the preference.
+     * @return value The value of the specified preference.
+     */
     @NonNull
     public String getString(@NonNull String preference) {
         return PrefServiceJni.get().getString(mNativePrefServiceAndroid, preference);
@@ -122,6 +138,11 @@
         void setBoolean(long nativePrefServiceAndroid, String preference, boolean value);
         int getInteger(long nativePrefServiceAndroid, String preference);
         void setInteger(long nativePrefServiceAndroid, String preference, int value);
+
+        double getDouble(long nativePrefServiceAndroid, String preference);
+
+        void setDouble(long nativePrefServiceAndroid, String preference, double value);
+
         String getString(long nativePrefServiceAndroid, String preference);
         void setString(long nativePrefServiceAndroid, String preference, String value);
         boolean isManagedPreference(long nativePrefServiceAndroid, String preference);
diff --git a/components/prefs/android/java/src/org/chromium/components/prefs/PrefServiceTest.java b/components/prefs/android/java/src/org/chromium/components/prefs/PrefServiceTest.java
index 899b4bcd..68496bb7 100644
--- a/components/prefs/android/java/src/org/chromium/components/prefs/PrefServiceTest.java
+++ b/components/prefs/android/java/src/org/chromium/components/prefs/PrefServiceTest.java
@@ -78,6 +78,24 @@
     }
 
     @Test
+    public void testGetDouble() {
+        double expected = 1.23;
+
+        doReturn(expected).when(mNativeMock).getDouble(NATIVE_HANDLE, PREF);
+
+        assertEquals(expected, mPrefService.getDouble(PREF), 0.01f);
+    }
+
+    @Test
+    public void testSetDouble() {
+        double value = 12.34;
+
+        mPrefService.setDouble(PREF, value);
+
+        verify(mNativeMock).setDouble(eq(NATIVE_HANDLE), eq(PREF), eq(value));
+    }
+
+    @Test
     public void testGetString() {
         String expected = "foo";
 
diff --git a/components/prefs/android/pref_service_android.cc b/components/prefs/android/pref_service_android.cc
index b881058..d9772e0 100644
--- a/components/prefs/android/pref_service_android.cc
+++ b/components/prefs/android/pref_service_android.cc
@@ -88,6 +88,20 @@
       base::android::ConvertJavaStringToUTF8(env, j_preference), j_value);
 }
 
+jdouble PrefServiceAndroid::GetDouble(
+    JNIEnv* env,
+    const JavaParamRef<jstring>& j_preference) {
+  return pref_service_->GetDouble(
+      base::android::ConvertJavaStringToUTF8(env, j_preference));
+}
+
+void PrefServiceAndroid::SetDouble(JNIEnv* env,
+                                   const JavaParamRef<jstring>& j_preference,
+                                   const jdouble j_value) {
+  pref_service_->SetDouble(
+      base::android::ConvertJavaStringToUTF8(env, j_preference), j_value);
+}
+
 ScopedJavaLocalRef<jstring> PrefServiceAndroid::GetString(
     JNIEnv* env,
     const JavaParamRef<jstring>& j_preference) {
diff --git a/components/prefs/android/pref_service_android.h b/components/prefs/android/pref_service_android.h
index feac236c..73cf688 100644
--- a/components/prefs/android/pref_service_android.h
+++ b/components/prefs/android/pref_service_android.h
@@ -44,6 +44,11 @@
   void SetInteger(JNIEnv* env,
                   const base::android::JavaParamRef<jstring>& j_preference,
                   const jint j_value);
+  jdouble GetDouble(JNIEnv* env,
+                    const base::android::JavaParamRef<jstring>& j_preference);
+  void SetDouble(JNIEnv* env,
+                 const base::android::JavaParamRef<jstring>& j_preference,
+                 const jdouble j_value);
   base::android::ScopedJavaLocalRef<jstring> GetString(
       JNIEnv* env,
       const base::android::JavaParamRef<jstring>& j_preference);
diff --git a/components/services/screen_ai/screen_ai_library_wrapper.cc b/components/services/screen_ai/screen_ai_library_wrapper.cc
index 202a629b..7220198d 100644
--- a/components/services/screen_ai/screen_ai_library_wrapper.cc
+++ b/components/services/screen_ai/screen_ai_library_wrapper.cc
@@ -99,12 +99,10 @@
     }
   }
 
-#if !BUILDFLAG(IS_WIN)
   if (!LoadFunction(init_ocr_, "InitOCRUsingCallback") ||
       !LoadFunction(perform_ocr_, "PerformOCR")) {
     return false;
   }
-#endif
 
   // Main Content Extraction functions.
   if (!LoadFunction(init_main_content_extraction_,
diff --git a/components/signin/internal/identity_manager/primary_account_manager.cc b/components/signin/internal/identity_manager/primary_account_manager.cc
index bc448cf..47a9ba9 100644
--- a/components/signin/internal/identity_manager/primary_account_manager.cc
+++ b/components/signin/internal/identity_manager/primary_account_manager.cc
@@ -157,6 +157,11 @@
   bool commit_on_destroy_ = false;
 };
 
+PrimaryAccountManager::PrimaryAccount::PrimaryAccount(
+    const CoreAccountInfo& account_info,
+    bool consented_to_sync)
+    : account_info(account_info), consented_to_sync(consented_to_sync) {}
+
 PrimaryAccountManager::PrimaryAccountManager(
     SigninClient* client,
     ProfileOAuth2TokenService* token_service,
@@ -196,7 +201,7 @@
 
 void PrimaryAccountManager::PrepareToLoadPrefs() {
   // Check this method is only called before loading the primary account.
-  CHECK(!IsInitialized());
+  CHECK(!primary_account_.has_value());
 
   PrefService* prefs = client_->GetPrefs();
 
@@ -243,7 +248,7 @@
     const std::string& pref_account_id,
     bool pref_consented_to_sync) {
   // Check this method is only called before loading the primary account.
-  CHECK(!IsInitialized());
+  CHECK(!primary_account_.has_value());
 
   // This method must only be called when the primary account pref is non-empty.
   CHECK(!pref_account_id.empty());
@@ -307,7 +312,7 @@
 
 void PrimaryAccountManager::Initialize() {
   // Should never call Initialize() twice.
-  CHECK(!IsInitialized());
+  CHECK(!primary_account_.has_value());
 
   // Prepare prefs before loading them.
   PrepareToLoadPrefs();
@@ -349,7 +354,7 @@
 
   // PrimaryAccountManager is initialized once the primary account and consent
   // level are loaded.
-  initialized_ = true;
+  CHECK(primary_account_.has_value());
 
   // Instrument metrics to know what fraction of users without a primary
   // account previously did have one, with sync enabled.
@@ -363,15 +368,29 @@
       HasPrimaryAccount(signin::ConsentLevel::kSync));
 }
 
-bool PrimaryAccountManager::IsInitialized() const {
-  return initialized_;
+const PrimaryAccountManager::PrimaryAccount&
+PrimaryAccountManager::GetPrimaryAccount() const {
+  CHECK(primary_account_.has_value());
+  return primary_account_.value();
+}
+
+bool PrimaryAccountManager::HasPrimaryAccount(
+    signin::ConsentLevel consent_level) const {
+  const auto& primary_account = GetPrimaryAccount();
+  switch (consent_level) {
+    case signin::ConsentLevel::kSignin:
+      return !primary_account.account_info.account_id.empty();
+    case signin::ConsentLevel::kSync:
+      return !primary_account.account_info.account_id.empty() &&
+             primary_account.consented_to_sync;
+  }
 }
 
 CoreAccountInfo PrimaryAccountManager::GetPrimaryAccountInfo(
     signin::ConsentLevel consent_level) const {
   if (!HasPrimaryAccount(consent_level))
     return CoreAccountInfo();
-  return primary_account_info();
+  return GetPrimaryAccount().account_info;
 }
 
 CoreAccountId PrimaryAccountManager::GetPrimaryAccountId(
@@ -402,7 +421,7 @@
       FirePrimaryAccountChanged(previous_state, access_point);
       return;
     case signin::ConsentLevel::kSignin:
-      bool account_changed = account_info != primary_account_info();
+      bool account_changed = account_info != GetPrimaryAccount().account_info;
       ScopedPrefCommit scoped_pref_commit(client_->GetPrefs(),
                                           /*commit_on_destroy*/ false);
       SetPrimaryAccountInternal(account_info, /*consented_to_sync=*/false,
@@ -452,20 +471,16 @@
     const CoreAccountInfo& account_info,
     bool consented_to_sync,
     ScopedPrefCommit& scoped_pref_commit) {
-  primary_account_info_ = account_info;
+  CHECK(!account_info.account_id.empty() || !consented_to_sync);
 
-  const std::string& account_id = primary_account_info_.account_id.ToString();
-  if (account_id.empty()) {
-    DCHECK(!consented_to_sync);
-    consented_to_sync_ = false;
-    scoped_pref_commit.SetString(prefs::kGoogleServicesAccountId, "");
-    scoped_pref_commit.SetBoolean(prefs::kGoogleServicesConsentedToSync, false);
-  } else {
-    consented_to_sync_ = consented_to_sync;
-    scoped_pref_commit.SetString(prefs::kGoogleServicesAccountId, account_id);
-    scoped_pref_commit.SetBoolean(prefs::kGoogleServicesConsentedToSync,
-                                  consented_to_sync_);
-  }
+  // 'account_info' might be a reference to the contents of `primary_account_`.
+  // Create a PrimaryAccount object before calling emplace to avoid crashes.
+  primary_account_.emplace(PrimaryAccount(account_info, consented_to_sync));
+  scoped_pref_commit.SetString(
+      prefs::kGoogleServicesAccountId,
+      GetPrimaryAccount().account_info.account_id.ToString());
+  scoped_pref_commit.SetBoolean(prefs::kGoogleServicesConsentedToSync,
+                                GetPrimaryAccount().consented_to_sync);
 }
 
 void PrimaryAccountManager::RecordHadPreviousSyncAccount() const {
@@ -491,30 +506,19 @@
   }
 }
 
-bool PrimaryAccountManager::HasPrimaryAccount(
-    signin::ConsentLevel consent_level) const {
-  // Shound not be called before the consent level is loaded in memory.
-  CHECK(IsInitialized());
-
-  switch (consent_level) {
-    case signin::ConsentLevel::kSignin:
-      return !primary_account_info_.account_id.empty();
-    case signin::ConsentLevel::kSync:
-      return !primary_account_info_.account_id.empty() && consented_to_sync_;
-  }
-}
-
 void PrimaryAccountManager::UpdatePrimaryAccountInfo() {
-  const CoreAccountId primary_account_id = primary_account_info().account_id;
-  DCHECK(!primary_account_id.empty());
+  CoreAccountId primary_account_id =
+      GetPrimaryAccount().account_info.account_id;
+  bool consented_to_sync = GetPrimaryAccount().consented_to_sync;
+  CHECK(!primary_account_id.empty());
 
   const CoreAccountInfo updated_account_info =
       account_tracker_service_->GetAccountInfo(primary_account_id);
-
   CHECK_EQ(primary_account_id, updated_account_info.account_id);
+
   // Calling SetPrimaryAccountInternal() is avoided in this case as the
   // primary account id did not change.
-  primary_account_info_ = updated_account_info;
+  primary_account_.emplace(updated_account_info, consented_to_sync);
 }
 
 void PrimaryAccountManager::AddObserver(Observer* observer) {
@@ -561,8 +565,6 @@
     signin_metrics::SignoutDelete signout_delete_metric,
     RemoveAccountsOption remove_option,
     SigninClient::SignoutDecision signout_decision) {
-  DCHECK(IsInitialized());
-
   VLOG(1) << "OnSignoutDecisionReached: "
           << (signout_decision == SigninClient::SignoutDecision::ALLOW);
 
@@ -571,7 +573,7 @@
   // there is no need to check |remove_option| as regardless of its value, this
   // function will be no-op.
   bool abort_signout =
-      primary_account_info().IsEmpty() ||
+      GetPrimaryAccount().account_info.IsEmpty() ||
       signout_decision ==
           SigninClient::SignoutDecision::REVOKE_SYNC_DISALLOWED ||
       (remove_option == RemoveAccountsOption::kRemoveAllAccounts &&
@@ -612,7 +614,7 @@
         // OnPrimaryAccountChanged() notifications.
         return;
       }
-      SetPrimaryAccountInternal(primary_account_info(),
+      SetPrimaryAccountInternal(GetPrimaryAccount().account_info,
                                 /*consented_to_sync=*/false,
                                 scoped_pref_commit);
       break;
@@ -624,7 +626,7 @@
 
 PrimaryAccountChangeEvent::State PrimaryAccountManager::GetPrimaryAccountState()
     const {
-  PrimaryAccountChangeEvent::State state(primary_account_info(),
+  PrimaryAccountChangeEvent::State state(GetPrimaryAccount().account_info,
                                          signin::ConsentLevel::kSignin);
   if (HasPrimaryAccount(signin::ConsentLevel::kSync))
     state.consent_level = signin::ConsentLevel::kSync;
diff --git a/components/signin/internal/identity_manager/primary_account_manager.h b/components/signin/internal/identity_manager/primary_account_manager.h
index 41e5f70..754969f 100644
--- a/components/signin/internal/identity_manager/primary_account_manager.h
+++ b/components/signin/internal/identity_manager/primary_account_manager.h
@@ -31,7 +31,7 @@
 #include "components/signin/public/base/signin_client.h"
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/identity_manager/primary_account_change_event.h"
-#include "third_party/abseil-cpp/absl/types/variant.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 class AccountTrackerService;
 class PrefRegistrySimple;
@@ -87,9 +87,9 @@
   // Registers per-install prefs.
   static void RegisterPrefs(PrefRegistrySimple* registry);
 
-  // If user was signed in, load tokens from DB if available.
+  // If user was signed in, load the primary account and then load credentials
+  // in the token service.
   void Initialize();
-  bool IsInitialized() const;
 
   // Returns whether the user's primary account is available. If consent is
   // |ConsentLevel::kSync| then true implies that the user has blessed this
@@ -145,6 +145,14 @@
  private:
   class ScopedPrefCommit;
 
+  // The primary account information. The account may or may not be consented
+  // for Sync.
+  struct PrimaryAccount {
+    const CoreAccountInfo account_info;
+    const bool consented_to_sync;
+    PrimaryAccount(const CoreAccountInfo& account_info, bool consented_to_sync);
+  };
+
   // Prepares the primary account and consented preferences before loading them.
   void PrepareToLoadPrefs();
 
@@ -197,27 +205,27 @@
   // ProfileOAuth2TokenServiceObserver:
   void OnRefreshTokensLoaded() override;
 
-  const CoreAccountInfo& primary_account_info() const {
-    return primary_account_info_;
-  }
+  // Returns the primary account. Crashes if it is called before the primary
+  // account was initialized.
+  const PrimaryAccount& GetPrimaryAccount() const;
 
+  // The SigninClient instance associated with this object. Must outlive this
+  // object.
   raw_ptr<SigninClient> client_;
 
   // The ProfileOAuth2TokenService instance associated with this object. Must
   // outlive this object.
   raw_ptr<ProfileOAuth2TokenService> token_service_ = nullptr;
-  raw_ptr<AccountTrackerService> account_tracker_service_ = nullptr;
 
-  bool initialized_ = false;
+  // The AccountTrackerService instance associated with this object. Must
+  // outlive this object.
+  raw_ptr<AccountTrackerService> account_tracker_service_ = nullptr;
 
   // The primary account information. The account may or may not be consented
   // for Sync.
   // Must be kept in sync with prefs. Use SetPrimaryAccountInternal() to change
   // this field.
-  CoreAccountInfo primary_account_info_;
-
-  // Whether the primary account is consented to sync.
-  bool consented_to_sync_;
+  absl::optional<PrimaryAccount> primary_account_;
 
   base::ObserverList<Observer> observers_;
 };
diff --git a/components/soda/BUILD.gn b/components/soda/BUILD.gn
index 76b8b583..c445d5d1 100644
--- a/components/soda/BUILD.gn
+++ b/components/soda/BUILD.gn
@@ -57,7 +57,7 @@
 
   deps = [
     "//base",
-    "//components/component_updater",
+    "//components/component_updater:component_updater_paths",
     "//components/crx_file",
     "//components/strings/",
     "//ui/base",
diff --git a/components/supervised_user/core/browser/child_account_service_unittest.cc b/components/supervised_user/core/browser/child_account_service_unittest.cc
index 7f4e0ce..0d801c5 100644
--- a/components/supervised_user/core/browser/child_account_service_unittest.cc
+++ b/components/supervised_user/core/browser/child_account_service_unittest.cc
@@ -75,7 +75,7 @@
     supervised_user_service_ = std::make_unique<SupervisedUserService>(
         identity_test_environment_->identity_manager(),
         kids_chrome_management_client_.get(), syncable_pref_service_,
-        settings_service_, sync_service_,
+        settings_service_, &sync_service_,
         /*check_webstore_url_callback=*/
         base::BindRepeating([](const GURL& url) { return false; }),
         std::make_unique<FakeURLFilterDelegate>(),
diff --git a/components/supervised_user/core/browser/parental_control_metrics_unittest.cc b/components/supervised_user/core/browser/parental_control_metrics_unittest.cc
index 1753048..7d6c37b4 100644
--- a/components/supervised_user/core/browser/parental_control_metrics_unittest.cc
+++ b/components/supervised_user/core/browser/parental_control_metrics_unittest.cc
@@ -50,7 +50,7 @@
         std::make_unique<supervised_user::SupervisedUserService>(
             identity_test_env_.identity_manager(),
             kids_chrome_management_client_.get(), pref_service_,
-            settings_service_, sync_service_,
+            settings_service_, &sync_service_,
             /*check_webstore_url_callback=*/
             base::BindRepeating([](const GURL& url) { return false; }),
             std::make_unique<supervised_user::FakeURLFilterDelegate>(),
diff --git a/components/supervised_user/core/browser/supervised_user_service.cc b/components/supervised_user/core/browser/supervised_user_service.cc
index a6a0d5d..a4751c6 100644
--- a/components/supervised_user/core/browser/supervised_user_service.cc
+++ b/components/supervised_user/core/browser/supervised_user_service.cc
@@ -152,7 +152,7 @@
     KidsChromeManagementClient* kids_chrome_management_client,
     PrefService& user_prefs,
     SupervisedUserSettingsService& settings_service,
-    syncer::SyncService& sync_service,
+    syncer::SyncService* sync_service,
     ValidateURLSupportCallback check_webstore_url_callback,
     std::unique_ptr<SupervisedUserURLFilter::Delegate> url_filter_delegate,
     bool can_show_first_time_interstitial_banner)
@@ -205,7 +205,8 @@
   // SupervisedUserSettingsModelTypeController.
   // TODO(crbug.com/946473): Get rid of this hack and instead call
   // DataTypePreconditionChanged from the controller.
-  if (sync_service_->GetUserSettings()->IsInitialSyncFeatureSetupComplete()) {
+  if (sync_service_ &&
+      sync_service_->GetUserSettings()->IsInitialSyncFeatureSetupComplete()) {
     // Trigger a reconfig by grabbing a SyncSetupInProgressHandle and
     // immediately releasing it again (via the temporary unique_ptr going away).
     sync_service_->GetSetupInProgressHandle();
diff --git a/components/supervised_user/core/browser/supervised_user_service.h b/components/supervised_user/core/browser/supervised_user_service.h
index d6d34fb..f015298 100644
--- a/components/supervised_user/core/browser/supervised_user_service.h
+++ b/components/supervised_user/core/browser/supervised_user_service.h
@@ -144,7 +144,7 @@
       KidsChromeManagementClient* kids_chrome_management_client,
       PrefService& user_prefs,
       supervised_user::SupervisedUserSettingsService& settings_service,
-      syncer::SyncService& sync_service,
+      syncer::SyncService* sync_service,
       ValidateURLSupportCallback check_webstore_url_callback,
       std::unique_ptr<supervised_user::SupervisedUserURLFilter::Delegate>
           url_filter_delegate,
@@ -197,7 +197,7 @@
   const raw_ref<supervised_user::SupervisedUserSettingsService>
       settings_service_;
 
-  const raw_ref<syncer::SyncService> sync_service_;
+  const raw_ptr<syncer::SyncService> sync_service_;
 
   raw_ptr<signin::IdentityManager> identity_manager_;
 
diff --git a/components/supervised_user/core/browser/supervised_user_service_unittest.cc b/components/supervised_user/core/browser/supervised_user_service_unittest.cc
index 4ba9f64..3612bb79 100644
--- a/components/supervised_user/core/browser/supervised_user_service_unittest.cc
+++ b/components/supervised_user/core/browser/supervised_user_service_unittest.cc
@@ -67,7 +67,7 @@
 
     service_ = std::make_unique<SupervisedUserService>(
         identity_test_env_.identity_manager(), &kids_chrome_management_client_,
-        syncable_pref_service_, settings_service_, sync_service_,
+        syncable_pref_service_, settings_service_, &sync_service_,
         /*check_webstore_url_callback=*/
         base::BindRepeating([](const GURL& url) { return false; }),
         std::make_unique<FakeURLFilterDelegate>(),
diff --git a/components/update_client/protocol_parser_json.cc b/components/update_client/protocol_parser_json.cc
index 68beca96..fb625e8 100644
--- a/components/update_client/protocol_parser_json.cc
+++ b/components/update_client/protocol_parser_json.cc
@@ -278,8 +278,11 @@
     result->status = *status;
     if (result->status == "restricted" ||
         result->status == "error-unknownApplication" ||
-        result->status == "error-invalidAppId")
+        result->status == "error-invalidAppId" ||
+        result->status == "error-osnotsupported" ||
+        result->status == "error-hwnotsupported") {
       return true;
+    }
 
     // If the status was not handled above and the status is not "ok", then
     // this must be a status literal that that the parser does not know about.
diff --git a/components/update_client/protocol_parser_json_unittest.cc b/components/update_client/protocol_parser_json_unittest.cc
index c59bf8a..331ec80 100644
--- a/components/update_client/protocol_parser_json_unittest.cc
+++ b/components/update_client/protocol_parser_json_unittest.cc
@@ -324,7 +324,7 @@
    ]
   }})";
 
-// Includes four app objects with status different than 'ok'.
+// Includes six app objects with status different than 'ok'.
 const char* kJSONAppsStatusError = R"()]}'
   {"response":{
    "protocol":"3.1",
@@ -342,6 +342,14 @@
      "updatecheck":{"status":"error-internal"}
     },
     {"appid":"dddddddd",
+     "status":"error-osnotsupported",
+     "updatecheck":{"status":"error-internal"}
+    },
+    {"appid":"eeeeeeee",
+     "status":"error-hwnotsupported",
+     "updatecheck":{"status":"error-internal"}
+    },
+    {"appid":"ffffffff",
      "status":"foobar",
      "updatecheck":{"status":"error-internal"}
     }
@@ -563,7 +571,7 @@
   {
     EXPECT_TRUE(parser->Parse(kJSONAppsStatusError));
     EXPECT_STREQ("Unknown app status", parser->errors().c_str());
-    EXPECT_EQ(3u, parser->results().list.size());
+    EXPECT_EQ(5u, parser->results().list.size());
     const auto* first_result = &parser->results().list[0];
     EXPECT_EQ(first_result->extension_id, "aaaaaaaa");
     EXPECT_STREQ("error-unknownApplication", first_result->status.c_str());
@@ -576,6 +584,14 @@
     EXPECT_EQ(third_result->extension_id, "cccccccc");
     EXPECT_STREQ("error-invalidAppId", third_result->status.c_str());
     EXPECT_TRUE(third_result->manifest.version.empty());
+    const auto* fourth_result = &parser->results().list[3];
+    EXPECT_EQ(fourth_result->extension_id, "dddddddd");
+    EXPECT_STREQ("error-osnotsupported", fourth_result->status.c_str());
+    EXPECT_TRUE(fourth_result->manifest.version.empty());
+    const auto* fifth_result = &parser->results().list[4];
+    EXPECT_EQ(fifth_result->extension_id, "eeeeeeee");
+    EXPECT_STREQ("error-hwnotsupported", fifth_result->status.c_str());
+    EXPECT_TRUE(fifth_result->manifest.version.empty());
   }
   {
     EXPECT_TRUE(parser->Parse(kJSONManifestRun));
diff --git a/components/update_client/update_client_errors.h b/components/update_client/update_client_errors.h
index 754ecec5..ea9785e 100644
--- a/components/update_client/update_client_errors.h
+++ b/components/update_client/update_client_errors.h
@@ -130,6 +130,8 @@
   UNKNOWN_APPLICATION = -10006,
   RESTRICTED_APPLICATION = -10007,
   INVALID_APPID = -10008,
+  OS_NOT_SUPPORTED = -10009,
+  HW_NOT_SUPPORTED = -10010,
 };
 
 }  // namespace update_client
diff --git a/components/update_client/update_engine.cc b/components/update_client/update_engine.cc
index a0837b2..a78e924 100644
--- a/components/update_client/update_engine.cc
+++ b/components/update_client/update_engine.cc
@@ -289,6 +289,14 @@
         if (status == "error-invalidAppId")
           return std::make_pair(ErrorCategory::kUpdateCheck,
                                 ProtocolError::INVALID_APPID);
+        if (status == "error-osnotsupported") {
+          return std::make_pair(ErrorCategory::kUpdateCheck,
+                                ProtocolError::OS_NOT_SUPPORTED);
+        }
+        if (status == "error-hwnotsupported") {
+          return std::make_pair(ErrorCategory::kUpdateCheck,
+                                ProtocolError::HW_NOT_SUPPORTED);
+        }
         // If the parser has return a valid result and the status is not one of
         // the literals above, then this must be a success an not a parse error.
         return std::make_pair(ErrorCategory::kNone, ProtocolError::NONE);
diff --git a/components/variations/variations_seed_processor.cc b/components/variations/variations_seed_processor.cc
index e915ec59..b7a7b29 100644
--- a/components/variations/variations_seed_processor.cc
+++ b/components/variations/variations_seed_processor.cc
@@ -104,8 +104,6 @@
 void ApplyUIStringOverrides(
     const Study::Experiment& experiment,
     const VariationsSeedProcessor::UIStringOverrideCallback& callback) {
-  UMA_HISTOGRAM_COUNTS_100("Variations.StringsOverridden",
-                           experiment.override_ui_string_size());
   for (int i = 0; i < experiment.override_ui_string_size(); ++i) {
     const Study::Experiment::OverrideUIString& override =
         experiment.override_ui_string(i);
diff --git a/components/viz/BUILD.gn b/components/viz/BUILD.gn
index b442a88..1cddaf3 100644
--- a/components/viz/BUILD.gn
+++ b/components/viz/BUILD.gn
@@ -6,6 +6,15 @@
 import("//components/viz/viz.gni")
 import("//testing/test.gni")
 
+if (is_ios && (skia_use_dawn || skia_use_metal)) {
+  bundle_data("unit_tests_filter_bundle_data") {
+    testonly = true
+    sources = [ "//testing/buildbot/filters/ios.viz_unittests.filter" ]
+    outputs = [ "{{bundle_resources_dir}}/" +
+                "{{source_root_relative_dir}}/{{source_file_part}}" ]
+  }
+}
+
 viz_test("viz_unittests") {
   configs = []
   if (is_chromeos_lacros && is_chromeos_device) {
@@ -52,7 +61,10 @@
   }
 
   if (is_ios) {
-    public_deps = [ "//components/test:viz_test_bundle_data" ]
+    public_deps = [
+      ":unit_tests_filter_bundle_data",
+      "//components/test:viz_test_bundle_data",
+    ]
   }
 }
 
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn
index 9e66224b..24ef0df 100644
--- a/components/viz/service/BUILD.gn
+++ b/components/viz/service/BUILD.gn
@@ -462,12 +462,13 @@
     }
   }
 
-  if (skia_use_dawn && is_win) {
-    sources += [
-      "display_embedder/skia_output_device_dawn.cc",
-      "display_embedder/skia_output_device_dawn.h",
-    ]
-
+  if (skia_use_dawn) {
+    if (is_win) {
+      sources += [
+        "display_embedder/skia_output_device_dawn.cc",
+        "display_embedder/skia_output_device_dawn.h",
+      ]
+    }
     public_deps += [ "//third_party/dawn/include/dawn:headers" ]
 
     deps += [
diff --git a/components/viz/service/display/viz_pixel_test.cc b/components/viz/service/display/viz_pixel_test.cc
index ad8ee86d..91b5a4bd 100644
--- a/components/viz/service/display/viz_pixel_test.cc
+++ b/components/viz/service/display/viz_pixel_test.cc
@@ -15,8 +15,10 @@
     RendererType renderer_type) {
   if (renderer_type == RendererType::kSkiaVk) {
     return GraphicsBackend::kSkiaVulkan;
-  } else if (renderer_type == RendererType::kSkiaGraphite) {
-    return GraphicsBackend::kSkiaGraphite;
+  } else if (renderer_type == RendererType::kSkiaGraphiteDawn) {
+    return GraphicsBackend::kSkiaGraphiteDawn;
+  } else if (renderer_type == RendererType::kSkiaGraphiteMetal) {
+    return GraphicsBackend::kSkiaGraphiteMetal;
   }
 
   return GraphicsBackend::kDefault;
@@ -32,7 +34,8 @@
       break;
     case RendererType::kSkiaGL:
     case RendererType::kSkiaVk:
-    case RendererType::kSkiaGraphite:
+    case RendererType::kSkiaGraphiteDawn:
+    case RendererType::kSkiaGraphiteMetal:
       SetUpSkiaRenderer(GetSurfaceOrigin());
       break;
   }
diff --git a/components/viz/service/display/viz_pixel_test.h b/components/viz/service/display/viz_pixel_test.h
index 3d37e1a7..112bde5 100644
--- a/components/viz/service/display/viz_pixel_test.h
+++ b/components/viz/service/display/viz_pixel_test.h
@@ -36,7 +36,8 @@
       case RendererType::kSkiaGL:
       case RendererType::kSkiaVk:
         return "skia";
-      case RendererType::kSkiaGraphite:
+      case RendererType::kSkiaGraphiteDawn:
+      case RendererType::kSkiaGraphiteMetal:
         return "graphite";
     }
   }
@@ -45,7 +46,8 @@
     return renderer_type_ == RendererType::kSoftware;
   }
   bool is_skia_graphite() const {
-    return renderer_type_ == RendererType::kSkiaGraphite;
+    return renderer_type_ == RendererType::kSkiaGraphiteDawn ||
+           renderer_type_ == RendererType::kSkiaGraphiteMetal;
   }
 
  protected:
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.cc b/components/viz/service/display_embedder/skia_output_surface_impl.cc
index e04c93c7..49fcb97 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl.cc
@@ -1709,7 +1709,7 @@
 bool SkiaOutputSurfaceImpl::SupportsBGRA() const {
   if (graphite_recorder_) {
     // TODO(crbug.com/1451789): Implement properly for Graphite.
-#if BUILDFLAG(IS_IOS) && BUILDFLAG(SKIA_USE_METAL)
+#if BUILDFLAG(IS_IOS)
     return false;
 #else
     return true;
diff --git a/components/viz/test/test_types.cc b/components/viz/test/test_types.cc
index 96a1b3d..d2c38cf 100644
--- a/components/viz/test/test_types.cc
+++ b/components/viz/test/test_types.cc
@@ -4,6 +4,7 @@
 
 #include "components/viz/test/test_types.h"
 
+#include "build/build_config.h"
 #include "components/viz/test/buildflags.h"
 
 namespace viz {
@@ -17,8 +18,10 @@
       return "SkiaGL";
     case RendererType::kSkiaVk:
       return "SkiaVulkan";
-    case RendererType::kSkiaGraphite:
-      return "SkiaGraphite";
+    case RendererType::kSkiaGraphiteDawn:
+      return "SkiaGraphiteDawn";
+    case RendererType::kSkiaGraphiteMetal:
+      return "SkiaGraphiteMetal";
     case RendererType::kSoftware:
       return "Software";
   }
@@ -31,13 +34,16 @@
     types.push_back(RendererType::kSoftware);
 #if BUILDFLAG(ENABLE_GL_BACKEND_TESTS)
   types.push_back(RendererType::kSkiaGL);
-#endif
+#endif  // BUILDFLAG(ENABLE_GL_BACKEND_TESTS)
 #if BUILDFLAG(ENABLE_VULKAN_BACKEND_TESTS)
   types.push_back(RendererType::kSkiaVk);
-#endif
+#endif  // BUILDFLAG(ENABLE_VULKAN_BACKEND_TESTS)
 #if BUILDFLAG(ENABLE_SKIA_GRAPHITE_TESTS)
-  types.push_back(RendererType::kSkiaGraphite);
-#endif
+  types.push_back(RendererType::kSkiaGraphiteDawn);
+#if BUILDFLAG(IS_IOS)
+  types.push_back(RendererType::kSkiaGraphiteMetal);
+#endif  // BUILDFLAG(IS_IOS)
+#endif  // BUILDFLAG(ENABLE_SKIA_GRAPHITE_TESTS)
   return types;
 }
 
diff --git a/components/viz/test/test_types.h b/components/viz/test/test_types.h
index e019872..1bf7f49 100644
--- a/components/viz/test/test_types.h
+++ b/components/viz/test/test_types.h
@@ -13,7 +13,8 @@
 enum class RendererType {
   kSkiaGL,
   kSkiaVk,
-  kSkiaGraphite,
+  kSkiaGraphiteDawn,
+  kSkiaGraphiteMetal,
   kSoftware,
 };
 
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/CredManSupportProvider.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/CredManSupportProvider.java
index 406c8864..bc187a2d 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/CredManSupportProvider.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/CredManSupportProvider.java
@@ -9,13 +9,11 @@
 import org.jni_zero.CalledByNative;
 
 import org.chromium.base.PackageUtils;
-import org.chromium.components.version_info.VersionInfo;
 import org.chromium.device.DeviceFeatureList;
 import org.chromium.device.DeviceFeatureMap;
 
 public class CredManSupportProvider {
-    private static final int GMSCORE_MIN_VERSION_CREDMAN =
-            (VersionInfo.isBetaBuild() || VersionInfo.isStableBuild()) ? 234600000 : 234100000;
+    private static final int GMSCORE_MIN_VERSION_CREDMAN = 234600000;
 
     private static @CredManSupport int sCredManSupport;
 
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index dd0203d..f98e1be 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -297,7 +297,6 @@
     "//ipc",
     "//media/mojo/mojom:remoting",
     "//third_party/blink/public/mojom:embedded_frame_sink_mojo_bindings",
-    "//third_party/blink/public/mojom:mojom_broadcastchannel_bindings",
     "//third_party/leveldatabase",
     "//ui/base/cursor",
     "//ui/base/dragdrop/mojom:mojom_headers",
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index 3f6fde5..fbae2c0c 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -128,6 +128,7 @@
       features::kEnableAccessibilityExposeHTMLElement);
   enabled_features->emplace_back(
       features::kEnableAccessibilityAriaVirtualContent);
+  enabled_features->emplace_back(features::kAugmentExistingImageLabels);
   DumpAccessibilityTestBase::ChooseFeatures(enabled_features,
                                             disabled_features);
 }
diff --git a/content/browser/attribution_reporting/attribution_debug_report.cc b/content/browser/attribution_reporting/attribution_debug_report.cc
index b7ab146..afe1e7e0 100644
--- a/content/browser/attribution_reporting/attribution_debug_report.cc
+++ b/content/browser/attribution_reporting/attribution_debug_report.cc
@@ -310,14 +310,15 @@
   switch (data_type) {
     case DebugDataType::kSourceDestinationLimit:
       SetLimit(data_body,
-               result.max_destinations_per_source_site_reporting_site);
+               result.max_destinations_per_source_site_reporting_site());
       break;
     case DebugDataType::kSourceStorageLimit:
-      SetLimit(data_body, result.max_sources_per_origin);
+      SetLimit(data_body, result.max_sources_per_origin());
       break;
     case DebugDataType::kSourceDestinationRateLimit:
-      SetLimit(data_body,
-               result.max_destinations_per_rate_limit_window_reporting_origin);
+      SetLimit(
+          data_body,
+          result.max_destinations_per_rate_limit_window_reporting_origin());
       break;
     case DebugDataType::kSourceNoised:
     case DebugDataType::kSourceSuccess:
@@ -465,7 +466,7 @@
   }
 
   absl::optional<DebugDataType> data_type =
-      GetReportDataType(result.status, is_debug_cookie_set);
+      GetReportDataType(result.status(), is_debug_cookie_set);
   if (!data_type) {
     return absl::nullopt;
   }
diff --git a/content/browser/attribution_reporting/attribution_debug_report.h b/content/browser/attribution_reporting/attribution_debug_report.h
index 1bf741a..1926bf20 100644
--- a/content/browser/attribution_reporting/attribution_debug_report.h
+++ b/content/browser/attribution_reporting/attribution_debug_report.h
@@ -18,9 +18,9 @@
 class AttributionTrigger;
 class CreateReportResult;
 class StorableSource;
+class StoreSourceResult;
 
 struct OsRegistration;
-struct StoreSourceResult;
 
 // Class that contains all the data needed to serialize and send an attribution
 // debug report.
diff --git a/content/browser/attribution_reporting/attribution_interop_runner.cc b/content/browser/attribution_reporting/attribution_interop_runner.cc
index 64b58d5..41ee96d 100644
--- a/content/browser/attribution_reporting/attribution_interop_runner.cc
+++ b/content/browser/attribution_reporting/attribution_interop_runner.cc
@@ -27,6 +27,7 @@
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "base/task/updateable_sequenced_task_runner.h"
+#include "base/test/bind.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
 #include "base/types/expected.h"
@@ -49,14 +50,11 @@
 #include "content/browser/attribution_reporting/attribution_input_event.h"
 #include "content/browser/attribution_reporting/attribution_interop_parser.h"
 #include "content/browser/attribution_reporting/attribution_manager_impl.h"
-#include "content/browser/attribution_reporting/attribution_observer.h"
 #include "content/browser/attribution_reporting/attribution_os_level_manager.h"
 #include "content/browser/attribution_reporting/attribution_report.h"
 #include "content/browser/attribution_reporting/attribution_report_sender.h"
 #include "content/browser/attribution_reporting/attribution_reporting.mojom.h"
 #include "content/browser/attribution_reporting/attribution_storage_delegate_impl.h"
-#include "content/browser/attribution_reporting/attribution_trigger.h"
-#include "content/browser/attribution_reporting/create_report_result.h"
 #include "content/browser/attribution_reporting/send_result.h"
 #include "content/browser/storage_partition_impl.h"
 #include "content/public/browser/global_routing_id.h"
@@ -256,8 +254,8 @@
 };
 
 // Registers sources and triggers in the `AttributionManagerImpl` and records
-// sent reports.
-class AttributionEventHandler : public AttributionObserver {
+// unparsable registrations.
+class AttributionEventHandler {
  public:
   AttributionEventHandler(std::unique_ptr<AttributionManagerImpl> manager,
                           FakeCookieChecker* fake_cookie_checker,
@@ -267,12 +265,8 @@
             raw_ref<FakeCookieChecker>::from_ptr(fake_cookie_checker)),
         time_offset_(TimeOffset(time_origin)) {
     DCHECK(manager_);
-
-    manager_->AddObserver(this);
   }
 
-  ~AttributionEventHandler() override { manager_->RemoveObserver(this); }
-
   void Handle(AttributionSimulationEvent event) {
     fake_cookie_checker_->set_debug_cookie_set(event.debug_permission);
 
@@ -354,23 +348,34 @@
     return std::move(unparsable_);
   }
 
-  base::Time max_report_time() const { return max_report_time_; }
+  void FastForwardUntilReportsConsumed(
+      BrowserTaskEnvironment& task_environment) {
+    while (true) {
+      auto delta = base::TimeDelta::Min();
+      base::RunLoop run_loop;
 
- private:
-  // AttributionObserver:
+      manager_->GetPendingReportsForInternalUse(
+          /*limit=*/-1, base::BindLambdaForTesting(
+                            [&](std::vector<AttributionReport> reports) {
+                              auto it = base::ranges::max_element(
+                                  reports, /*comp=*/{},
+                                  &AttributionReport::report_time);
+                              if (it != reports.end()) {
+                                delta = it->report_time() - base::Time::Now();
+                              }
+                              run_loop.Quit();
+                            }));
 
-  void OnTriggerHandled(const AttributionTrigger&,
-                        absl::optional<uint64_t> cleared_debug_key,
-                        const CreateReportResult& result) override {
-    if (const auto& report = result.new_event_level_report()) {
-      max_report_time_ = std::max(max_report_time_, report->report_time());
-    }
+      run_loop.Run();
 
-    if (const auto& report = result.new_aggregatable_report()) {
-      max_report_time_ = std::max(max_report_time_, report->report_time());
+      if (delta.is_negative()) {
+        break;
+      }
+      task_environment.FastForwardBy(delta);
     }
   }
 
+ private:
   void AddUnparsableRegistration(const AttributionSimulationEvent& event) {
     auto& registration = unparsable_.emplace_back();
     registration.time = event.time - time_offset_;
@@ -384,8 +389,6 @@
 
   const base::TimeDelta time_offset_;
 
-  base::Time max_report_time_;
-
   std::vector<AttributionInteropOutput::UnparsableRegistration> unparsable_;
 };
 
@@ -395,7 +398,7 @@
 RunAttributionInteropSimulation(base::Value::Dict input,
                                 const AttributionConfig& config) {
   // Prerequisites for using an environment with mock time.
-  content::BrowserTaskEnvironment task_environment(
+  BrowserTaskEnvironment task_environment(
       base::test::TaskEnvironment::TimeSource::MOCK_TIME);
   TestBrowserContext browser_context;
   const base::Time time_origin = base::Time::Now();
@@ -464,11 +467,7 @@
 
   task_environment.FastForwardBy(max_event_time - base::Time::Now());
 
-  if (base::Time max_report_time = handler.max_report_time(),
-      now = base::Time::Now();
-      max_report_time >= now) {
-    task_environment.FastForwardBy(max_report_time - now);
-  }
+  handler.FastForwardUntilReportsConsumed(task_environment);
 
   output.unparsable_registrations = std::move(handler).TakeUnparsable();
   return output;
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.cc b/content/browser/attribution_reporting/attribution_manager_impl.cc
index a13abed..5bf0f5d 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl.cc
+++ b/content/browser/attribution_reporting/attribution_manager_impl.cc
@@ -204,7 +204,7 @@
                     StorableSource::Result::kExceedsMaxChannelCapacity,
                 "Bump version of Conversions.SourceStoredStatus8 histogram.");
   base::UmaHistogramEnumeration("Conversions.SourceStoredStatus8",
-                                result.status);
+                                result.status());
 }
 
 void RecordCreateReportStatus(CreateReportResult result) {
@@ -638,10 +638,10 @@
 
   base::Time now = base::Time::Now();
   for (auto& observer : observers_) {
-    observer.OnSourceHandled(source, now, cleared_debug_key, result.status);
+    observer.OnSourceHandled(source, now, cleared_debug_key, result.status());
   }
 
-  scheduler_timer_->MaybeSet(result.min_fake_report_time);
+  scheduler_timer_->MaybeSet(result.min_fake_report_time());
 
   NotifySourcesChanged();
 
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.h b/content/browser/attribution_reporting/attribution_manager_impl.h
index 55e8c67..b5f5d82f 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl.h
+++ b/content/browser/attribution_reporting/attribution_manager_impl.h
@@ -56,11 +56,11 @@
 class AttributionStorageDelegate;
 class CreateReportResult;
 class StoragePartitionImpl;
+class StoreSourceResult;
 
 struct GlobalRenderFrameHostId;
 struct OsRegistration;
 struct SendResult;
-struct StoreSourceResult;
 
 // UI thread class that manages the lifetime of the underlying attribution
 // storage and coordinates sending attribution reports. Owned by the storage
diff --git a/content/browser/attribution_reporting/attribution_storage.h b/content/browser/attribution_reporting/attribution_storage.h
index 6d56dd4..494c560 100644
--- a/content/browser/attribution_reporting/attribution_storage.h
+++ b/content/browser/attribution_reporting/attribution_storage.h
@@ -25,10 +25,9 @@
 class AttributionTrigger;
 class CreateReportResult;
 class StorableSource;
+class StoreSourceResult;
 class StoredSource;
 
-struct StoreSourceResult;
-
 // This class provides an interface for persisting attribution data to
 // disk, and performing queries on it. AttributionStorage should initialize
 // itself. Calls to a AttributionStorage instance that failed to initialize
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc
index 0021230..c7b3f34 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql.cc
+++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -398,22 +398,6 @@
   return user_data_directory.Append(kDatabasePath);
 }
 
-StorableSource::Result DestinationRateLimitResultToStorableSourceResult(
-    RateLimitTable::DestinationRateLimitResult r) {
-  switch (r) {
-    case RateLimitTable::DestinationRateLimitResult::kAllowed:
-      return StorableSource::Result::kSuccess;
-    case RateLimitTable::DestinationRateLimitResult::kHitGlobalLimit:
-      return StorableSource::Result::kDestinationGlobalLimitReached;
-    case RateLimitTable::DestinationRateLimitResult::kHitReportingLimit:
-      return StorableSource::Result::kDestinationReportingLimitReached;
-    case RateLimitTable::DestinationRateLimitResult::kHitBothLimits:
-      return StorableSource::Result::kDestinationBothLimitsReached;
-    case RateLimitTable::DestinationRateLimitResult::kError:
-      return StorableSource::Result::kInternalError;
-  }
-}
-
 }  // namespace
 
 AttributionStorageSql::AttributionStorageSql(
@@ -476,15 +460,9 @@
 
   const base::Time source_time = base::Time::Now();
 
-  if (StorableSource::Result result =
-          CheckDestinationRateLimit(source, source_time);
-      result != StorableSource::Result::kSuccess) {
-    StoreSourceResult store_result(result);
-    if (result != StorableSource::Result::kInternalError) {
-      store_result.max_destinations_per_rate_limit_window_reporting_origin =
-          delegate_->GetDestinationRateLimit().max_per_reporting_site;
-    }
-    return store_result;
+  if (StoreSourceResult result = CheckDestinationRateLimit(source, source_time);
+      result.status() != StorableSource::Result::kSuccess) {
+    return result;
   }
 
   // Only delete expired impressions periodically to avoid excessive DB
@@ -735,7 +713,7 @@
       min_fake_report_time);
 }
 
-StorableSource::Result AttributionStorageSql::CheckDestinationRateLimit(
+StoreSourceResult AttributionStorageSql::CheckDestinationRateLimit(
     const StorableSource& source,
     base::Time source_time) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -745,7 +723,31 @@
   base::UmaHistogramEnumeration("Conversions.DestinationRateLimitResult",
                                 rate_limit_result);
 
-  return DestinationRateLimitResultToStorableSourceResult(rate_limit_result);
+  switch (rate_limit_result) {
+    case RateLimitTable::DestinationRateLimitResult::kAllowed:
+      return StoreSourceResult(StorableSource::Result::kSuccess);
+    case RateLimitTable::DestinationRateLimitResult::kHitGlobalLimit:
+      return StoreSourceResult(
+          StorableSource::Result::kDestinationGlobalLimitReached);
+    case RateLimitTable::DestinationRateLimitResult::kHitReportingLimit:
+      return StoreSourceResult(
+          StorableSource::Result::kDestinationReportingLimitReached,
+          /*min_fake_report_time=*/absl::nullopt,
+          /*max_destinations_per_source_site_reporting_site=*/absl::nullopt,
+          /*max_sources_per_origin=*/absl::nullopt,
+          /*max_destinations_per_rate_limit_window_reporting_origin=*/
+          delegate_->GetDestinationRateLimit().max_per_reporting_site);
+    case RateLimitTable::DestinationRateLimitResult::kHitBothLimits:
+      return StoreSourceResult(
+          StorableSource::Result::kDestinationBothLimitsReached,
+          /*min_fake_report_time=*/absl::nullopt,
+          /*max_destinations_per_source_site_reporting_site=*/absl::nullopt,
+          /*max_sources_per_origin=*/absl::nullopt,
+          /*max_destinations_per_rate_limit_window_reporting_origin=*/
+          delegate_->GetDestinationRateLimit().max_per_reporting_site);
+    case RateLimitTable::DestinationRateLimitResult::kError:
+      return StoreSourceResult(StorableSource::Result::kInternalError);
+  }
 }
 
 // Checks whether a new report is allowed to be stored for the given source
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.h b/content/browser/attribution_reporting/attribution_storage_sql.h
index 9df3e89..250ce52 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql.h
+++ b/content/browser/attribution_reporting/attribution_storage_sql.h
@@ -21,7 +21,6 @@
 #include "content/browser/attribution_reporting/attribution_storage.h"
 #include "content/browser/attribution_reporting/attribution_trigger.h"
 #include "content/browser/attribution_reporting/rate_limit_table.h"
-#include "content/browser/attribution_reporting/store_source_result.mojom-forward.h"
 #include "content/browser/attribution_reporting/stored_source.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/attribution_data_model.h"
@@ -153,9 +152,9 @@
                  bool delete_rate_limit_data) override;
   void SetDelegate(std::unique_ptr<AttributionStorageDelegate>) override;
 
-  [[nodiscard]] attribution_reporting::mojom::StoreSourceResult
-  CheckDestinationRateLimit(const StorableSource& source,
-                            base::Time source_time);
+  [[nodiscard]] StoreSourceResult CheckDestinationRateLimit(
+      const StorableSource& source,
+      base::Time source_time);
 
   void ClearAllDataAllTime(bool delete_rate_limit_data)
       VALID_CONTEXT_REQUIRED(sequence_checker_);
diff --git a/content/browser/attribution_reporting/attribution_storage_unittest.cc b/content/browser/attribution_reporting/attribution_storage_unittest.cc
index 742842fc..1e0e0ac 100644
--- a/content/browser/attribution_reporting/attribution_storage_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_storage_unittest.cc
@@ -638,7 +638,7 @@
 TEST_F(AttributionStorageTest, ExceedsChannelCapacity) {
   delegate()->set_exceeds_channel_capacity_limit(true);
 
-  EXPECT_EQ(storage()->StoreSource(SourceBuilder().Build()).status,
+  EXPECT_EQ(storage()->StoreSource(SourceBuilder().Build()).status(),
             StorableSource::Result::kExceedsMaxChannelCapacity);
 }
 
@@ -653,7 +653,7 @@
                                   .SetPriority(1)
                                   .SetMaxEventLevelReports(1)
                                   .Build())
-                .status,
+                .status(),
             StorableSource::Result::kSuccess);
 
   ASSERT_EQ(storage()
@@ -662,7 +662,7 @@
                                   .SetPriority(2)
                                   .SetMaxEventLevelReports(1)
                                   .Build())
-                .status,
+                .status(),
             StorableSource::Result::kSuccess);
 
   // Force the lower-priority source to be deactivated.
@@ -678,7 +678,7 @@
                                   .SetSourceEventId(6)
                                   .SetMaxEventLevelReports(1)
                                   .Build())
-                .status,
+                .status(),
             StorableSource::Result::kSuccess);
 
   ASSERT_EQ(storage()
@@ -686,7 +686,7 @@
                                   .SetSourceEventId(7)
                                   .SetMaxEventLevelReports(1)
                                   .Build())
-                .status,
+                .status(),
             StorableSource::Result::kInsufficientSourceCapacity);
 
   int64_t file_size = histograms.GetTotalSum(
@@ -732,7 +732,7 @@
                                       "https://foo.a.example"))
                                   .SetSourceEventId(9)
                                   .Build())
-                .status,
+                .status(),
             StorableSource::Result::kInsufficientSourceCapacity);
 
   // This impression should be stored, because its origin hasn't hit the limit
@@ -1209,7 +1209,7 @@
   delegate()->set_randomized_response(std::vector<FakeEventLevelReport>{});
   StoreSourceResult result = storage()->StoreSource(
       TestAggregatableSourceProvider().GetBuilder().Build());
-  EXPECT_EQ(result.status, StorableSource::Result::kSuccessNoised);
+  EXPECT_EQ(result.status(), StorableSource::Result::kSuccessNoised);
   delegate()->set_randomized_response(absl::nullopt);
 
   EXPECT_THAT(
@@ -1240,7 +1240,7 @@
       {.trigger_data = 7, .window_index = 0}});
   StoreSourceResult result =
       storage()->StoreSource(SourceBuilder().SetSourceEventId(5).Build());
-  EXPECT_EQ(result.status, StorableSource::Result::kSuccessNoised);
+  EXPECT_EQ(result.status(), StorableSource::Result::kSuccessNoised);
   delegate()->set_randomized_response(absl::nullopt);
 
   EXPECT_THAT(storage()->GetActiveSources(), SizeIs(2u));
@@ -1259,7 +1259,7 @@
   delegate()->set_randomized_response(std::vector<FakeEventLevelReport>{
       {.trigger_data = 7, .window_index = 0}});
   StoreSourceResult result = storage()->StoreSource(SourceBuilder().Build());
-  EXPECT_EQ(result.status, StorableSource::Result::kSuccessNoised);
+  EXPECT_EQ(result.status(), StorableSource::Result::kSuccessNoised);
   delegate()->set_randomized_response(absl::nullopt);
 
   EXPECT_THAT(storage()->GetActiveSources(), SizeIs(2u));
@@ -1391,7 +1391,7 @@
                     {net::SchemefulSite::Deserialize(destination_origin)})
                 .SetExpiry(base::Days(30))
                 .Build())
-        .status;
+        .status();
   };
 
   store_source("https://s1.test", "https://a.r.test", "https://d1.test");
@@ -1442,7 +1442,7 @@
                     {net::SchemefulSite::Deserialize(destination_origin)})
                 .SetExpiry(expiry)
                 .Build())
-        .status;
+        .status();
   };
 
   // Allowed by pending, allowed by unexpired.
@@ -1510,9 +1510,9 @@
               {net::SchemefulSite::Deserialize("https://b.example")})
           .SetSourceType(SourceType::kEvent)
           .Build());
-  EXPECT_EQ(result.status,
+  EXPECT_EQ(result.status(),
             StorableSource::Result::kInsufficientUniqueDestinationCapacity);
-  EXPECT_EQ(result.max_destinations_per_source_site_reporting_site, 1);
+  EXPECT_EQ(result.max_destinations_per_source_site_reporting_site(), 1);
 
   EXPECT_THAT(storage()->GetActiveSources(), SizeIs(1));
 }
@@ -1592,7 +1592,7 @@
 
   // Should fail due to limit
   StoreSourceResult result = storage()->StoreSource(SourceBuilder().Build());
-  EXPECT_THAT(result.status,
+  EXPECT_THAT(result.status(),
               StorableSource::Result::kDestinationReportingLimitReached);
 }
 
@@ -1613,7 +1613,7 @@
 
   // Should fail due to limit
   StoreSourceResult result = storage()->StoreSource(SourceBuilder().Build());
-  EXPECT_THAT(result.status,
+  EXPECT_THAT(result.status(),
               StorableSource::Result::kDestinationGlobalLimitReached);
 }
 
@@ -1653,7 +1653,7 @@
       SourceBuilder()
           .SetReportingOrigin(*SuitableOrigin::Deserialize("https://r1.test"))
           .Build());
-  EXPECT_THAT(result.status,
+  EXPECT_THAT(result.status(),
               StorableSource::Result::kDestinationBothLimitsReached);
 }
 
@@ -1740,7 +1740,7 @@
   delegate()->set_randomized_response(std::vector<FakeEventLevelReport>{
       {.trigger_data = 1, .window_index = 0}});
   StoreSourceResult result = storage()->StoreSource(builder.Build());
-  EXPECT_EQ(result.status, StorableSource::Result::kSuccessNoised);
+  EXPECT_EQ(result.status(), StorableSource::Result::kSuccessNoised);
   delegate()->set_randomized_response(absl::nullopt);
 
   AttributionReport expected_event_level_report =
@@ -1849,10 +1849,10 @@
                     base::Days(0),
                     {base::Days(1), base::Days(2), base::Days(3)}))
             .Build());
-    EXPECT_EQ(result.status, test_case.randomized_response
-                                 ? StorableSource::Result::kSuccessNoised
-                                 : StorableSource::Result::kSuccess);
-    EXPECT_EQ(result.min_fake_report_time, test_case.expected);
+    EXPECT_EQ(result.status(), test_case.randomized_response
+                                   ? StorableSource::Result::kSuccessNoised
+                                   : StorableSource::Result::kSuccess);
+    EXPECT_EQ(result.min_fake_report_time(), test_case.expected);
   }
 }
 
@@ -2965,7 +2965,7 @@
           .SetDebugKey(1)
           .Build(),
       /*debug_cookie_set=*/true);
-  ASSERT_EQ(result.status, StorableSource::Result::kSuccess);
+  ASSERT_EQ(result.status(), StorableSource::Result::kSuccess);
 
   result = storage()->StoreSource(
       SourceBuilder()
@@ -2973,7 +2973,7 @@
           .SetDebugKey(2)
           .Build(),
       /*debug_cookie_set=*/true);
-  ASSERT_EQ(result.status, StorableSource::Result::kSuccess);
+  ASSERT_EQ(result.status(), StorableSource::Result::kSuccess);
 
   result = storage()->StoreSource(
       SourceBuilder()
@@ -2981,7 +2981,8 @@
           .SetDebugKey(3)
           .Build(),
       /*debug_cookie_set=*/true);
-  ASSERT_EQ(result.status, StorableSource::Result::kExcessiveReportingOrigins);
+  ASSERT_EQ(result.status(),
+            StorableSource::Result::kExcessiveReportingOrigins);
 
   EXPECT_THAT(storage()->GetActiveSources(),
               ElementsAre(SourceDebugKeyIs(1), SourceDebugKeyIs(2)));
@@ -3900,7 +3901,7 @@
                 .SetReportingOrigin(*SuitableOrigin::Deserialize(reporting))
                 .SetExpiry(base::Days(2))
                 .Build())
-        .status;
+        .status();
   };
   store_source("https://a.test", "https://reporter.test");
   EXPECT_THAT(storage()->GetActiveSources(), SizeIs(1));
diff --git a/content/browser/attribution_reporting/store_source_result.cc b/content/browser/attribution_reporting/store_source_result.cc
index a48968f..24fd429 100644
--- a/content/browser/attribution_reporting/store_source_result.cc
+++ b/content/browser/attribution_reporting/store_source_result.cc
@@ -4,7 +4,7 @@
 
 #include "content/browser/attribution_reporting/store_source_result.h"
 
-#include "base/check.h"
+#include "base/check_op.h"
 #include "base/time/time.h"
 #include "content/browser/attribution_reporting/store_source_result.mojom.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -17,24 +17,24 @@
     absl::optional<int> max_destinations_per_source_site_reporting_site,
     absl::optional<int> max_sources_per_origin,
     absl::optional<int> max_destinations_per_rate_limit_window_reporting_origin)
-    : status(status),
-      min_fake_report_time(min_fake_report_time),
-      max_destinations_per_source_site_reporting_site(
+    : status_(status),
+      min_fake_report_time_(min_fake_report_time),
+      max_destinations_per_source_site_reporting_site_(
           max_destinations_per_source_site_reporting_site),
-      max_sources_per_origin(max_sources_per_origin),
-      max_destinations_per_rate_limit_window_reporting_origin(
+      max_sources_per_origin_(max_sources_per_origin),
+      max_destinations_per_rate_limit_window_reporting_origin_(
           max_destinations_per_rate_limit_window_reporting_origin) {
-  DCHECK(!max_destinations_per_source_site_reporting_site.has_value() ||
-         status == attribution_reporting::mojom::StoreSourceResult::
-                       kInsufficientUniqueDestinationCapacity);
-  DCHECK(!max_sources_per_origin.has_value() ||
-         status == attribution_reporting::mojom::StoreSourceResult::
-                       kInsufficientSourceCapacity);
-  DCHECK(!max_destinations_per_rate_limit_window_reporting_origin.has_value() ||
-         status == attribution_reporting::mojom::StoreSourceResult::
-                       kDestinationReportingLimitReached ||
-         status == attribution_reporting::mojom::StoreSourceResult::
-                       kDestinationBothLimitsReached);
+  CHECK_EQ(max_destinations_per_source_site_reporting_site_.has_value(),
+           status_ == attribution_reporting::mojom::StoreSourceResult::
+                          kInsufficientUniqueDestinationCapacity);
+  CHECK_EQ(max_sources_per_origin_.has_value(),
+           status_ == attribution_reporting::mojom::StoreSourceResult::
+                          kInsufficientSourceCapacity);
+  CHECK_EQ(max_destinations_per_rate_limit_window_reporting_origin_.has_value(),
+           status_ == attribution_reporting::mojom::StoreSourceResult::
+                          kDestinationReportingLimitReached ||
+               status_ == attribution_reporting::mojom::StoreSourceResult::
+                              kDestinationBothLimitsReached);
 }
 
 StoreSourceResult::~StoreSourceResult() = default;
diff --git a/content/browser/attribution_reporting/store_source_result.h b/content/browser/attribution_reporting/store_source_result.h
index abb10a6b..4c494bfa 100644
--- a/content/browser/attribution_reporting/store_source_result.h
+++ b/content/browser/attribution_reporting/store_source_result.h
@@ -12,7 +12,8 @@
 
 namespace content {
 
-struct CONTENT_EXPORT StoreSourceResult {
+class CONTENT_EXPORT StoreSourceResult {
+ public:
   explicit StoreSourceResult(
       attribution_reporting::mojom::StoreSourceResult status,
       absl::optional<base::Time> min_fake_report_time = absl::nullopt,
@@ -31,25 +32,47 @@
   StoreSourceResult& operator=(const StoreSourceResult&);
   StoreSourceResult& operator=(StoreSourceResult&&);
 
-  attribution_reporting::mojom::StoreSourceResult status;
+  attribution_reporting::mojom::StoreSourceResult status() const {
+    return status_;
+  }
+
+  absl::optional<base::Time> min_fake_report_time() const {
+    return min_fake_report_time_;
+  }
+
+  absl::optional<int> max_destinations_per_source_site_reporting_site() const {
+    return max_destinations_per_source_site_reporting_site_;
+  }
+
+  absl::optional<int> max_sources_per_origin() const {
+    return max_sources_per_origin_;
+  }
+
+  absl::optional<int> max_destinations_per_rate_limit_window_reporting_origin()
+      const {
+    return max_destinations_per_rate_limit_window_reporting_origin_;
+  }
+
+ private:
+  attribution_reporting::mojom::StoreSourceResult status_;
 
   // The earliest report time for any fake reports stored alongside the
   // source, if any.
-  absl::optional<base::Time> min_fake_report_time;
+  absl::optional<base::Time> min_fake_report_time_;
 
   // Only populated in case of
   // `attribution_reporting::mojom::StoreSourceResult::kInsufficientUniqueDestinationCapacity`.
-  absl::optional<int> max_destinations_per_source_site_reporting_site;
+  absl::optional<int> max_destinations_per_source_site_reporting_site_;
 
   // Only populated in case of
   // `attribution_reporting::mojom::StoreSourceResult::kInsufficientSourceCapacity`.
-  absl::optional<int> max_sources_per_origin;
+  absl::optional<int> max_sources_per_origin_;
 
   // Populated in the cases of either
   // `attribution_reporting::mojom::StoreSourceResult::kDestinationReportingLimitReached`
   // or
   // `attribution_reporting::mojom::StoreSourceResult::kDestinationBothLimitsReached`
-  absl::optional<int> max_destinations_per_rate_limit_window_reporting_origin;
+  absl::optional<int> max_destinations_per_rate_limit_window_reporting_origin_;
 };
 
 }  // namespace content
diff --git a/content/browser/blob_storage/OWNERS b/content/browser/blob_storage/OWNERS
index 7700ef11..85322b60 100644
--- a/content/browser/blob_storage/OWNERS
+++ b/content/browser/blob_storage/OWNERS
@@ -1,6 +1 @@
-# Primary
-asully@chromium.org
-
-# Secondary
-ayui@chromium.org
-dmurph@chromium.org
+file://storage/browser/blob/OWNERS
diff --git a/content/browser/file_system_access/file_system_access_observer_browsertest.cc b/content/browser/file_system_access/file_system_access_observer_browsertest.cc
index d755f1a..6be55fd 100644
--- a/content/browser/file_system_access/file_system_access_observer_browsertest.cc
+++ b/content/browser/file_system_access/file_system_access_observer_browsertest.cc
@@ -478,8 +478,9 @@
   EXPECT_THAT(records.GetList(), testing::Not(testing::IsEmpty()));
 }
 
+/// TODO(crbug/1499075): Re-enable after fixing flakiness.
 IN_PROC_BROWSER_TEST_P(FileSystemAccessObserverBrowserTest,
-                       ObserveDirectoryRecursively) {
+                       DISABLED_ObserveDirectoryRecursively) {
   base::FilePath dir_path = CreateDirectoryToBePicked();
 
   // Set up the directory structure.
diff --git a/content/browser/interest_group/ad_auction_page_data.cc b/content/browser/interest_group/ad_auction_page_data.cc
index 4080ba8..94a1516 100644
--- a/content/browser/interest_group/ad_auction_page_data.cc
+++ b/content/browser/interest_group/ad_auction_page_data.cc
@@ -6,7 +6,10 @@
 
 #include "base/no_destructor.h"
 #include "base/time/time.h"
+#include "content/browser/devtools/devtools_instrumentation.h"
+#include "content/browser/interest_group/header_direct_from_seller_signals.h"
 #include "services/data_decoder/public/cpp/data_decoder.h"
+#include "third_party/blink/public/mojom/devtools/console_message.mojom.h"
 
 namespace content {
 
@@ -37,18 +40,19 @@
 void AdAuctionPageData::AddAuctionSignalsWitnessForOrigin(
     const url::Origin& origin,
     const std::string& response) {
-  origin_auction_signals_map_[origin].insert(response);
+  header_direct_from_seller_signals_.AddWitnessForOrigin(
+      *GetDecoderFor(origin), origin, response,
+      base::BindOnce(
+          &AdAuctionPageData::OnAddAuctionSignalsWitnessForOriginCompleted,
+          base::Unretained(this)));
 }
 
-const std::set<std::string>& AdAuctionPageData::GetAuctionSignalsForOrigin(
-    const url::Origin& origin) const {
-  auto it = origin_auction_signals_map_.find(origin);
-  if (it == origin_auction_signals_map_.end()) {
-    static base::NoDestructor<std::set<std::string>> kEmptySet;
-    return *kEmptySet;
-  }
-
-  return it->second;
+void AdAuctionPageData::ParseAndFindAdAuctionSignals(
+    const url::Origin& origin,
+    const std::string& ad_slot,
+    HeaderDirectFromSellerSignals::ParseAndFindCompletedCallback callback) {
+  header_direct_from_seller_signals_.ParseAndFind(origin, ad_slot,
+                                                  std::move(callback));
 }
 
 void AdAuctionPageData::AddAuctionAdditionalBidsWitnessForOrigin(
@@ -119,6 +123,15 @@
   return decoder.get();
 }
 
+void AdAuctionPageData::OnAddAuctionSignalsWitnessForOriginCompleted(
+    std::vector<std::string> errors) {
+  for (const std::string& error : errors) {
+    devtools_instrumentation::LogWorkletMessage(
+        *static_cast<RenderFrameHostImpl*>(&page().GetMainDocument()),
+        blink::mojom::ConsoleMessageLevel::kError, error);
+  }
+}
+
 AdAuctionRequestContext::AdAuctionRequestContext(
     url::Origin seller,
     base::flat_map<url::Origin, std::vector<std::string>> group_names,
diff --git a/content/browser/interest_group/ad_auction_page_data.h b/content/browser/interest_group/ad_auction_page_data.h
index 1a009a1..002b7633d 100644
--- a/content/browser/interest_group/ad_auction_page_data.h
+++ b/content/browser/interest_group/ad_auction_page_data.h
@@ -13,6 +13,7 @@
 #include "base/containers/flat_map.h"
 #include "base/time/time.h"
 #include "base/uuid.h"
+#include "content/browser/interest_group/header_direct_from_seller_signals.h"
 #include "content/public/browser/page_user_data.h"
 #include "net/third_party/quiche/src/quiche/oblivious_http/oblivious_http_client.h"
 #include "url/origin.h"
@@ -54,8 +55,10 @@
   void AddAuctionSignalsWitnessForOrigin(const url::Origin& origin,
                                          const std::string& response);
 
-  const std::set<std::string>& GetAuctionSignalsForOrigin(
-      const url::Origin& origin) const;
+  void ParseAndFindAdAuctionSignals(
+      const url::Origin& origin,
+      const std::string& ad_slot,
+      HeaderDirectFromSellerSignals::ParseAndFindCompletedCallback callback);
 
   void AddAuctionAdditionalBidsWitnessForOrigin(
       const url::Origin& origin,
@@ -80,11 +83,17 @@
   friend class PageUserData<AdAuctionPageData>;
   PAGE_USER_DATA_KEY_DECL();
 
+  void OnAddAuctionSignalsWitnessForOriginCompleted(
+      std::vector<std::string> errors);
+
   std::map<url::Origin, std::set<std::string>> origin_auction_result_map_;
-  std::map<url::Origin, std::set<std::string>> origin_auction_signals_map_;
+  HeaderDirectFromSellerSignals header_direct_from_seller_signals_;
   std::map<url::Origin, std::map<std::string, std::vector<std::string>>>
       origin_nonce_additional_bids_map_;
   std::map<base::Uuid, AdAuctionRequestContext> context_map_;
+
+  // Must be declared last -- DataDecoder destruction cancels decoding
+  // completion callbacks.
   std::map<url::Origin, std::unique_ptr<data_decoder::DataDecoder>>
       decoder_map_;
 };
diff --git a/content/browser/interest_group/ad_auction_url_loader_interceptor_unittest.cc b/content/browser/interest_group/ad_auction_url_loader_interceptor_unittest.cc
index 108c5efa..d526c264 100644
--- a/content/browser/interest_group/ad_auction_url_loader_interceptor_unittest.cc
+++ b/content/browser/interest_group/ad_auction_url_loader_interceptor_unittest.cc
@@ -3,9 +3,11 @@
 // found in the LICENSE file.
 
 #include "base/base64url.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/test/bind.h"
 #include "base/test/scoped_feature_list.h"
 #include "content/browser/interest_group/ad_auction_page_data.h"
+#include "content/browser/interest_group/header_direct_from_seller_signals.h"
 #include "content/browser/loader/subresource_proxying_url_loader_service.h"
 #include "content/browser/web_package/prefetched_signed_exchange_cache.h"
 #include "content/public/browser/browser_context.h"
@@ -256,14 +258,27 @@
                                                                  response);
   }
 
-  const std::set<std::string>& GetAuctionSignalsForOrigin(
-      const url::Origin& origin) {
+  const scoped_refptr<HeaderDirectFromSellerSignals::Result>
+  ParseAndFindAdAuctionSignals(const url::Origin& origin,
+                               const std::string& ad_slot) {
     Page& page = web_contents()->GetPrimaryPage();
 
     AdAuctionPageData* ad_auction_page_data =
         PageUserData<AdAuctionPageData>::GetOrCreateForPage(page);
 
-    return ad_auction_page_data->GetAuctionSignalsForOrigin(origin);
+    scoped_refptr<HeaderDirectFromSellerSignals::Result> my_result;
+    base::RunLoop run_loop;
+    ad_auction_page_data->ParseAndFindAdAuctionSignals(
+        origin, ad_slot,
+        base::BindLambdaForTesting(
+            [&my_result, &run_loop](
+                scoped_refptr<HeaderDirectFromSellerSignals::Result> result) {
+              my_result = std::move(result);
+              run_loop.Quit();
+            }));
+    run_loop.Run();
+
+    return my_result;
   }
 
   std::vector<std::string> TakeAuctionAdditionalBidsForOriginAndNonce(
@@ -643,9 +658,10 @@
       url::Origin::Create(GURL("https://foo1.com")),
       base64Decode(kLegitimateAdAuctionResponse)));
 
-  const std::set<std::string>& signals =
-      GetAuctionSignalsForOrigin(url::Origin::Create(GURL("https://foo1.com")));
-  EXPECT_THAT(signals, ::testing::IsEmpty());
+  const scoped_refptr<HeaderDirectFromSellerSignals::Result> signals =
+      ParseAndFindAdAuctionSignals(
+          url::Origin::Create(GURL("https://foo1.com")), "slot1");
+  EXPECT_EQ(signals, nullptr);
 }
 
 TEST_F(AdAuctionURLLoaderInterceptorTest,
@@ -694,9 +710,10 @@
       url::Origin::Create(GURL("https://foo1.com")),
       base64Decode(kLegitimateAdAuctionResponse)));
 
-  const std::set<std::string>& signals =
-      GetAuctionSignalsForOrigin(url::Origin::Create(GURL("https://foo1.com")));
-  EXPECT_THAT(signals, ::testing::IsEmpty());
+  const scoped_refptr<HeaderDirectFromSellerSignals::Result> signals =
+      ParseAndFindAdAuctionSignals(
+          url::Origin::Create(GURL("https://foo1.com")), "slot1");
+  EXPECT_EQ(signals, nullptr);
 }
 
 TEST_F(AdAuctionURLLoaderInterceptorTest,
@@ -962,7 +979,7 @@
   pending_request->client->OnReceiveResponse(
       CreateResponseHead(
           /*ad_auction_result_header_value=*/kLegitimateAdAuctionResponse,
-          /*ad_auction_signals_header_value=*/"{}"),
+          /*ad_auction_signals_header_value=*/R"([{"adSlot":"slot1"}])"),
       /*body=*/{}, absl::nullopt);
   base::RunLoop().RunUntilIdle();
 
@@ -973,9 +990,10 @@
   EXPECT_TRUE(test_client.received_ad_auction_result_header());
   EXPECT_FALSE(test_client.received_ad_auction_signals_header());
 
-  const std::set<std::string>& signals =
-      GetAuctionSignalsForOrigin(url::Origin::Create(GURL("https://foo1.com")));
-  EXPECT_THAT(signals, ::testing::UnorderedElementsAre("{}"));
+  const scoped_refptr<HeaderDirectFromSellerSignals::Result> signals =
+      ParseAndFindAdAuctionSignals(
+          url::Origin::Create(GURL("https://foo1.com")), "slot1");
+  EXPECT_NE(signals, nullptr);
 }
 
 // Tests that the Ad-Auction-Signals header will be removed from the final
@@ -1028,9 +1046,10 @@
   EXPECT_TRUE(test_client.received_ad_auction_result_header());
   EXPECT_FALSE(test_client.received_ad_auction_signals_header());
 
-  const std::set<std::string>& signals =
-      GetAuctionSignalsForOrigin(url::Origin::Create(GURL("https://foo1.com")));
-  EXPECT_THAT(signals, ::testing::IsEmpty());
+  const scoped_refptr<HeaderDirectFromSellerSignals::Result> signals =
+      ParseAndFindAdAuctionSignals(
+          url::Origin::Create(GURL("https://foo1.com")), "slot1");
+  EXPECT_EQ(signals, nullptr);
 }
 
 TEST_F(AdAuctionURLLoaderInterceptorTest,
@@ -1076,9 +1095,10 @@
       /*body=*/{}, absl::nullopt);
   base::RunLoop().RunUntilIdle();
 
-  const std::set<std::string>& signals =
-      GetAuctionSignalsForOrigin(url::Origin::Create(GURL("https://foo1.com")));
-  EXPECT_THAT(signals, ::testing::IsEmpty());
+  const scoped_refptr<HeaderDirectFromSellerSignals::Result> signals =
+      ParseAndFindAdAuctionSignals(
+          url::Origin::Create(GURL("https://foo1.com")), "slot1");
+  EXPECT_EQ(signals, nullptr);
 }
 
 TEST_F(AdAuctionURLLoaderInterceptorTest,
@@ -1165,9 +1185,10 @@
   EXPECT_TRUE(test_client.received_ad_auction_result_header());
   EXPECT_FALSE(test_client.received_ad_auction_signals_header());
 
-  const std::set<std::string>& signals =
-      GetAuctionSignalsForOrigin(url::Origin::Create(GURL("https://foo1.com")));
-  EXPECT_THAT(signals, ::testing::IsEmpty());
+  const scoped_refptr<HeaderDirectFromSellerSignals::Result> signals =
+      ParseAndFindAdAuctionSignals(
+          url::Origin::Create(GURL("https://foo1.com")), "slot1");
+  EXPECT_EQ(signals, nullptr);
 }
 
 TEST_F(AdAuctionURLLoaderInterceptorTest, AdditionalBid) {
diff --git a/content/browser/interest_group/auction_runner.cc b/content/browser/interest_group/auction_runner.cc
index 89c42da..2db8b2a4 100644
--- a/content/browser/interest_group/auction_runner.cc
+++ b/content/browser/interest_group/auction_runner.cc
@@ -304,12 +304,9 @@
   }
 
   AdAuctionPageData* page_data = ad_auction_page_data_.get();
-  if (!page_data) {
-    // There's no page data attached so we can't find matching responses.
-    // There's no way the auction can proceed.
-    FailAuction(false);
-    return;
-  }
+  // The `page_data` shouldn't be null (since we create it before starting the
+  // auction), but if it is, the auction will just pass default-constructed
+  // signals to worklets.
 
   if (auction_id->is_main_auction()) {
     auction_.NotifyDirectFromSellerSignalsHeaderAdSlotConfig(
diff --git a/content/browser/interest_group/auction_runner_unittest.cc b/content/browser/interest_group/auction_runner_unittest.cc
index 504bc85..8b53514f 100644
--- a/content/browser/interest_group/auction_runner_unittest.cc
+++ b/content/browser/interest_group/auction_runner_unittest.cc
@@ -8800,16 +8800,12 @@
 
   EXPECT_EQ(InterestGroupKey(kBidder2, kBidder2Name), result_.winning_group_id);
   EXPECT_EQ(GURL("https://ad2.com/"), result_.ad_descriptor->url);
-  EXPECT_THAT(
-      result_.errors,
-      testing::UnorderedElementsAre(
-          testing::Eq(
-              "When looking for directFromSellerSignalsHeaderAdSlot adSlot1, "
-              "encountered response where top-level JSON value isn't an array: "
-              "Ad-Auction-Signals={\n  \"adSlot\": \"adSlot1\",\n  "
-              "\"sellerSignals\": 3\n}"),
-          testing::Eq("When looking for directFromSellerSignalsHeaderAdSlot "
-                      "adSlot1, failed to find a matching response.")));
+  // NOTE: The parsing error itself is reported separately, in the
+  // AdAuctionPageData.
+  EXPECT_THAT(result_.errors,
+              testing::UnorderedElementsAre(testing::Eq(
+                  "When looking for directFromSellerSignalsHeaderAdSlot "
+                  "adSlot1, failed to find a matching response.")));
 }
 
 // Trying to update auctionSignals which wasn't originally passed in as a
diff --git a/content/browser/interest_group/header_direct_from_seller_signals.cc b/content/browser/interest_group/header_direct_from_seller_signals.cc
index 1106bfd..31a5cbf 100644
--- a/content/browser/interest_group/header_direct_from_seller_signals.cc
+++ b/content/browser/interest_group/header_direct_from_seller_signals.cc
@@ -4,7 +4,9 @@
 
 #include "content/browser/interest_group/header_direct_from_seller_signals.h"
 
+#include <functional>
 #include <memory>
+#include <set>
 #include <string>
 #include <utility>
 #include <vector>
@@ -13,70 +15,149 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/json/json_string_value_serializer.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/stringprintf.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "services/data_decoder/public/cpp/data_decoder.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 #include "url/url_constants.h"
 
 namespace content {
 
-namespace {
+HeaderDirectFromSellerSignals::Result::Result() = default;
 
-// Searches a single Ad-Auction-Signals response header, `original_str` (parsed
-// as JSON into `result`) for the first encountered dictionary with the the
-// adSlot value equal to `ad_slot`, returning signals from that dictionary if
-// found, or null if none are found.
-//
-// Errors, if encountered, are appended to `errors`. Errors may be encountered
-// even if signals matching the `ad_slot` are still ultimately found and
-// returned.
-std::unique_ptr<HeaderDirectFromSellerSignals> MaybeFindAdSlotSignalsInResponse(
-    const data_decoder::DataDecoder::ValueOrError& result,
+HeaderDirectFromSellerSignals::Result::Result(
+    absl::optional<std::string> seller_signals,
+    absl::optional<std::string> auction_signals,
+    base::flat_map<url::Origin, std::string> per_buyer_signals)
+    : seller_signals_(std::move(seller_signals)),
+      auction_signals_(std::move(auction_signals)),
+      per_buyer_signals_(std::move(per_buyer_signals)) {}
+
+HeaderDirectFromSellerSignals::Result::~Result() = default;
+
+HeaderDirectFromSellerSignals::HeaderDirectFromSellerSignals() = default;
+
+HeaderDirectFromSellerSignals::~HeaderDirectFromSellerSignals() = default;
+
+// TODO(crbug.com/1462720): Add UMA for response size and for when processing
+// doesn't complete by destruction.
+void HeaderDirectFromSellerSignals::ParseAndFind(
+    const url::Origin& origin,
     const std::string& ad_slot,
-    const std::string& original_str,
+    ParseAndFindCompletedCallback callback) {
+  ParseAndFindCompletedInfo completed_info{
+      /*start_time=*/base::TimeTicks::Now(), /*origin=*/std::move(origin),
+      /*ad_slot=*/std::move(ad_slot), /*callback=*/std::move(callback)};
+  if (!add_witness_for_origin_completed_callback_) {
+    ParseAndFindCompleted(std::move(completed_info));
+    return;
+  }
+
+  // NOTE: If signals are received faster than the queue can process them, then
+  // `callback` will never be called. However, this seems unlikely, given that
+  // there should be only a small number of Ad-Auction-Signals header fetches
+  // per page. Note that each HeaderDirectFromSellerSignals is per-page.
+  parse_and_find_completed_infos_.push(std::move(completed_info));
+}
+
+void HeaderDirectFromSellerSignals::AddWitnessForOrigin(
+    data_decoder::DataDecoder& decoder,
+    const url::Origin& origin,
+    const std::string& response,
+    AddWitnessForOriginCompletedCallback callback) {
+  CHECK(callback);
+  unprocessed_header_responses_.emplace(origin, response);
+  if (!add_witness_for_origin_completed_callback_) {
+    add_witness_for_origin_completed_callback_ = std::move(callback);
+    DecodeNextResponse(decoder,
+                       /*errors=*/std::vector<std::string>());
+  }
+}
+
+HeaderDirectFromSellerSignals::ParseAndFindCompletedInfo::
+    ParseAndFindCompletedInfo(base::TimeTicks start_time,
+                              url::Origin origin,
+                              std::string ad_slot,
+                              ParseAndFindCompletedCallback callback)
+    : origin(std::move(origin)),
+      ad_slot(std::move(ad_slot)),
+      callback(std::move(callback)) {}
+
+HeaderDirectFromSellerSignals::ParseAndFindCompletedInfo::
+    ~ParseAndFindCompletedInfo() = default;
+
+HeaderDirectFromSellerSignals::ParseAndFindCompletedInfo::
+    ParseAndFindCompletedInfo(ParseAndFindCompletedInfo&&) = default;
+
+HeaderDirectFromSellerSignals::ParseAndFindCompletedInfo&
+HeaderDirectFromSellerSignals::ParseAndFindCompletedInfo::operator=(
+    HeaderDirectFromSellerSignals::ParseAndFindCompletedInfo&&) = default;
+
+void HeaderDirectFromSellerSignals::ParseAndFindCompleted(
+    ParseAndFindCompletedInfo info) const {
+  scoped_refptr<HeaderDirectFromSellerSignals::Result> result;
+  const auto it = results_.find(std::make_pair(info.origin, info.ad_slot));
+  if (it != results_.end()) {
+    result = it->second;
+  }
+  base::UmaHistogramTimes(
+      "Ads.InterestGroup.NetHeaderResponse.HeaderDirectFromSellerSignals."
+      "ParseAndFindMatchTime",
+      base::TimeTicks::Now() - info.start_time);
+  std::move(info.callback).Run(std::move(result));
+}
+
+void HeaderDirectFromSellerSignals::ProcessOneResponse(
+    const data_decoder::DataDecoder::ValueOrError& result,
+    const UnprocessedResponse& unprocessed_response,
     std::vector<std::string>& errors) {
   if (!result.has_value()) {
     errors.push_back(base::StringPrintf(
-        "When looking for directFromSellerSignalsHeaderAdSlot %s, encountered "
-        "invalid JSON: '%s' for Ad-Auction-Signals=%s",
-        ad_slot.c_str(), result.error().c_str(), original_str.c_str()));
-    return nullptr;
+        "directFromSellerSignalsHeaderAdSlot: encountered invalid JSON: '%s' "
+        "for Ad-Auction-Signals=%s",
+        result.error().c_str(), unprocessed_response.response_json.c_str()));
+    return;
   }
 
   const base::Value::List* maybe_list = result->GetIfList();
   if (!maybe_list) {
     errors.push_back(base::StringPrintf(
-        "When looking for directFromSellerSignalsHeaderAdSlot %s, encountered "
-        "response where top-level JSON value isn't an array: "
-        "Ad-Auction-Signals=%s",
-        ad_slot.c_str(), original_str.c_str()));
-    return nullptr;
+        "directFromSellerSignalsHeaderAdSlot: encountered response where "
+        "top-level JSON value isn't an array: Ad-Auction-Signals=%s",
+        unprocessed_response.response_json.c_str()));
+    return;
   }
 
+  std::set<std::string> ad_slots_from_response;
   for (const base::Value& list_item : *maybe_list) {
     const base::Value::Dict* maybe_dict = list_item.GetIfDict();
     if (!maybe_dict) {
-      errors.push_back(base::StringPrintf(
-          "When looking for directFromSellerSignalsHeaderAdSlot %s, "
-          "encountered non-dict list item: Ad-AuctionSignals=%s",
-          ad_slot.c_str(), original_str.c_str()));
+      errors.push_back(
+          base::StringPrintf("directFromSellerSignalsHeaderAdSlot: encountered "
+                             "non-dict list item: Ad-AuctionSignals=%s",
+                             unprocessed_response.response_json.c_str()));
       continue;
     }
 
     const std::string* maybe_ad_slot = maybe_dict->FindString("adSlot");
     if (!maybe_ad_slot) {
       errors.push_back(base::StringPrintf(
-          "When looking for directFromSellerSignalsHeaderAdSlot %s, "
-          "encountered dict without \"adSlot\" key: Ad-Auction-Signals=%s",
-          ad_slot.c_str(), original_str.c_str()));
+          "directFromSellerSignalsHeaderAdSlot: encountered dict without "
+          "\"adSlot\" key: Ad-Auction-Signals=%s",
+          unprocessed_response.response_json.c_str()));
       continue;
     }
 
-    if (*maybe_ad_slot != ad_slot) {
+    if (!ad_slots_from_response.insert(*maybe_ad_slot).second) {
+      errors.push_back(base::StringPrintf(
+          "directFromSellerSignalsHeaderAdSlot: encountered dict with "
+          "duplicate adSlot key \"%s\": Ad-Auction-Signals=%s",
+          maybe_ad_slot->c_str(), unprocessed_response.response_json.c_str()));
       continue;
     }
 
@@ -87,9 +168,9 @@
       JSONStringValueSerializer serializer(&seller_signals.value());
       if (!serializer.Serialize(*maybe_seller_signals)) {
         errors.push_back(base::StringPrintf(
-            "When looking for directFromSellerSignalsHeaderAdSlot %s, failed "
-            "to re-serialize sellerSignals: Ad-Auction-Signals=%s",
-            ad_slot.c_str(), original_str.c_str()));
+            "directFromSellerSignalsHeaderAdSlot: failed to re-serialize "
+            "sellerSignals: Ad-Auction-Signals=%s",
+            unprocessed_response.response_json.c_str()));
         seller_signals.reset();
       }
     }
@@ -102,14 +183,14 @@
       JSONStringValueSerializer serializer(&auction_signals.value());
       if (!serializer.Serialize(*maybe_auction_signals)) {
         errors.push_back(base::StringPrintf(
-            "When looking for directFromSellerSignalsHeaderAdSlot %s, failed "
-            "to re-serialize auctionSignals: Ad-Auction-Signals=%s",
-            ad_slot.c_str(), original_str.c_str()));
+            "directFromSellerSignalsHeaderAdSlot: failed to re-serialize "
+            "auctionSignals: Ad-Auction-Signals=%s",
+            unprocessed_response.response_json.c_str()));
         auction_signals.reset();
       }
     }
 
-    base::flat_map<url::Origin, std::string> per_buyer_signals;
+    std::vector<std::pair<url::Origin, std::string>> per_buyer_signals_vec;
     const base::Value::Dict* maybe_per_buyer_signals =
         maybe_dict->FindDict("perBuyerSignals");
     if (maybe_per_buyer_signals) {
@@ -122,134 +203,71 @@
         url::Origin origin = url::Origin::Create(GURL(item.first));
         if (origin.scheme() != url::kHttpsScheme) {
           errors.push_back(base::StringPrintf(
-              "When looking for directFromSellerSignalsHeaderAdSlot %s, "
-              "encountered non-https perBuyerSignals origin '%s': "
-              "Ad-Auction-Signals=%s",
-              ad_slot.c_str(), item.first.c_str(), original_str.c_str()));
+              "directFromSellerSignalsHeaderAdSlot: encountered non-https "
+              "perBuyerSignals origin '%s': Ad-Auction-Signals=%s",
+              item.first.c_str(), unprocessed_response.response_json.c_str()));
           continue;
         }
         std::string origin_signals;
         JSONStringValueSerializer serializer(&origin_signals);
         if (serializer.Serialize(item.second)) {
-          per_buyer_signals[origin] = origin_signals;
+          per_buyer_signals_vec.emplace_back(std::move(origin),
+                                             std::move(origin_signals));
         } else {
           errors.push_back(base::StringPrintf(
-              "When looking for directFromSellerSignalsHeaderAdSlot %s, failed "
-              "to re-serialize perBuyerSignals[%s]: Ad-Auction-Signals=%s",
-              ad_slot.c_str(), item.first.c_str(), original_str.c_str()));
+              "directFromSellerSignalsHeaderAdSlot: failed to re-serialize "
+              "perBuyerSignals[%s]: Ad-Auction-Signals=%s",
+              item.first.c_str(), unprocessed_response.response_json.c_str()));
         }
       }
     }
+    base::flat_map<url::Origin, std::string> per_buyer_signals(
+        std::move(per_buyer_signals_vec));
 
-    return std::make_unique<HeaderDirectFromSellerSignals>(
-        std::move(seller_signals), std::move(auction_signals),
-        std::move(per_buyer_signals));
+    results_[std::make_pair(unprocessed_response.origin, *maybe_ad_slot)] =
+        base::MakeRefCounted<HeaderDirectFromSellerSignals::Result>(
+            std::move(seller_signals), std::move(auction_signals),
+            std::move(per_buyer_signals));
   }
-
-  return nullptr;
 }
 
-std::string NoMatchError(std::string ad_slot) {
-  return base::StringPrintf(
-      "When looking for directFromSellerSignalsHeaderAdSlot %s, failed to "
-      "find a matching response.",
-      ad_slot.c_str());
-}
-
-// Searches for a signals dict whose adSlot value matches `ad_slot`, continuing
-// to the next response if no match is found.
-void OnJsonDecoded(
-    HeaderDirectFromSellerSignals::GetDecoderCallback get_decoder,
-    std::unique_ptr<const std::set<std::string>> responses,
-    std::set<std::string>::iterator it,
-    std::string ad_slot,
+void HeaderDirectFromSellerSignals::OnJsonDecoded(
+    data_decoder::DataDecoder& decoder,
+    UnprocessedResponse current_unprocessed_response,
     std::vector<std::string> errors,
-    HeaderDirectFromSellerSignals::CompletionCallback callback,
-    base::TimeTicks start_time,
     data_decoder::DataDecoder::ValueOrError result) {
-  std::unique_ptr<HeaderDirectFromSellerSignals> maybe_parsed =
-      MaybeFindAdSlotSignalsInResponse(result, ad_slot, *it, errors);
-  if (maybe_parsed) {
-    // Found a match.
-    base::UmaHistogramTimes(
-        "Ads.InterestGroup.NetHeaderResponse.HeaderDirectFromSellerSignals."
-        "ParseAndFindMatchTime",
-        base::TimeTicks::Now() - start_time);
-    std::move(callback).Run(std::move(maybe_parsed), std::move(errors));
+  ProcessOneResponse(result, current_unprocessed_response, errors);
+
+  if (unprocessed_header_responses_.empty()) {
+    std::move(add_witness_for_origin_completed_callback_)
+        .Run(std::move(errors));
+    while (!parse_and_find_completed_infos_.empty()) {
+      ParseAndFindCompleted(std::move(parse_and_find_completed_infos_.front()));
+      parse_and_find_completed_infos_.pop();
+    }
     return;
   }
 
-  ++it;
-  if (it == responses->end()) {
-    // No responses matched so add an error and return.
-    base::UmaHistogramTimes(
-        "Ads.InterestGroup.NetHeaderResponse.HeaderDirectFromSellerSignals."
-        "ParseAndFindMatchTime",
-        base::TimeTicks::Now() - start_time);
-    errors.push_back(NoMatchError(ad_slot));
-    std::move(callback).Run(std::make_unique<HeaderDirectFromSellerSignals>(),
-                            std::move(errors));
-    return;
-  }
-
-  // Decode the next response.
-  data_decoder::DataDecoder* maybe_decoder = get_decoder.Run();
-  if (!maybe_decoder) {
-    return;
-  }
-
-  maybe_decoder->ParseJson(
-      *it, base::BindOnce(&OnJsonDecoded, std::move(get_decoder),
-                          std::move(responses), it, std::move(ad_slot),
-                          std::move(errors), std::move(callback), start_time));
+  DecodeNextResponse(decoder, std::move(errors));
 }
 
-}  // namespace
+void HeaderDirectFromSellerSignals::DecodeNextResponse(
+    data_decoder::DataDecoder& decoder,
+    std::vector<std::string> errors) {
+  CHECK(!unprocessed_header_responses_.empty());
 
-HeaderDirectFromSellerSignals::HeaderDirectFromSellerSignals() = default;
+  UnprocessedResponse next_unprocessed_response =
+      std::move(unprocessed_header_responses_.front());
+  unprocessed_header_responses_.pop();
 
-HeaderDirectFromSellerSignals::~HeaderDirectFromSellerSignals() = default;
-
-// TODO(crbug.com/1462720): Add UMA for response size.
-/* static */
-void HeaderDirectFromSellerSignals::ParseAndFind(
-    GetDecoderCallback get_decoder,
-    const std::set<std::string>& responses,
-    std::string ad_slot,
-    CompletionCallback callback) {
-  std::vector<std::string> errors;
-  if (responses.empty()) {
-    base::UmaHistogramTimes(
-        "Ads.InterestGroup.NetHeaderResponse.HeaderDirectFromSellerSignals."
-        "ParseAndFindMatchTime",
-        base::Seconds(0));
-    errors.push_back(NoMatchError(ad_slot));
-    std::move(callback).Run(std::make_unique<HeaderDirectFromSellerSignals>(),
-                            std::move(errors));
-    return;
-  }
-
-  // The decoding is asynchronous, and it's possible that the original
-  // `responses` may have been destroyed before parsing completes; therefore, a
-  // copy is required.
-  auto my_responses = std::make_unique<const std::set<std::string>>(responses);
-  auto it = my_responses->begin();
-  data_decoder::DataDecoder* maybe_decoder = get_decoder.Run();
-  if (!maybe_decoder) {
-    return;
-  }
-  maybe_decoder->ParseJson(
-      *it, base::BindOnce(&OnJsonDecoded, get_decoder, std::move(my_responses),
-                          it, std::move(ad_slot), std::move(errors),
-                          std::move(callback), base::TimeTicks::Now()));
+  // NOTE: The class comment for HeaderDirectFromSellerSignals requires that the
+  // DataDecoder instances passed to AddWitnessForOrigin() be destroyed before
+  // this HeaderDirectFromSellerSignals, so base::Unretained() below is safe.
+  decoder.ParseJson(
+      next_unprocessed_response.response_json,
+      base::BindOnce(&HeaderDirectFromSellerSignals::OnJsonDecoded,
+                     base::Unretained(this), std::ref(decoder),
+                     next_unprocessed_response, std::move(errors)));
 }
 
-HeaderDirectFromSellerSignals::HeaderDirectFromSellerSignals(
-    absl::optional<std::string> seller_signals,
-    absl::optional<std::string> auction_signals,
-    base::flat_map<url::Origin, std::string> per_buyer_signals)
-    : seller_signals_(std::move(seller_signals)),
-      auction_signals_(std::move(auction_signals)),
-      per_buyer_signals_(std::move(per_buyer_signals)) {}
-
 }  // namespace content
diff --git a/content/browser/interest_group/header_direct_from_seller_signals.h b/content/browser/interest_group/header_direct_from_seller_signals.h
index 59c695e..4fe4355 100644
--- a/content/browser/interest_group/header_direct_from_seller_signals.h
+++ b/content/browser/interest_group/header_direct_from_seller_signals.h
@@ -5,103 +5,221 @@
 #ifndef CONTENT_BROWSER_INTEREST_GROUP_HEADER_DIRECT_FROM_SELLER_SIGNALS_H_
 #define CONTENT_BROWSER_INTEREST_GROUP_HEADER_DIRECT_FROM_SELLER_SIGNALS_H_
 
+#include <map>
 #include <memory>
-#include <set>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/containers/flat_map.h"
+#include "base/containers/queue.h"
 #include "base/functional/callback.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/memory/weak_ptr.h"
 #include "content/common/content_export.h"
+#include "services/data_decoder/public/cpp/data_decoder.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/origin.h"
 
-namespace data_decoder {
-class DataDecoder;
-}  // namespace data_decoder
-
 namespace content {
 
-// Parses the results of Ad-Auction-Signals header values, as returned by
-// AdAuctionPageData::GetAuctionSignalsForOrigin().
+// Parses the results of Ad-Auction-Signals header values, as provided to
+// AddWitnessForOrigin().
 //
-// Note that since JSON parsing is asynchronous, the parser *cannot* assume that
-// the Page, and therefore the AdAuctionPageData is still live after the JSON
-// callback completes.
+// NOTE: The DataDecoder instances passed to AddWitnessForOrigin() should be
+// destroyed before destroying this class.
 //
 // JSON format is described in https://github.com/WICG/turtledove/pull/695.
 class CONTENT_EXPORT HeaderDirectFromSellerSignals {
  public:
-  // Returns the result and a vector of errors (which will be empty if none
-  // occurred). The HeaderDirectFromSellerSignals pointer will *never* be
-  // null -- if no match was found, a default-constructed
-  // HeaderDirectFromSellerSignals will be passed. Note that a match may
-  // be found even if errors occur (for instance, if invalid responses are
-  // skipped before a matching response was found).
-  using CompletionCallback =
-      base::OnceCallback<void(std::unique_ptr<HeaderDirectFromSellerSignals>,
-                              std::vector<std::string>)>;
+  // Signals for a given origin, ad_slot tuple -- if no match was found, a
+  // default-constructed Result is returned.
+  //
+  // RefCounted so that reporting worklet functions may continue to access these
+  // data, even after navigating away to another page (AdAuctionPageData owns
+  // HeaderDirectFromSellerSignals).
+  class CONTENT_EXPORT Result : public base::RefCounted<Result> {
+   public:
+    Result();
 
-  // This may return null.
-  using GetDecoderCallback =
-      base::RepeatingCallback<data_decoder::DataDecoder*()>;
+    Result(absl::optional<std::string> seller_signals,
+           absl::optional<std::string> auction_signals,
+           base::flat_map<url::Origin, std::string> per_buyer_signals);
 
-  // The default constructor provides null / empty signals when no ad slot was
-  // specified on the page.
+    Result(Result&) = delete;
+    Result& operator=(Result&) = delete;
+
+    // Results of the `sellerSignals` JSON dictionary field.
+    const absl::optional<std::string>& seller_signals() const {
+      return seller_signals_;
+    }
+
+    // Results of the `auctionSignals` JSON dictionary field.
+    const absl::optional<std::string>& auction_signals() const {
+      return auction_signals_;
+    }
+
+    // Results of the `perBuyerSignals` JSON dictionary field.
+    const base::flat_map<url::Origin, std::string>& per_buyer_signals() const {
+      return per_buyer_signals_;
+    }
+
+   private:
+    friend class base::RefCounted<Result>;
+    ~Result();
+
+    const absl::optional<std::string> seller_signals_;
+    const absl::optional<std::string> auction_signals_;
+    const base::flat_map<url::Origin, std::string> per_buyer_signals_;
+  };
+
+  // Returns the result. The HeaderDirectFromSellerSignals::Result pointer will
+  // be null if no match was found.
+  using ParseAndFindCompletedCallback = base::OnceCallback<void(
+      scoped_refptr<HeaderDirectFromSellerSignals::Result>)>;
+
+  // Called when AddWitnessForOrigin() completes, passing a vector of error
+  // strings that occurred during JSON parsing, if any.
+  using AddWitnessForOriginCompletedCallback =
+      base::OnceCallback<void(std::vector<std::string>)>;
+
   HeaderDirectFromSellerSignals();
-
-  // Public for std::make_unique.
-  HeaderDirectFromSellerSignals(
-      absl::optional<std::string> seller_signals,
-      absl::optional<std::string> auction_signals,
-      base::flat_map<url::Origin, std::string> per_buyer_signals);
-
   ~HeaderDirectFromSellerSignals();
 
   HeaderDirectFromSellerSignals(HeaderDirectFromSellerSignals&) = delete;
   HeaderDirectFromSellerSignals& operator=(HeaderDirectFromSellerSignals&) =
       delete;
 
-  // Asynchronously parses the JSON responses in `responses` -- each of which
-  // should represent an array of dictionaries -- until such a dictionary is
-  // found that matches the adSlot specified by `ad_slot`. Results are provided
-  // to `callback` -- if no match is found, a default-constructed
-  // HeaderDirectFromSellerSignals will be passed.
+  // Asynchronously parses the captured JSON responses -- each of which should
+  // represent an array of dictionaries -- until such a dictionary is found that
+  // matches the adSlot specified by `ad_slot` from the origin `origin`. Results
+  // are provided to `callback` -- if no match is found, null will be passed.
   //
-  // `responses` should be the return value of:
+  // NOTE: No decoder need be passed since parsing of received JSON responses
+  // starts as soon as they are received, in AddWitnessForOrigin() --
+  // ParseAndFind() waits until such parsing is done, if it hasn't already
+  // completed.
   //
-  //  const std::set<std::string>& GetAuctionSignalsForOrigin(
-  //      const url::Origin& origin) const;
+  // NOTE: This method may return synchronously if all received responses have
+  // already been parsed before the ParseAndFind() call begins.
   //
-  // That is, they are the signals returned only from a single (seller) origin.
-  //
-  // If `get_decoder` ever returns null, `callback` will not be invoked.
-  static void ParseAndFind(GetDecoderCallback get_decoder,
-                           const std::set<std::string>& responses,
-                           std::string ad_slot,
-                           CompletionCallback callback);
+  // NOTE: `callback` will not be invoked if a DataDecoder passed to
+  // AddWitnessForOrigin() is destroyed before parsing using that decoder
+  // completes.
+  void ParseAndFind(const url::Origin& origin,
+                    const std::string& ad_slot,
+                    ParseAndFindCompletedCallback callback);
 
-  // Results of the `sellerSignals` JSON dictionary field.
-  const absl::optional<std::string>& seller_signals() const {
-    return seller_signals_;
-  }
-
-  // Results of the `auctionSignals` JSON dictionary field.
-  const absl::optional<std::string>& auction_signals() const {
-    return auction_signals_;
-  }
-
-  // Results of the `perBuyerSignals` JSON dictionary field.
-  const base::flat_map<url::Origin, std::string>& per_buyer_signals() const {
-    return per_buyer_signals_;
-  }
+  // Called every time an Ad-Auction-Signals response `response` is captured,
+  // where `origin` is origin that served the response.
+  //
+  // NOTE: `callback` will not be invoked if DataDecoder is destroyed during
+  // processing. Also, if multiple AddWitnessForOrigin() calls are in-flight at
+  // the same time, only the `callback` for the first call will be invoked.
+  void AddWitnessForOrigin(data_decoder::DataDecoder& decoder,
+                           const url::Origin& origin,
+                           const std::string& response,
+                           AddWitnessForOriginCompletedCallback callback);
 
  private:
-  const absl::optional<std::string> seller_signals_;
+  // Represents signals origin, ad_slot.
+  using ResultsKey = std::pair<url::Origin, std::string>;
 
-  const absl::optional<std::string> auction_signals_;
+  // A single Ad-Auction-Signals response captured from `origin`.
+  struct UnprocessedResponse {
+    // The origin that served the Ad-Auction-Signals response `response`.
+    url::Origin origin;
 
-  const base::flat_map<url::Origin, std::string> per_buyer_signals_;
+    // The Ad-Auction-Signals response served by `origin`.
+    std::string response_json;
+  };
+
+  // Information from ParseAndFind() calls used by ParseAndFindCompleted.
+  struct ParseAndFindCompletedInfo {
+    ParseAndFindCompletedInfo(base::TimeTicks start_time,
+                              url::Origin origin,
+                              std::string ad_slot,
+                              ParseAndFindCompletedCallback callback);
+    ~ParseAndFindCompletedInfo();
+
+    ParseAndFindCompletedInfo(ParseAndFindCompletedInfo&&);
+    ParseAndFindCompletedInfo& operator=(ParseAndFindCompletedInfo&&);
+
+    // The time ParseAndFind() was called.
+    base::TimeTicks start_time;
+
+    // The origin that responded with the signals.
+    url::Origin origin;
+
+    // The adSlot key to find.
+    std::string ad_slot;
+
+    // The completion callback passed to ParseAndFind().
+    ParseAndFindCompletedCallback callback;
+  };
+
+  // Called for each ParseAndFind() call when all all `unprocessed_responses_`
+  // have been parsed and results have been placed into `results_`.
+  void ParseAndFindCompleted(ParseAndFindCompletedInfo info) const;
+
+  // Processes a single Ad-Auction-Signals response header,
+  // `unprocessed_response` (parsed as JSON into `result`), updating `results_`
+  // as valid signals are encountered.
+  //
+  // Errors, if encountered, are appended to `errors`. Errors may be
+  // encountered even if some valid signals are added to `results_`.
+  void ProcessOneResponse(const data_decoder::DataDecoder::ValueOrError& result,
+                          const UnprocessedResponse& unprocessed_response,
+                          std::vector<std::string>& errors);
+
+  // Calls ProcessOneResponse(), runs callbacks on completion, and otherwise
+  // calls DecodeNextResponse() to continue parsing the next
+  // UnprocessedResponse, if there is one.
+  void OnJsonDecoded(data_decoder::DataDecoder& decoder,
+                     UnprocessedResponse current_unprocessed_response,
+                     std::vector<std::string> errors,
+                     data_decoder::DataDecoder::ValueOrError result);
+
+  // Start decoding the next UnprocessedResponse in `unprocessed_responses_`
+  // (CHECK()s that at least one is there). OnJsonDecoded() will be called when
+  // decoding completes.
+  void DecodeNextResponse(data_decoder::DataDecoder& decoder,
+                          std::vector<std::string> errors);
+
+  // A raw queue of responses added by AddAuctionSignalsWitnessForOrigin(). Upon
+  // insertion into this queue, the unprocessed raw responses are removed and
+  // parsed as JSON, and the results are put in the `results_` map, potentially
+  // overwriting values for keys in that map.
+  //
+  // NOTE: The queue *may* be empty even though processing is still in-process
+  // (since entries that are being processed are first removed from the queue)!
+  // To determine if responses are already being processed, check if
+  // `add_witness_for_origin_completed_callback_` is non-null.
+  base::queue<UnprocessedResponse> unprocessed_header_responses_;
+
+  // Callback for AddWitnessForOrigin() called after processing of the remaining
+  // `unprocessed_header_responses_` completes.
+  //
+  // Will be a non-null callback *iff* processing is currently in process.
+  AddWitnessForOriginCompletedCallback
+      add_witness_for_origin_completed_callback_;
+
+  // Parameters for ParseAndFindCompleted() waiting on on processing the
+  // remaining responses in `unprocessed_header_responses_`. This allows only
+  // having a single concurrent processor of `unprocessed_header_responses_`,
+  // ensuring that processing completes in the correct order.
+  base::queue<ParseAndFindCompletedInfo> parse_and_find_completed_infos_;
+
+  // Processed responses, keyed by the composite key origin, ad_slot. The
+  // unprocessed responses are processed in a manner such that the most recent
+  // response value for a given key overwrites older values.
+  //
+  // std::map is chosen over base::flat_map since the latter doesn't support
+  // efficient bulk insertion after construction with the desired overwriting
+  // behavior.
+  std::map<ResultsKey, scoped_refptr<HeaderDirectFromSellerSignals::Result>>
+      results_;
 };
 
 }  // namespace content
diff --git a/content/browser/interest_group/header_direct_from_seller_signals_unittest.cc b/content/browser/interest_group/header_direct_from_seller_signals_unittest.cc
index 9623753e..5d96006 100644
--- a/content/browser/interest_group/header_direct_from_seller_signals_unittest.cc
+++ b/content/browser/interest_group/header_direct_from_seller_signals_unittest.cc
@@ -6,10 +6,12 @@
 
 #include <stddef.h>
 
+#include <algorithm>
 #include <memory>
 #include <string>
 #include <vector>
 
+#include "base/memory/scoped_refptr.h"
 #include "base/run_loop.h"
 #include "base/test/bind.h"
 #include "base/test/task_environment.h"
@@ -32,64 +34,70 @@
 using ::testing::UnorderedElementsAre;
 using ::testing::UnorderedElementsAreArray;
 
+constexpr char kOriginStringA[] = "a.test";
+constexpr char kOriginStringB[] = "b.test";
+
 class HeaderDirectFromSellerSignalsTest : public ::testing::Test {
  protected:
-  std::unique_ptr<HeaderDirectFromSellerSignals> ParseAndFind(
-      const std::set<std::string>& responses,
-      std::string ad_slot) {
-    std::unique_ptr<HeaderDirectFromSellerSignals> result;
+  scoped_refptr<HeaderDirectFromSellerSignals::Result> ParseAndFind(
+      const url::Origin& origin,
+      const std::string& ad_slot) {
+    // Synchronously look up the signals for a given `origin`, `ad_slot` tuple.
+    scoped_refptr<HeaderDirectFromSellerSignals::Result> my_result;
     base::RunLoop run_loop;
-    HeaderDirectFromSellerSignals::ParseAndFind(
-        GetDataDecoderCallback(), responses, std::move(ad_slot),
+    header_direct_from_seller_signals_.ParseAndFind(
+        origin, ad_slot,
         base::BindLambdaForTesting(
-            [this, &result, &run_loop](
-                std::unique_ptr<HeaderDirectFromSellerSignals> parsed,
-                std::vector<std::string> errors) {
-              result = std::move(parsed);
-              errors_ = std::move(errors);
+            [&my_result, &run_loop](
+                scoped_refptr<HeaderDirectFromSellerSignals::Result> result) {
+              my_result = std::move(result);
               run_loop.Quit();
             }));
     run_loop.Run();
-    return result;
+    return my_result;
   }
 
-  data_decoder::DataDecoder* GetDataDecoder() {
-    if (fail_get_data_decoder_on_0_.has_value()) {
-      if (*fail_get_data_decoder_on_0_ == 0) {
-        return nullptr;
-      }
-      --*fail_get_data_decoder_on_0_;
+  // Synchronously add a series of witnesses for an origin `origin`, returning a
+  // vector of all error strings returned.
+  std::vector<std::string> AddWitnessesForOrigin(
+      const url::Origin& origin,
+      const std::vector<std::string>& responses) {
+    std::vector<std::string> all_errors;
+    for (const std::string& response : responses) {
+      base::RunLoop run_loop;
+      header_direct_from_seller_signals_.AddWitnessForOrigin(
+          data_decoder_, origin, response,
+          base::BindLambdaForTesting(
+              [&all_errors, &run_loop](std::vector<std::string> errors) {
+                all_errors.reserve(all_errors.size() + errors.size());
+                std::move(std::begin(errors), std::end(errors),
+                          std::back_inserter(all_errors));
+                run_loop.Quit();
+              }));
+      run_loop.Run();
     }
-    return &data_decoder_;
+    return all_errors;
   }
 
-  HeaderDirectFromSellerSignals::GetDecoderCallback GetDataDecoderCallback() {
-    return base::BindRepeating(
-        &HeaderDirectFromSellerSignalsTest::GetDataDecoder,
-        base::Unretained(this));
-  }
+  const url::Origin kOriginA = url::Origin::Create(GURL(kOriginStringA));
+  const url::Origin kOriginB = url::Origin::Create(GURL(kOriginStringB));
 
+  HeaderDirectFromSellerSignals header_direct_from_seller_signals_;
   base::test::TaskEnvironment task_environment_;
   data_decoder::test::InProcessDataDecoder data_decoder_provider_;
   data_decoder::DataDecoder data_decoder_;
-
-  // If set, it wll count down to 0 at which point the next call to
-  // GetDataDecoder() will return nullptr.
-  absl::optional<int> fail_get_data_decoder_on_0_;
-
-  std::vector<std::string> errors_;
 };
 
 TEST_F(HeaderDirectFromSellerSignalsTest, DefaultConstruct) {
-  HeaderDirectFromSellerSignals signals;
+  auto signals = base::MakeRefCounted<HeaderDirectFromSellerSignals::Result>();
 
-  EXPECT_EQ(signals.seller_signals(), absl::nullopt);
-  EXPECT_EQ(signals.auction_signals(), absl::nullopt);
-  EXPECT_THAT(signals.per_buyer_signals(), IsEmpty());
+  EXPECT_EQ(signals->seller_signals(), absl::nullopt);
+  EXPECT_EQ(signals->auction_signals(), absl::nullopt);
+  EXPECT_THAT(signals->per_buyer_signals(), IsEmpty());
 }
 
 TEST_F(HeaderDirectFromSellerSignalsTest, Valid) {
-  const std::set<std::string> kResponses = {R"([{
+  const std::vector<std::string> kResponses = {R"([{
         "adSlot": "slot1",
         "sellerSignals": ["signals", "for", "seller"],
         "auctionSignals": 42,
@@ -103,13 +111,16 @@
         "adSlot": "slot2",
         "sellerSignals": ["signals2", "for", "seller"]
       }])",
-                                            R"([{
+                                               R"([{
         "adSlot": "slot3",
         "auctionSignals": null
       }])"};
+  std::vector<std::string> errors = AddWitnessesForOrigin(kOriginA, kResponses);
+  EXPECT_THAT(errors, IsEmpty());
 
-  std::unique_ptr<HeaderDirectFromSellerSignals> parsed1 =
-      ParseAndFind(kResponses, "slot1");
+  scoped_refptr<HeaderDirectFromSellerSignals::Result> parsed1 =
+      ParseAndFind(kOriginA, "slot1");
+  ASSERT_NE(parsed1, nullptr);
   EXPECT_EQ(parsed1->seller_signals(), "[\"signals\",\"for\",\"seller\"]");
   EXPECT_EQ(parsed1->auction_signals(), "42");
   EXPECT_THAT(
@@ -118,101 +129,104 @@
           Pair(url::Origin::Create(GURL("https://buyer1.com")), "false"),
           Pair(url::Origin::Create(GURL("https://buyer2.com")),
                R"({"an":"object"})")));
-  EXPECT_THAT(errors_, IsEmpty());
 
-  std::unique_ptr<HeaderDirectFromSellerSignals> parsed2 =
-      ParseAndFind(kResponses, "slot2");
+  scoped_refptr<HeaderDirectFromSellerSignals::Result> parsed2 =
+      ParseAndFind(kOriginA, "slot2");
+  ASSERT_NE(parsed2, nullptr);
   EXPECT_EQ(parsed2->seller_signals(), "[\"signals2\",\"for\",\"seller\"]");
   EXPECT_EQ(parsed2->auction_signals(), absl::nullopt);
   EXPECT_THAT(parsed2->per_buyer_signals(), IsEmpty());
-  EXPECT_THAT(errors_, IsEmpty());
 
-  std::unique_ptr<HeaderDirectFromSellerSignals> parsed3 =
-      ParseAndFind(kResponses, "slot3");
+  scoped_refptr<HeaderDirectFromSellerSignals::Result> parsed3 =
+      ParseAndFind(kOriginA, "slot3");
+  ASSERT_NE(parsed3, nullptr);
   EXPECT_EQ(parsed3->seller_signals(), absl::nullopt);
   EXPECT_EQ(parsed3->auction_signals(), "null");
   EXPECT_THAT(parsed3->per_buyer_signals(), IsEmpty());
-  EXPECT_THAT(errors_, IsEmpty());
 }
 
-TEST_F(HeaderDirectFromSellerSignalsTest, GetDataDecoderFailure) {
-  for (int inject_failure_on_call : {0, 1}) {
-    fail_get_data_decoder_on_0_ = inject_failure_on_call;
-    const std::set<std::string> kResponses = {R"([{
-          "adSlot": "slot1",
-          "auctionSignals": 42
-        }, {
-          "adSlot": "slot2",
-          "sellerSignals": ["signals2", "for", "seller"]
-        }])",
-                                              R"([{
-          "adSlot": "slot3",
-          "auctionSignals": null
-        }])"};
+TEST_F(HeaderDirectFromSellerSignalsTest, TwoOrigins) {
+  // Intentionally use the same adSlot -- signals from separate origins should
+  // be held separately.
+  constexpr char kResponseA[] = R"([{
+    "adSlot": "slot1",
+    "sellerSignals": "abc"
+  }])";
+  constexpr char kResponseB[] = R"([{
+    "adSlot": "slot1",
+    "sellerSignals": "def"
+  }])";
 
-    HeaderDirectFromSellerSignals::ParseAndFind(
-        GetDataDecoderCallback(), kResponses, "slot3",
-        base::BindOnce([](std::unique_ptr<HeaderDirectFromSellerSignals> parsed,
-                          std::vector<std::string> errors) {
-          ADD_FAILURE() << "Should not be called";
-        }));
-    task_environment_.RunUntilIdle();
-  }
+  AddWitnessesForOrigin(kOriginA, {kResponseA});
+  AddWitnessesForOrigin(kOriginB, {kResponseB});
+
+  scoped_refptr<HeaderDirectFromSellerSignals::Result> result_a =
+      ParseAndFind(kOriginA, "slot1");
+  scoped_refptr<HeaderDirectFromSellerSignals::Result> result_b =
+      ParseAndFind(kOriginB, "slot1");
+
+  ASSERT_NE(result_a, nullptr);
+  EXPECT_EQ(result_a->seller_signals(), "\"abc\"");
+
+  ASSERT_NE(result_b, nullptr);
+  EXPECT_EQ(result_b->seller_signals(), "\"def\"");
 }
 
-TEST_F(HeaderDirectFromSellerSignalsTest, Invalid) {
+TEST_F(HeaderDirectFromSellerSignalsTest, InvalidAndOrNotFound) {
   struct {
-    const std::set<std::string> responses;
+    const std::vector<std::string> responses;
     const std::vector<testing::Matcher<std::string>> errors;
   } kCases[] = {
       {{R"(This is not JSON)"},
        {MatchesRegex(
-            // NOTE: the JSON error varies by platform (Android uses a Java JSON
-            // parser), so use a regex to ignore the actual error message.
-            "When looking for directFromSellerSignalsHeaderAdSlot slot1, "
-            "encountered invalid JSON: '.+' for Ad-Auction-Signals=This is not "
-            "JSON"),
-        Eq("When looking for directFromSellerSignalsHeaderAdSlot slot1, failed "
-           "to find a matching response.")}},
+           // NOTE: the JSON error varies by platform (Android uses a Java JSON
+           // parser), so use a regex to ignore the actual error message.
+           "directFromSellerSignalsHeaderAdSlot: encountered invalid JSON: "
+           "'.+' for Ad-Auction-Signals=This is not JSON")}},
       {{R"({"Not": "a list"})"},
-       {Eq("When looking for directFromSellerSignalsHeaderAdSlot slot1, "
-           "encountered response where top-level JSON value isn't an array: "
-           "Ad-Auction-Signals={\"Not\": \"a list\"}"),
-        Eq("When looking for directFromSellerSignalsHeaderAdSlot slot1, failed "
-           "to find a matching response.")}},
+       {Eq("directFromSellerSignalsHeaderAdSlot: encountered response where "
+           "top-level JSON value isn't an array: Ad-Auction-Signals={\"Not\": "
+           "\"a list\"}")}},
       {{R"(["Not a dict"])"},
-       {Eq("When looking for directFromSellerSignalsHeaderAdSlot slot1, "
-           "encountered non-dict list item: Ad-AuctionSignals=[\"Not a "
-           "dict\"]"),
-        Eq("When looking for directFromSellerSignalsHeaderAdSlot slot1, failed "
-           "to find a matching response.")}},
+       {Eq("directFromSellerSignalsHeaderAdSlot: encountered non-dict list "
+           "item: Ad-AuctionSignals=[\"Not a dict\"]")}},
       {{R"([{"no":"adSlot"}])"},
-       {Eq("When looking for directFromSellerSignalsHeaderAdSlot slot1, "
-           "encountered dict without \"adSlot\" key: "
-           "Ad-Auction-Signals=[{\"no\":\"adSlot\"}]"),
-        Eq("When looking for directFromSellerSignalsHeaderAdSlot slot1, failed "
-           "to find a matching response.")}},
-      {{R"([{"adSlot":"slot2", "sellerSignals":3}])"},
-       {Eq("When looking for directFromSellerSignalsHeaderAdSlot slot1, failed "
-           "to find a matching response.")}},
-      {{},
-       {Eq("When looking for directFromSellerSignalsHeaderAdSlot slot1, failed "
-           "to find a matching response.")}}};
+       {Eq("directFromSellerSignalsHeaderAdSlot: encountered dict without "
+           "\"adSlot\" key: Ad-Auction-Signals=[{\"no\":\"adSlot\"}]")}},
+      {{R"([{"no":"adSlot"}, "not a dict"])"},
+       {Eq("directFromSellerSignalsHeaderAdSlot: encountered dict without "
+           "\"adSlot\" key: Ad-Auction-Signals=[{\"no\":\"adSlot\"}, \"not a "
+           "dict\"]"),
+        Eq("directFromSellerSignalsHeaderAdSlot: encountered non-dict list "
+           "item: Ad-AuctionSignals=[{\"no\":\"adSlot\"}, \"not a dict\"]")}},
+      {{R"([{"no":"adSlot"}])", R"(["not a dict"])"},
+       {Eq("directFromSellerSignalsHeaderAdSlot: encountered dict without "
+           "\"adSlot\" key: Ad-Auction-Signals=[{\"no\":\"adSlot\"}]"),
+        Eq("directFromSellerSignalsHeaderAdSlot: encountered non-dict list "
+           "item: Ad-AuctionSignals=[\"not a dict\"]")}},
+      {{R"([{"adSlot":"slot2", "sellerSignals":3}])"}, {}},
+      {{R"([{"adSlot":"slot2", "sellerSignals":3}])",
+        R"([{"adSlot":"slot3", "sellerSignals":4}])"},
+       {}},
+      {{R"([{"adSlot":"slot2", "sellerSignals":3},
+            {"adSlot":"slot3", "sellerSignals":4}])"},
+       {}},
+      {{}, {}}};
 
   for (const auto& test_case : kCases) {
     SCOPED_TRACE(testing::PrintToString(test_case.responses));
-    std::unique_ptr<HeaderDirectFromSellerSignals> parsed =
-        ParseAndFind(test_case.responses, "slot1");
-    EXPECT_EQ(parsed->seller_signals(), absl::nullopt);
-    EXPECT_EQ(parsed->auction_signals(), absl::nullopt);
-    EXPECT_THAT(parsed->per_buyer_signals(), IsEmpty());
-    EXPECT_THAT(errors_, UnorderedElementsAreArray(test_case.errors));
+    std::vector<std::string> errors =
+        AddWitnessesForOrigin(kOriginA, test_case.responses);
+    EXPECT_THAT(errors, UnorderedElementsAreArray(test_case.errors));
+    scoped_refptr<HeaderDirectFromSellerSignals::Result> parsed =
+        ParseAndFind(kOriginA, "slot1");
+    EXPECT_EQ(parsed, nullptr);
   }
 }
 
 TEST_F(HeaderDirectFromSellerSignalsTest, ContinueOnInvalid) {
-  const std::set<std::string> kResponses = {R"(This is not JSON)",
-                                            R"([
+  const std::vector<std::string> kResponses = {R"(This is not JSON)",
+                                               R"([
     "Not a dict", {
       "adSlot": "slot2",
       "sellerSignals": "other signals"
@@ -223,41 +237,309 @@
         "badorigin": 1,
         "https://valid.com": 2
       }
+    }, {
+      "adSlot": "slot1",
+      "sellerSignals": "dupe slot1, should error and be skipped"
     }
   ])"};
 
-  std::unique_ptr<HeaderDirectFromSellerSignals> parsed =
-      ParseAndFind(kResponses, "slot1");
-  EXPECT_EQ(parsed->seller_signals(), R"("signals")");
-  EXPECT_EQ(parsed->auction_signals(), absl::nullopt);
-  EXPECT_THAT(parsed->per_buyer_signals(),
-              UnorderedElementsAre(
-                  Pair(url::Origin::Create(GURL("https://valid.com")), "2")));
+  std::vector<std::string> errors = AddWitnessesForOrigin(kOriginA, kResponses);
   EXPECT_THAT(
-      errors_,
+      errors,
       UnorderedElementsAre(
           MatchesRegex(
               // NOTE: the JSON error varies by platform (Android uses a Java
               // JSON parser), so use a regex to ignore the actual error
               // message.
-              "When looking for directFromSellerSignalsHeaderAdSlot slot1, "
-              "encountered invalid JSON: '.+' for Ad-Auction-Signals=This is "
-              "not JSON"),
-          Eq("When looking for directFromSellerSignalsHeaderAdSlot slot1, "
-             "encountered non-dict list item: Ad-AuctionSignals=[\n    \"Not a "
-             "dict\", {\n      \"adSlot\": \"slot2\",\n      "
+              "directFromSellerSignalsHeaderAdSlot: encountered invalid JSON: "
+              "'.+' for Ad-Auction-Signals=This is not JSON"),
+          Eq("directFromSellerSignalsHeaderAdSlot: encountered non-dict list "
+             "item: Ad-AuctionSignals=[\n    \"Not a dict\", {\n      "
+             "\"adSlot\": \"slot2\",\n      \"sellerSignals\": \"other "
+             "signals\"\n    }, {\n      \"adSlot\": \"slot1\",\n      "
+             "\"sellerSignals\": \"signals\",\n      \"perBuyerSignals\": {\n  "
+             "      \"badorigin\": 1,\n        \"https://valid.com\": 2\n      "
+             "}\n    }, {\n      \"adSlot\": \"slot1\",\n      "
+             "\"sellerSignals\": \"dupe slot1, should error and be skipped\"\n "
+             "   }\n  ]"),
+          Eq("directFromSellerSignalsHeaderAdSlot: encountered non-https "
+             "perBuyerSignals origin 'badorigin': Ad-Auction-Signals=[\n    "
+             "\"Not a dict\", {\n      \"adSlot\": \"slot2\",\n      "
              "\"sellerSignals\": \"other signals\"\n    }, {\n      "
              "\"adSlot\": \"slot1\",\n      \"sellerSignals\": \"signals\",\n  "
              "    \"perBuyerSignals\": {\n        \"badorigin\": 1,\n        "
-             "\"https://valid.com\": 2\n      }\n    }\n  ]"),
-          Eq("When looking for directFromSellerSignalsHeaderAdSlot slot1, "
-             "encountered non-https perBuyerSignals origin 'badorigin': "
-             "Ad-Auction-Signals=[\n    \"Not a dict\", {\n      \"adSlot\": "
-             "\"slot2\",\n      \"sellerSignals\": \"other signals\"\n    }, "
-             "{\n      \"adSlot\": \"slot1\",\n      \"sellerSignals\": "
-             "\"signals\",\n      \"perBuyerSignals\": {\n        "
-             "\"badorigin\": 1,\n        \"https://valid.com\": 2\n      }\n   "
-             " }\n  ]")));
+             "\"https://valid.com\": 2\n      }\n    }, {\n      \"adSlot\": "
+             "\"slot1\",\n      \"sellerSignals\": \"dupe slot1, should error "
+             "and be skipped\"\n    }\n  ]"),
+          Eq("directFromSellerSignalsHeaderAdSlot: encountered dict with "
+             "duplicate adSlot key \"slot1\": Ad-Auction-Signals=[\n    \"Not "
+             "a dict\", {\n      \"adSlot\": \"slot2\",\n      "
+             "\"sellerSignals\": \"other signals\"\n    }, {\n      "
+             "\"adSlot\": \"slot1\",\n      \"sellerSignals\": \"signals\",\n  "
+             "    \"perBuyerSignals\": {\n        \"badorigin\": 1,\n        "
+             "\"https://valid.com\": 2\n      }\n    }, {\n      \"adSlot\": "
+             "\"slot1\",\n      \"sellerSignals\": \"dupe slot1, should error "
+             "and be skipped\"\n    }\n  ]")));
+  scoped_refptr<HeaderDirectFromSellerSignals::Result> parsed =
+      ParseAndFind(kOriginA, "slot1");
+  ASSERT_NE(parsed, nullptr);
+  EXPECT_EQ(parsed->seller_signals(), R"("signals")");
+  EXPECT_EQ(parsed->auction_signals(), absl::nullopt);
+  EXPECT_THAT(parsed->per_buyer_signals(),
+              UnorderedElementsAre(
+                  Pair(url::Origin::Create(GURL("https://valid.com")), "2")));
+}
+
+TEST_F(HeaderDirectFromSellerSignalsTest, OverwriteOldAdSlotSignals) {
+  const std::vector<std::string> kResponses = {R"([{
+    "adSlot": "slot1",
+    "sellerSignals": "version1"
+  }])",
+                                               R"([{
+    "adSlot": "slot1",
+    "sellerSignals": "version2"
+  }])"};
+
+  std::vector<std::string> errors = AddWitnessesForOrigin(kOriginA, kResponses);
+  EXPECT_THAT(errors, IsEmpty());
+
+  scoped_refptr<HeaderDirectFromSellerSignals::Result> parsed =
+      ParseAndFind(kOriginA, "slot1");
+  ASSERT_NE(parsed, nullptr);
+  EXPECT_EQ(parsed->seller_signals(), "\"version2\"");
+}
+
+// Same as OverwriteOldAdSlotSignals, but the signals aren't parsed before
+// ParseAndRun() is invoked.
+TEST_F(HeaderDirectFromSellerSignalsTest,
+       AsyncOrder_OverwriteOldAdSlotSignals) {
+  constexpr char kResponse1[] = R"([{
+    "adSlot": "slot1",
+    "sellerSignals": "version1"
+  }])";
+  constexpr char kResponse2[] = R"([{
+    "adSlot": "slot1",
+    "sellerSignals": "version2"
+  }])";
+
+  base::RunLoop add_witness1_run_loop;
+  header_direct_from_seller_signals_.AddWitnessForOrigin(
+      data_decoder_, kOriginA, kResponse1,
+      base::BindLambdaForTesting(
+          [&add_witness1_run_loop](std::vector<std::string> errors) {
+            EXPECT_THAT(errors, IsEmpty());
+            add_witness1_run_loop.Quit();
+          }));
+
+  header_direct_from_seller_signals_.AddWitnessForOrigin(
+      data_decoder_, kOriginA, kResponse2,
+      base::BindLambdaForTesting([](std::vector<std::string> errors) {
+        // Only the first AddWitnessForOrigin() should be called -- it's given
+        // all errors, if any.
+        ADD_FAILURE() << "Shouldn't be called";
+      }));
+
+  base::RunLoop parse_and_find_run_loop;
+  header_direct_from_seller_signals_.ParseAndFind(
+      kOriginA, "slot1",
+      base::BindLambdaForTesting(
+          [&parse_and_find_run_loop](
+              scoped_refptr<HeaderDirectFromSellerSignals::Result> result) {
+            ASSERT_NE(result, nullptr);
+            EXPECT_EQ(result->seller_signals(), "\"version2\"");
+            parse_and_find_run_loop.Quit();
+          }));
+
+  add_witness1_run_loop.Run();
+  parse_and_find_run_loop.Run();
+}
+
+// A response is received, and ParseAndFind() is called before the response is
+// processed.
+TEST_F(HeaderDirectFromSellerSignalsTest,
+       AsyncOrder_ParseAndFindBeforeResponseProcessed) {
+  constexpr char kResponse[] = R"([{
+    "adSlot": "slot1",
+    "sellerSignals": "abc"
+  }])";
+
+  base::RunLoop add_witness_run_loop;
+  header_direct_from_seller_signals_.AddWitnessForOrigin(
+      data_decoder_, kOriginA, kResponse,
+      base::BindLambdaForTesting(
+          [&add_witness_run_loop](std::vector<std::string> errors) {
+            EXPECT_THAT(errors, IsEmpty());
+            add_witness_run_loop.Quit();
+          }));
+
+  base::RunLoop parse_and_find_run_loop;
+  header_direct_from_seller_signals_.ParseAndFind(
+      kOriginA, "slot1",
+      base::BindLambdaForTesting(
+          [&parse_and_find_run_loop](
+              scoped_refptr<HeaderDirectFromSellerSignals::Result> result) {
+            EXPECT_NE(result, nullptr);
+            parse_and_find_run_loop.Quit();
+          }));
+
+  add_witness_run_loop.Run();
+  parse_and_find_run_loop.Run();
+}
+
+// Two responses are received, and ParseAndFind() is called before the responses
+// are processed.
+TEST_F(HeaderDirectFromSellerSignalsTest,
+       AsyncOrder_ParseAndFindBefore2ResponsesProcessed) {
+  constexpr char kResponse1[] = R"([{
+    "adSlot": "slot1"
+  }])";
+  constexpr char kResponse2[] = R"([{
+    "adSlot": "slot2"
+  }])";
+
+  base::RunLoop add_witness1_run_loop;
+  header_direct_from_seller_signals_.AddWitnessForOrigin(
+      data_decoder_, kOriginA, kResponse1,
+      base::BindLambdaForTesting(
+          [&add_witness1_run_loop](std::vector<std::string> errors) {
+            EXPECT_THAT(errors, IsEmpty());
+            add_witness1_run_loop.Quit();
+          }));
+
+  header_direct_from_seller_signals_.AddWitnessForOrigin(
+      data_decoder_, kOriginA, kResponse2,
+      base::BindLambdaForTesting([](std::vector<std::string> errors) {
+        // Only the first AddWitnessForOrigin() should be called -- it's given
+        // all errors, if any.
+        ADD_FAILURE() << "Shouldn't be called";
+      }));
+
+  base::RunLoop parse_and_find_run_loop;
+  header_direct_from_seller_signals_.ParseAndFind(
+      kOriginA, "slot2",
+      base::BindLambdaForTesting(
+          [&parse_and_find_run_loop](
+              scoped_refptr<HeaderDirectFromSellerSignals::Result> result) {
+            EXPECT_NE(result, nullptr);
+            parse_and_find_run_loop.Quit();
+          }));
+
+  add_witness1_run_loop.Run();
+  parse_and_find_run_loop.Run();
+}
+
+// A response is received, ParseAndFind() is called, then another response is
+// received, and then processing completes.
+TEST_F(HeaderDirectFromSellerSignalsTest,
+       AsyncOrder_ParseAndFindBetween2Responses) {
+  constexpr char kResponse1[] = R"([{
+    "adSlot": "slot1"
+  }])";
+  constexpr char kResponse2[] = R"([{
+    "adSlot": "slot2"
+  }])";
+
+  base::RunLoop add_witness1_run_loop;
+  header_direct_from_seller_signals_.AddWitnessForOrigin(
+      data_decoder_, kOriginA, kResponse1,
+      base::BindLambdaForTesting(
+          [&add_witness1_run_loop](std::vector<std::string> errors) {
+            EXPECT_THAT(errors, IsEmpty());
+            add_witness1_run_loop.Quit();
+          }));
+
+  base::RunLoop parse_and_find_run_loop;
+  header_direct_from_seller_signals_.ParseAndFind(
+      kOriginA, "slot2",
+      base::BindLambdaForTesting(
+          [&parse_and_find_run_loop](
+              scoped_refptr<HeaderDirectFromSellerSignals::Result> result) {
+            EXPECT_NE(result, nullptr);
+            parse_and_find_run_loop.Quit();
+          }));
+
+  header_direct_from_seller_signals_.AddWitnessForOrigin(
+      data_decoder_, kOriginA, kResponse2,
+      base::BindLambdaForTesting([](std::vector<std::string> errors) {
+        // Only the first AddWitnessForOrigin() should be called -- it's given
+        // all errors, if any.
+        ADD_FAILURE() << "Shouldn't be called";
+      }));
+
+  add_witness1_run_loop.Run();
+  parse_and_find_run_loop.Run();
+}
+
+// Two responses with errors are received, and ParseAndFind() is called before
+// the responses are processed.
+TEST_F(HeaderDirectFromSellerSignalsTest,
+       AsyncOrder_ParseAndFindBefore2ResponsesProcessedWithErrors) {
+  constexpr char kResponse1[] = R"({"Not": "a list"})";
+  constexpr char kResponse2[] = R"({"AlsoNot": "a list"})";
+
+  base::RunLoop add_witness1_run_loop;
+  header_direct_from_seller_signals_.AddWitnessForOrigin(
+      data_decoder_, kOriginA, kResponse1,
+      base::BindLambdaForTesting(
+          [&add_witness1_run_loop](std::vector<std::string> errors) {
+            EXPECT_THAT(
+                errors,
+                UnorderedElementsAre(
+                    Eq("directFromSellerSignalsHeaderAdSlot: encountered "
+                       "response where top-level JSON value isn't an "
+                       "array: Ad-Auction-Signals={\"Not\": \"a list\"}"),
+                    Eq("directFromSellerSignalsHeaderAdSlot: encountered "
+                       "response where top-level JSON value isn't an array: "
+                       "Ad-Auction-Signals={\"AlsoNot\": \"a list\"}")));
+            add_witness1_run_loop.Quit();
+          }));
+
+  header_direct_from_seller_signals_.AddWitnessForOrigin(
+      data_decoder_, kOriginA, kResponse2,
+      base::BindLambdaForTesting([](std::vector<std::string> errors) {
+        // Only the first AddWitnessForOrigin() should be called -- it's given
+        // all errors, if any.
+        ADD_FAILURE() << "Shouldn't be called";
+      }));
+
+  base::RunLoop parse_and_find_run_loop;
+  header_direct_from_seller_signals_.ParseAndFind(
+      kOriginA, "slot2",
+      base::BindLambdaForTesting(
+          [&parse_and_find_run_loop](
+              scoped_refptr<HeaderDirectFromSellerSignals::Result> result) {
+            EXPECT_EQ(result, nullptr);
+            parse_and_find_run_loop.Quit();
+          }));
+
+  add_witness1_run_loop.Run();
+  parse_and_find_run_loop.Run();
+}
+
+TEST_F(HeaderDirectFromSellerSignalsTest,
+       AsyncOrder_DeleteDecoderDuringParsing) {
+  constexpr char kResponse[] = R"([{
+    "adSlot": "slot1",
+    "sellerSignals": "abc"
+  }])";
+  absl::optional<data_decoder::DataDecoder> data_decoder;
+  data_decoder.emplace();
+
+  header_direct_from_seller_signals_.AddWitnessForOrigin(
+      *data_decoder, kOriginA, kResponse,
+      base::BindLambdaForTesting([](std::vector<std::string> errors) {
+        EXPECT_THAT(errors, IsEmpty());
+        ADD_FAILURE() << "Shouldn't be called";
+      }));
+
+  header_direct_from_seller_signals_.ParseAndFind(
+      kOriginA, "slot1",
+      base::BindLambdaForTesting(
+          [](scoped_refptr<HeaderDirectFromSellerSignals::Result> result) {
+            ADD_FAILURE() << "Shouldn't be called";
+          }));
+  data_decoder.reset();
+  task_environment_.RunUntilIdle();
 }
 
 }  // namespace
diff --git a/content/browser/interest_group/interest_group_auction.cc b/content/browser/interest_group/interest_group_auction.cc
index e82e307..f306888 100644
--- a/content/browser/interest_group/interest_group_auction.cc
+++ b/content/browser/interest_group/interest_group_auction.cc
@@ -113,6 +113,14 @@
 constexpr base::TimeDelta kGroupFreshnessMax = base::Days(30);
 constexpr int kGroupFreshnessBuckets = 100;
 
+std::string DirectFromSellerSignalsHeaderAdSlotNoMatchError(
+    const std::string& ad_slot) {
+  return base::StringPrintf(
+      "When looking for directFromSellerSignalsHeaderAdSlot %s, failed to "
+      "find a matching response.",
+      ad_slot.c_str());
+}
+
 // All URLs received from worklets must be valid HTTPS URLs. It's up to callers
 // to call ReportBadMessage() on invalid URLs.
 bool IsUrlValid(const GURL& url) {
@@ -2619,14 +2627,17 @@
     ++num_scoring_dependencies_;
   }
   direct_from_seller_signals_header_ad_slot_pending_ = true;
-  HeaderDirectFromSellerSignals::ParseAndFind(
-      base::BindRepeating(&InterestGroupAuction::GetDataDecoder,
-                          weak_ptr_factory_.GetWeakPtr()),
-      auction_page_data->GetAuctionSignalsForOrigin(config_->seller),
-      *direct_from_seller_signals_header_ad_slot,
+  if (!auction_page_data) {
+    OnDirectFromSellerSignalHeaderAdSlotResolved(
+        *direct_from_seller_signals_header_ad_slot, nullptr);
+    return;
+  }
+  auction_page_data->ParseAndFindAdAuctionSignals(
+      config_->seller, *direct_from_seller_signals_header_ad_slot,
       base::BindOnce(
           &InterestGroupAuction::OnDirectFromSellerSignalHeaderAdSlotResolved,
-          weak_ptr_factory_.GetWeakPtr()));
+          weak_ptr_factory_.GetWeakPtr(),
+          *direct_from_seller_signals_header_ad_slot));
 }
 
 void InterestGroupAuction::
@@ -3273,7 +3284,7 @@
 
 absl::optional<std::string>
 InterestGroupAuction::GetDirectFromSellerAuctionSignalsHeaderAdSlot(
-    const HeaderDirectFromSellerSignals& signals) {
+    const HeaderDirectFromSellerSignals::Result& signals) {
   return signals.auction_signals();
 }
 
@@ -3293,7 +3304,7 @@
 
 absl::optional<std::string>
 InterestGroupAuction::GetDirectFromSellerPerBuyerSignalsHeaderAdSlot(
-    const HeaderDirectFromSellerSignals& signals,
+    const HeaderDirectFromSellerSignals::Result& signals,
     const url::Origin& owner) {
   auto it = signals.per_buyer_signals().find(owner);
   if (it == signals.per_buyer_signals().end()) {
@@ -3312,7 +3323,7 @@
 
 absl::optional<std::string>
 InterestGroupAuction::GetDirectFromSellerSellerSignalsHeaderAdSlot(
-    const HeaderDirectFromSellerSignals& signals) {
+    const HeaderDirectFromSellerSignals::Result& signals) {
   return signals.seller_signals();
 }
 
@@ -4495,13 +4506,16 @@
 }
 
 void InterestGroupAuction::OnDirectFromSellerSignalHeaderAdSlotResolved(
-    std::unique_ptr<HeaderDirectFromSellerSignals> signals,
-    std::vector<std::string> errors) {
+    std::string ad_slot,
+    scoped_refptr<HeaderDirectFromSellerSignals::Result> signals) {
   DCHECK_NE(bidding_and_scoring_phase_state_, PhaseState::kAfter);
   CHECK(direct_from_seller_signals_header_ad_slot_pending_);
   CHECK(direct_from_seller_signals_header_ad_slot_);
-  direct_from_seller_signals_header_ad_slot_ = std::move(signals);
-  errors_.insert(errors_.end(), errors.begin(), errors.end());
+  if (signals) {
+    direct_from_seller_signals_header_ad_slot_ = std::move(signals);
+  } else {
+    errors_.push_back(DirectFromSellerSignalsHeaderAdSlotNoMatchError(ad_slot));
+  }
 
   direct_from_seller_signals_header_ad_slot_pending_ = false;
 
diff --git a/content/browser/interest_group/interest_group_auction.h b/content/browser/interest_group/interest_group_auction.h
index c3abf36b..a79a132c 100644
--- a/content/browser/interest_group/interest_group_auction.h
+++ b/content/browser/interest_group/interest_group_auction.h
@@ -762,7 +762,7 @@
   // that InterestGroupAuctionReporter can use it.
   static absl::optional<std::string>
   GetDirectFromSellerAuctionSignalsHeaderAdSlot(
-      const HeaderDirectFromSellerSignals& signals);
+      const HeaderDirectFromSellerSignals::Result& signals);
 
   // Gets the buyer DirectFromSellerSignals per-buyer-signals in `config` for
   // buyer. Public so that InterestGroupAuctionReporter can use it.
@@ -774,7 +774,7 @@
   // for `owner`. Public so that InterestGroupAuctionReporter can use it.
   static absl::optional<std::string>
   GetDirectFromSellerPerBuyerSignalsHeaderAdSlot(
-      const HeaderDirectFromSellerSignals& signals,
+      const HeaderDirectFromSellerSignals::Result& signals,
       const url::Origin& owner);
 
   // Gets DirectFromSellerSignals seller-signals. Public so that
@@ -786,7 +786,7 @@
   // InterestGroupAuctionReporter can use it.
   static absl::optional<std::string>
   GetDirectFromSellerSellerSignalsHeaderAdSlot(
-      const HeaderDirectFromSellerSignals& signals);
+      const HeaderDirectFromSellerSignals::Result& signals);
 
   // Replaces `${}` placeholders in a debug report URL's query string for post
   // auction signals if exist. Only replaces unescaped placeholder ${}, but
@@ -1110,7 +1110,7 @@
   // creating it if needed.
   SubresourceUrlBuilder* SubresourceUrlBuilderIfReady();
 
-  const HeaderDirectFromSellerSignals*
+  const HeaderDirectFromSellerSignals::Result*
   direct_from_seller_signals_header_ad_slot() const {
     return direct_from_seller_signals_header_ad_slot_.get();
   }
@@ -1125,13 +1125,13 @@
   void OnLoadedWinningGroup(BiddingAndAuctionResponse response,
                             absl::optional<StorageInterestGroup> maybe_group);
 
-  // Completion callback for HeaderDirectFromSellerSignals::ParseAndFind(). Sets
-  // `direct_from_seller_signals_header_ad_slot_`, and sets
+  // Completion callback for AdAuctionPageData::ParseAndFindAdAuctionSignals().
+  // Sets `direct_from_seller_signals_header_ad_slot_`, and sets
   // `direct_from_seller_signals_header_ad_slot_pending_` to false, appending
   // `errors` to `errors_`.
   void OnDirectFromSellerSignalHeaderAdSlotResolved(
-      std::unique_ptr<HeaderDirectFromSellerSignals> signals,
-      std::vector<std::string> errors);
+      std::string ad_slot,
+      scoped_refptr<HeaderDirectFromSellerSignals::Result> signals);
 
   static data_decoder::DataDecoder* GetDataDecoder(
       base::WeakPtr<InterestGroupAuction> instance);
@@ -1271,16 +1271,16 @@
   // transferred to InterestGroupAuctionReporter.
   std::unique_ptr<SubresourceUrlBuilder> subresource_url_builder_;
 
-  // Stores the loaded HeaderDirectFromSellerSignals, if there were any. Should
-  // never be null until moved to the reporter.
+  // Stores the loaded HeaderDirectFromSellerSignals::Result, if there were any.
+  // Should never be null until moved to the reporter.
   //
   // After `direct_from_seller_signals_header_ad_slot_` has been
   // set to true, the default constructed value gets replaced with the found
   // signals, if the auction config provided an ad-slot, and it matched one of
   // the captured responses for the seller's origin.
-  std::unique_ptr<HeaderDirectFromSellerSignals>
+  scoped_refptr<HeaderDirectFromSellerSignals::Result>
       direct_from_seller_signals_header_ad_slot_ =
-          std::make_unique<HeaderDirectFromSellerSignals>();
+          base::MakeRefCounted<HeaderDirectFromSellerSignals::Result>();
 
   // The number of buyers in the AuctionConfig that passed the
   // IsInterestGroupApiAllowedCallback filter and interest groups were found
diff --git a/content/browser/interest_group/interest_group_auction_reporter.h b/content/browser/interest_group/interest_group_auction_reporter.h
index 9c77ed32..f0320e1 100644
--- a/content/browser/interest_group/interest_group_auction_reporter.h
+++ b/content/browser/interest_group/interest_group_auction_reporter.h
@@ -22,6 +22,7 @@
 #include "base/time/time.h"
 #include "content/browser/fenced_frame/fenced_frame_reporter.h"
 #include "content/browser/interest_group/auction_worklet_manager.h"
+#include "content/browser/interest_group/header_direct_from_seller_signals.h"
 #include "content/browser/interest_group/interest_group_caching_storage.h"
 #include "content/browser/interest_group/interest_group_storage.h"
 #include "content/browser/interest_group/subresource_url_authorizations.h"
@@ -48,7 +49,6 @@
 class AuctionWorkletManager;
 struct BiddingAndAuctionResponse;
 class BrowserContext;
-class HeaderDirectFromSellerSignals;
 class InterestGroupManagerImpl;
 class PrivateAggregationManager;
 
@@ -138,7 +138,7 @@
     raw_ptr<const blink::AuctionConfig> auction_config;
 
     std::unique_ptr<SubresourceUrlBuilder> subresource_url_builder;
-    std::unique_ptr<HeaderDirectFromSellerSignals>
+    scoped_refptr<HeaderDirectFromSellerSignals::Result>
         direct_from_seller_signals_header_ad_slot;
 
     // Bid fed as input to the seller. If this is the top level seller and the
diff --git a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
index 6cb5973..5a80e15 100644
--- a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
+++ b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
@@ -71,7 +71,7 @@
       /*direct_from_seller_signals=*/absl::nullopt);
   // Also must not be null.
   out.direct_from_seller_signals_header_ad_slot =
-      std::make_unique<HeaderDirectFromSellerSignals>();
+      base::MakeRefCounted<HeaderDirectFromSellerSignals::Result>();
 
   // The specific values these are assigned to don't matter for these tests, but
   // they don't have default initializers, so have to set them to placate memory
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc
index f64a7f48..1690d78 100644
--- a/content/browser/interest_group/interest_group_browsertest.cc
+++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -1478,14 +1478,26 @@
                                                                  response);
   }
 
-  const std::set<std::string>& GetAuctionSignalsForOrigin(
-      const url::Origin& origin) {
+  const scoped_refptr<HeaderDirectFromSellerSignals::Result>
+  ParseAndFindAdAuctionSignals(const url::Origin& origin,
+                               const std::string& ad_slot) {
     Page& page = web_contents()->GetPrimaryPage();
 
     AdAuctionPageData* ad_auction_page_data =
         PageUserData<AdAuctionPageData>::GetOrCreateForPage(page);
 
-    return ad_auction_page_data->GetAuctionSignalsForOrigin(origin);
+    base::RunLoop run_loop;
+    scoped_refptr<HeaderDirectFromSellerSignals::Result> my_result;
+    ad_auction_page_data->ParseAndFindAdAuctionSignals(
+        origin, ad_slot,
+        base::BindLambdaForTesting(
+            [&run_loop, &my_result](
+                scoped_refptr<HeaderDirectFromSellerSignals::Result> result) {
+              my_result = std::move(result);
+              run_loop.Quit();
+            }));
+    run_loop.Run();
+    return my_result;
   }
 
   std::vector<std::string> TakeAuctionAdditionalBidsForOriginAndNonce(
@@ -5398,14 +5410,16 @@
       "'NavigatorAuction': auctionSignals for AuctionAdConfig with seller "
       "'https://a.test:*' must be a JSON-serializable object.");
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(JsReplace(R"({
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(JsReplace(R"({
       seller: $1,
       decisionLogicURL: $2,
       auctionSignals: alert,
       interestGroupBuyers: []
   })",
-                                        test_origin, decision_url)));
+                                  test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -5427,9 +5441,11 @@
       interestGroupBuyers: []
   })";
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
 }
 
 // Exercise error-handling path in the renderer for promise-delivered auction
@@ -5455,9 +5471,11 @@
       "'NavigatorAuction': auctionSignals for AuctionAdConfig with seller "
       "'https://a.test:*' must be a JSON-serializable object.");
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -5475,14 +5493,16 @@
       "'NavigatorAuction': sellerSignals for AuctionAdConfig with seller "
       "'https://a.test:*' must be a JSON-serializable object.");
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(JsReplace(R"({
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(JsReplace(R"({
       seller: $1,
       decisionLogicURL: $2,
       sellerSignals: function() {},
       interestGroupBuyers: []
   })",
-                                        test_origin, decision_url)));
+                                  test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -5503,9 +5523,11 @@
       interestGroupBuyers: []
   })";
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
 }
 
 // Exercise error-handling path in the renderer for promise-delivered seller
@@ -5531,9 +5553,11 @@
       "Uncaught (in promise) TypeError: Failed to execute 'runAdAuction' on "
       "'NavigatorAuction': sellerSignals for AuctionAdConfig with seller "
       "'https://a.test:*' must be a JSON-serializable object.");
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -5554,9 +5578,11 @@
       interestGroupBuyers: []
   })";
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
 }
 
 // Exercise error-handling path in the renderer for promise-delivered
@@ -5581,9 +5607,11 @@
   console_observer.SetPattern(
       "Uncaught (in promise) TypeError: Failed to execute 'runAdAuction' on "
       "'NavigatorAuction': Only objects can be converted to record<K,V> types");
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -5602,14 +5630,16 @@
       "AuctionAdConfig with seller 'https://a.test:*' must be a valid https "
       "origin.");
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(JsReplace(R"({
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(JsReplace(R"({
       seller: $1,
       decisionLogicURL: $2,
       perBuyerSignals: {'https://invalid^&': {a:1}},
       interestGroupBuyers: []
   })",
-                                        test_origin, decision_url)));
+                                  test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -5630,9 +5660,11 @@
       interestGroupBuyers: []
   })";
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
 }
 
 // Exercise error-handling path in the renderer for promise-delivered
@@ -5659,9 +5691,11 @@
       "'NavigatorAuction': perBuyerTimeouts buyer 'http://b.com' for "
       "AuctionAdConfig with seller 'https://a.test:*' must be \"*\" (wildcard) "
       "or a valid https origin.");
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -5680,14 +5714,16 @@
       "AuctionAdConfig with seller 'https://a.test:*' must be \"*\" (wildcard) "
       "or a valid https origin.");
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(JsReplace(R"({
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(JsReplace(R"({
       seller: $1,
       decisionLogicURL: $2,
       perBuyerTimeouts: {'https://invalid^&': 100},
       interestGroupBuyers: []
   })",
-                                        test_origin, decision_url)));
+                                  test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -5709,9 +5745,11 @@
       interestGroupBuyers: []
   })";
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
 }
 
 // Exercise error-handling path in the renderer for promise-delivered
@@ -5739,9 +5777,11 @@
       "'NavigatorAuction': perBuyerCumulativeTimeouts buyer 'http://b.com' for "
       "AuctionAdConfig with seller 'https://a.test:*' must be \"*\" (wildcard) "
       "or a valid https origin.");
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -5759,14 +5799,16 @@
       "'NavigatorAuction': perBuyerCumulativeTimeouts buyer "
       "'https://invalid^&' for AuctionAdConfig with seller 'https://a.test:*' "
       "must be \"*\" (wildcard) or a valid https origin.");
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(JsReplace(R"({
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(JsReplace(R"({
       seller: $1,
       decisionLogicURL: $2,
       perBuyerCumulativeTimeouts: {'https://invalid^&': 100},
       interestGroupBuyers: []
   })",
-                                        test_origin, decision_url)));
+                                  test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -5785,14 +5827,16 @@
       "AuctionAdConfig with seller 'https://a.test:*' must be \"*\" (wildcard) "
       "or a valid https origin.");
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(JsReplace(R"({
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(JsReplace(R"({
       seller: $1,
       decisionLogicURL: $2,
       perBuyerCurrencies: {'https://invalid^&': 'USD'},
       interestGroupBuyers: []
   })",
-                                        test_origin, decision_url)));
+                                  test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -5811,14 +5855,16 @@
       "AuctionAdConfig with seller 'https://a.test:*' must be a 3-letter "
       "uppercase currency code.");
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(JsReplace(R"({
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(JsReplace(R"({
       seller: $1,
       decisionLogicURL: $2,
       perBuyerCurrencies: {'*': 'usd'},
       interestGroupBuyers: []
   })",
-                                        test_origin, decision_url)));
+                                  test_origin, decision_url)));
 }
 
 IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest,
@@ -6009,14 +6055,16 @@
       "'NavigatorAuction': perBuyerSignals for AuctionAdConfig with seller "
       "'https://a.test:*' must be a JSON-serializable object.");
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(JsReplace(R"({
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(JsReplace(R"({
       seller: $1,
       decisionLogicURL: $2,
       perBuyerSignals: {'https://test.com': function() {}},
       interestGroupBuyers: []
   })",
-                                        test_origin, decision_url)));
+                                  test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -6036,9 +6084,11 @@
       interestGroupBuyers: []
   })";
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -6058,9 +6108,11 @@
       interestGroupBuyers: []
   })";
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -6095,6 +6147,90 @@
   EXPECT_TRUE(console_observer.Wait());
 }
 
+// Parse errors for directFromSellerSignalsHeaderAdSlot are logged to devtools.
+IN_PROC_BROWSER_TEST_F(
+    InterestGroupBrowserTest,
+    RunAdAuctionInvalidDirectFromSellerSignalsHeaderAdSlotLogged) {
+  constexpr char kBidderHost[] = "a.test";
+  constexpr char kTopFrameHost[] = "c.test";
+  constexpr char kSellerHost[] = "b.test";
+  url::Origin seller_origin =
+      url::Origin::Create(https_server_->GetURL(kSellerHost, "/echo"));
+  const url::Origin top_frame_origin =
+      url::Origin::Create(https_server_->GetURL(kTopFrameHost, "/echo"));
+
+  GURL bidder_url = https_server_->GetURL(kBidderHost, "/echo");
+  ASSERT_TRUE(NavigateToURL(shell(), bidder_url));
+  url::Origin bidder_origin = url::Origin::Create(bidder_url);
+
+  ASSERT_EQ(kSuccess,
+            JoinInterestGroupAndVerify(
+                /*owner=*/bidder_origin, /*name=*/"cars", /*priority=*/0.0,
+                blink::InterestGroup::ExecutionMode::kCompatibilityMode,
+                /*bidding_url=*/
+                https_server_->GetURL(kBidderHost,
+                                      "/interest_group/bidding_logic.js"),
+                /*ads=*/
+                {{{GURL("https://example.com/render"),
+                   /*metadata=*/absl::nullopt}}}));
+
+  GURL top_frame_url = https_server_->GetURL(kTopFrameHost, "/echo");
+  ASSERT_TRUE(NavigateToURL(shell(), top_frame_url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+  console_observer.SetPattern(
+      "directFromSellerSignalsHeaderAdSlot: encountered dict without "
+      "\"adSlot\" key: Ad-Auction-Signals=[{ \"no\": \"adSlot\", "
+      "\"sellerSignals\": {\"json\": \"for\", \"the\": [\"seller\"]} }]");
+
+  const char kHeaderSignalsPath[] = "/header_direct_from_seller_signals.json";
+  // The actual body of the request is just an empty JSON dict for the test,
+  // but it could be any arbitrary payload that the server wants to deliver
+  // with the header signals.
+  const char kHeaderSignalsBodyResponse[] = "{}";
+  // The adSlot key is not present, so kHeaderSignalsResponse is invalid. The
+  // signals given to worklet functions should be null, and errors should be
+  // logged to devtools.
+  const char kHeaderSignalsResponse[] = R"([{
+      "no": "adSlot",
+      "sellerSignals": {"json": "for", "the": ["seller"]}
+    }])";
+  network_responder_->RegisterNetworkResponse(
+      kHeaderSignalsPath, kHeaderSignalsBodyResponse, "application/json",
+      /*extra_response_headers=*/
+      {{"Access-Control-Allow-Origin", top_frame_origin.Serialize()},
+       {"Ad-Auction-Signals", kHeaderSignalsResponse}});
+  EXPECT_TRUE(ExecJs(web_contents()->GetPrimaryMainFrame(),
+                     content::JsReplace("fetch($1, {adAuctionHeaders: true})",
+                                        https_server_->GetURL(
+                                            kSellerHost, kHeaderSignalsPath))));
+
+  TestFencedFrameURLMappingResultObserver observer;
+  ConvertFencedFrameURNToURL(
+      GURL(
+          EvalJs(web_contents()->GetPrimaryMainFrame(),
+                 JsReplace(
+                     R"(
+(async function() {
+  return await navigator.runAdAuction({
+      seller: $1,
+      decisionLogicUrl: $2,
+      interestGroupBuyers: [$3],
+      directFromSellerSignalsHeaderAdSlot: "adSlot1"
+  });
+})())",
+                     seller_origin,
+                     https_server_->GetURL(
+                         kSellerHost,
+                         "/interest_group/"
+                         "decision_no_direct_from_seller_signals_validator.js"),
+                     bidder_origin))
+              .ExtractString()),
+      &observer);
+  EXPECT_EQ(GURL("https://example.com/render"), observer.mapped_url());
+  EXPECT_TRUE(console_observer.Wait());
+}
+
 IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest,
                        RunAdAuctionPromiseInvalidDirectFromSellerSignals) {
   GURL test_url = https_server_->GetURL("a.test", "/echo");
@@ -6117,9 +6253,11 @@
       "'NavigatorAuction': directFromSellerSignals 'http://test.com/signals' "
       "for AuctionAdConfig with seller 'https://a.test:*' must match seller "
       "origin; only https scheme is supported.");
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -6144,9 +6282,11 @@
 
   WebContentsConsoleObserver console_observer(shell()->web_contents());
   console_observer.SetPattern("Uncaught (in promise) Don't stringify me!");
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(
-                JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(
+          JsReplace(kAuctionConfigTemplate, test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -6165,14 +6305,16 @@
       "AuctionAdConfig with seller 'https://a.test:*' cannot be resolved to a "
       "valid URL.");
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(JsReplace(R"({
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(JsReplace(R"({
       seller: $1,
       decisionLogicURL: $2,
       directFromSellerSignals: 'https://invalid^&',
       interestGroupBuyers: []
   })",
-                                        test_origin, decision_url)));
+                                  test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -6190,14 +6332,16 @@
       "'NavigatorAuction': directFromSellerSignals 'http://test.com/signals' "
       "for AuctionAdConfig with seller 'https://a.test:*' must match seller "
       "origin; only https scheme is supported.");
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(JsReplace(R"({
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(JsReplace(R"({
       seller: $1,
       decisionLogicURL: $2,
       directFromSellerSignals: 'http://test.com/signals',
       interestGroupBuyers: []
   })",
-                                        test_origin, decision_url)));
+                                  test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -6216,14 +6360,16 @@
       "for AuctionAdConfig with seller 'https://a.test:*' must match seller "
       "origin; only https scheme is supported.");
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(JsReplace(R"({
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(JsReplace(R"({
       seller: $1,
       decisionLogicURL: $2,
       directFromSellerSignals: 'https://test2.com/signals',
       interestGroupBuyers: [$1]
   })",
-                                        test_origin, decision_url)));
+                                  test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -6243,14 +6389,16 @@
       "'https://a.test:*/signals?shouldntBeHere' for AuctionAdConfig with "
       "seller 'https://a.test:*' URL prefix must not have a query string.");
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(JsReplace(R"({
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(JsReplace(R"({
       seller: $1,
       decisionLogicURL: $2,
       directFromSellerSignals: $1 + '/signals?shouldntBeHere',
       interestGroupBuyers: [$1]
   })",
-                                        test_origin, decision_url)));
+                                  test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -6762,8 +6910,10 @@
   WebContentsConsoleObserver console_observer(shell()->web_contents());
   console_observer.SetPattern("Uncaught (in promise) Error!");
 
-  EXPECT_EQ("Promise argument rejected or resolved to invalid value.",
-            RunAuctionAndWait(JsReplace(R"({
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Promise "
+      "argument rejected or resolved to invalid value.",
+      RunAuctionAndWait(JsReplace(R"({
       seller: $1,
       decisionLogicURL: $2,
       directFromSellerSignalsHeaderAdSlot: Promise.resolve((() => {
@@ -6775,7 +6925,7 @@
       })()),
       interestGroupBuyers: [$1]
   })",
-                                        test_origin, decision_url)));
+                                  test_origin, decision_url)));
   EXPECT_TRUE(console_observer.Wait());
 }
 
@@ -14994,9 +15144,9 @@
       url::Origin::Create(fetch_url),
       base64Decode(kLegitimateAdAuctionResponse)));
 
-  const std::set<std::string>& signals =
-      GetAuctionSignalsForOrigin(url::Origin::Create(fetch_url));
-  EXPECT_THAT(signals, ::testing::IsEmpty());
+  const scoped_refptr<HeaderDirectFromSellerSignals::Result> signals =
+      ParseAndFindAdAuctionSignals(url::Origin::Create(fetch_url), "slot1");
+  EXPECT_EQ(signals, nullptr);
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -15011,7 +15161,7 @@
   replacement.emplace_back(std::make_pair(
       "{{AD_AUCTION_HEADERS}}",
       base::StrCat({"Ad-Auction-Result: ", kLegitimateAdAuctionResponse,
-                    "\nAd-Auction-Signals: ", "{}"})));
+                    "\nAd-Auction-Signals: ", R"([{"adSlot":"slot1"}])"})));
   replacement.emplace_back(std::make_pair("{{REDIRECT_HEADER}}", ""));
 
   GURL fetch_url = https_server_->GetURL(
@@ -15048,9 +15198,9 @@
       url::Origin::Create(fetch_url),
       base64Decode(kLegitimateAdAuctionResponse)));
 
-  const std::set<std::string>& signals =
-      GetAuctionSignalsForOrigin(url::Origin::Create(fetch_url));
-  EXPECT_THAT(signals, ::testing::UnorderedElementsAre("{}"));
+  const scoped_refptr<HeaderDirectFromSellerSignals::Result> signals =
+      ParseAndFindAdAuctionSignals(url::Origin::Create(fetch_url), "slot1");
+  EXPECT_NE(signals, nullptr);
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -15065,7 +15215,7 @@
   replacement.emplace_back(std::make_pair(
       "{{AD_AUCTION_HEADERS}}",
       base::StrCat({"Ad-Auction-Result: ", kLegitimateAdAuctionResponse,
-                    "\nAd-Auction-Signals: ", "{}"})));
+                    "\nAd-Auction-Signals: ", R"([{"adSlot":"slot1"}])"})));
   replacement.emplace_back(std::make_pair("{{REDIRECT_HEADER}}", ""));
 
   GURL fetch_url = https_server_->GetURL(
@@ -15102,9 +15252,9 @@
       url::Origin::Create(fetch_url),
       base64Decode(kLegitimateAdAuctionResponse)));
 
-  const std::set<std::string>& signals =
-      GetAuctionSignalsForOrigin(url::Origin::Create(fetch_url));
-  EXPECT_THAT(signals, ::testing::UnorderedElementsAre("{}"));
+  const scoped_refptr<HeaderDirectFromSellerSignals::Result> signals =
+      ParseAndFindAdAuctionSignals(url::Origin::Create(fetch_url), "slot1");
+  EXPECT_NE(signals, nullptr);
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -15250,9 +15400,9 @@
   EXPECT_FALSE(WitnessedAuctionResultForOrigin(
       request_origin, base64Decode(kLegitimateAdAuctionResponse)));
 
-  const std::set<std::string>& signals =
-      GetAuctionSignalsForOrigin(request_origin);
-  EXPECT_THAT(signals, ::testing::IsEmpty());
+  const scoped_refptr<HeaderDirectFromSellerSignals::Result> signals =
+      ParseAndFindAdAuctionSignals(request_origin, "slot1");
+  EXPECT_EQ(signals, nullptr);
 
   EXPECT_THAT(TakeAuctionAdditionalBidsForOriginAndNonce(
                   request_origin, "00000000-0000-0000-0000-000000000000"),
@@ -16614,7 +16764,7 @@
   replacement.emplace_back(std::make_pair(
       "{{AD_AUCTION_HEADERS}}",
       base::StrCat({"Ad-Auction-Result: ", kLegitimateAdAuctionResponse,
-                    "\nAd-Auction-Signals: ", "{}"})));
+                    "\nAd-Auction-Signals: ", R"([{"adSlot":"slot1"}])"})));
   replacement.emplace_back(std::make_pair("{{REDIRECT_HEADER}}", ""));
 
   GURL fetch_url = https_server_->GetURL(
@@ -16652,9 +16802,9 @@
       url::Origin::Create(fetch_url),
       base64Decode(kLegitimateAdAuctionResponse)));
 
-  const std::set<std::string>& signals =
-      GetAuctionSignalsForOrigin(url::Origin::Create(fetch_url));
-  EXPECT_THAT(signals, ::testing::UnorderedElementsAre("{}"));
+  const scoped_refptr<HeaderDirectFromSellerSignals::Result> signals =
+      ParseAndFindAdAuctionSignals(url::Origin::Create(fetch_url), "slot1");
+  EXPECT_NE(signals, nullptr);
 }
 
 class AdsAPIsOriginTrialBrowserTest : public ContentBrowserTest {
diff --git a/content/browser/preloading/prefetch/prefetch_proxy_configurator.cc b/content/browser/preloading/prefetch/prefetch_proxy_configurator.cc
index bd7bcd2..38d2cde 100644
--- a/content/browser/preloading/prefetch/prefetch_proxy_configurator.cc
+++ b/content/browser/preloading/prefetch/prefetch_proxy_configurator.cc
@@ -10,7 +10,7 @@
 #include "base/time/default_clock.h"
 #include "content/browser/preloading/prefetch/prefetch_params.h"
 #include "net/base/host_port_pair.h"
-#include "net/base/proxy_server.h"
+#include "net/base/proxy_chain.h"
 #include "net/base/proxy_string_util.h"
 #include "net/http/http_status_code.h"
 #include "net/http/http_util.h"
@@ -81,8 +81,7 @@
 
   // DIRECT is intentionally not added here because we want the proxy to always
   // be used in order to mask the user's IP address during the prerender.
-  config->rules.proxies_for_https.AddProxyServer(
-      prefetch_proxy_chain_.proxy_server());
+  config->rules.proxies_for_https.AddProxyChain(prefetch_proxy_chain_);
 
   // This ensures that the user's set proxy is honored, although we also disable
   // the feature is such cases.
diff --git a/content/browser/renderer_host/media/OWNERS b/content/browser/renderer_host/media/OWNERS
index 2a69ef8..933f40c 100644
--- a/content/browser/renderer_host/media/OWNERS
+++ b/content/browser/renderer_host/media/OWNERS
@@ -6,3 +6,4 @@
 # WebRTC OWNERS.
 tommi@chromium.org
 olka@chromium.org
+hbos@chromium.org
diff --git a/content/browser/renderer_host/media/video_capture_controller.cc b/content/browser/renderer_host/media/video_capture_controller.cc
index b16a903..d7720b7 100644
--- a/content/browser/renderer_host/media/video_capture_controller.cc
+++ b/content/browser/renderer_host/media/video_capture_controller.cc
@@ -271,8 +271,6 @@
   // client.
   if (state_ != blink::VIDEO_CAPTURE_STATE_ERROR) {
     controller_clients_.push_back(std::move(client));
-    base::UmaHistogramCounts100("Media.VideoCapture.NumberOfClients",
-                                controller_clients_.size());
   }
 }
 
diff --git a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
index f000c5b..6f8b0f0 100644
--- a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
@@ -452,8 +452,9 @@
                        LoadDataWithBaseURLThenReload) {
 #if !BUILDFLAG(IS_ANDROID)
   // LoadDataAsStringWithBaseURL is only supported on Android.
-  if (use_load_data_as_string_with_base_url())
+  if (use_load_data_as_string_with_base_url()) {
     return;
+  }
 #endif
   // LoadDataWithBaseURL is never subject to --site-per-process policy today
   // (this API is only used by Android WebView [where OOPIFs have not shipped
@@ -17476,7 +17477,7 @@
     return true;
   }
 
-  raw_ptr<Shell> shell_;
+  raw_ptr<Shell> shell_ = nullptr;
   const raw_ref<const GURL> url_to_intercept_;
   const raw_ref<const GURL> url_to_start_;
 };
@@ -17843,67 +17844,50 @@
   EXPECT_EQ(1, controller.GetCurrentEntryIndex());
 }
 
-class SandboxedNavigationControllerPopupBrowserTest
-    : public NavigationControllerBrowserTest {
- protected:
-  void SetupNavigation() {
-    EXPECT_EQ(1u, Shell::windows().size());
-    NavigationControllerImpl& controller =
-        static_cast<NavigationControllerImpl&>(
-            shell()->web_contents()->GetController());
-    GURL preload_url(embedded_test_server()->GetURL(
-        "/navigation_controller/page_with_sandboxed_iframe_popup.html"));
-    EXPECT_TRUE(NavigateToURL(shell(), preload_url));
-    ASSERT_EQ(1, controller.GetEntryCount());
-
-    FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
-                              ->GetPrimaryFrameTree()
-                              .root();
-    ASSERT_EQ(1U, root->child_count());
-    ASSERT_NE(nullptr, root->child_at(0));
-    ShellAddedObserver new_shell_observer;
-    // Click link inside sandboxed iframe, causing popup open.
-    std::string script = "document.getElementById('test_link').click()";
-    EXPECT_TRUE(ExecJs(root->child_at(0), script));
-
-    popup_shell_ = new_shell_observer.GetShell();
-    EXPECT_TRUE(WaitForLoadStop(popup_shell_->web_contents()));
-    FrameTreeNode* popup_root =
-        static_cast<WebContentsImpl*>(popup_shell_->web_contents())
-            ->GetPrimaryFrameTree()
-            .root();
-    // Click link inside sandboxed popup, causing the frame to have an
-    // additional entry in history state.
-    std::string popup_script = "document.getElementById('test_anchor').click()";
-    EXPECT_TRUE(ExecJs(popup_root, popup_script));
-  }
-
- protected:
-  raw_ptr<Shell, DanglingUntriaged> popup_shell_ = nullptr;
-
- private:
-  base::test::ScopedFeatureList feature_list_;
-};
-
 // Tests navigations that sandboxed top level frames still
 // can navigate.
-IN_PROC_BROWSER_TEST_P(SandboxedNavigationControllerPopupBrowserTest,
-                       NavigateSelf) {
-  SetupNavigation();
+IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest, NavigateSelf) {
+  EXPECT_EQ(1u, Shell::windows().size());
+  NavigationControllerImpl& controller = static_cast<NavigationControllerImpl&>(
+      shell()->web_contents()->GetController());
+  GURL preload_url(embedded_test_server()->GetURL(
+      "/navigation_controller/page_with_sandboxed_iframe_popup.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), preload_url));
+  ASSERT_EQ(1, controller.GetEntryCount());
 
-  std::string back_script = "history.back();";
-  FrameTreeNode* root =
-      static_cast<WebContentsImpl*>(popup_shell_->web_contents())
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetPrimaryFrameTree()
+                            .root();
+  ASSERT_EQ(1U, root->child_count());
+  ASSERT_NE(nullptr, root->child_at(0));
+  ShellAddedObserver new_shell_observer;
+  // Click link inside sandboxed iframe, causing popup open.
+  std::string script = "document.getElementById('test_link').click()";
+  EXPECT_TRUE(ExecJs(root->child_at(0), script));
+
+  Shell* popup_shell = new_shell_observer.GetShell();
+  EXPECT_TRUE(WaitForLoadStop(popup_shell->web_contents()));
+  FrameTreeNode* popup_root =
+      static_cast<WebContentsImpl*>(popup_shell->web_contents())
           ->GetPrimaryFrameTree()
           .root();
-  NavigationControllerImpl& controller = static_cast<NavigationControllerImpl&>(
-      popup_shell_->web_contents()->GetController());
-  ASSERT_EQ(2, controller.GetEntryCount());
-  EXPECT_EQ(1, controller.GetCurrentEntryIndex());
+
+  // Click link inside sandboxed popup, causing the frame to have an
+  // additional entry in history state.
+  std::string popup_script = "document.getElementById('test_anchor').click()";
+  EXPECT_TRUE(ExecJs(popup_root, popup_script));
+
+  NavigationControllerImpl& popup_controller =
+      static_cast<NavigationControllerImpl&>(
+          popup_shell->web_contents()->GetController());
+  ASSERT_EQ(2, popup_controller.GetEntryCount());
+  EXPECT_EQ(1, popup_controller.GetCurrentEntryIndex());
+
+  std::string back_script = "history.back();";
   // Navigate sandboxed top frame back.
-  EXPECT_TRUE(ExecJs(root, back_script));
-  EXPECT_TRUE(WaitForLoadStop(popup_shell_->web_contents()));
-  EXPECT_EQ(0, controller.GetCurrentEntryIndex());
+  EXPECT_TRUE(ExecJs(popup_root, back_script));
+  EXPECT_TRUE(WaitForLoadStop(popup_shell->web_contents()));
+  EXPECT_EQ(0, popup_controller.GetCurrentEntryIndex());
 }
 
 class NavigationControllerMainDocumentSequenceNumberBrowserTest
@@ -22176,12 +22160,6 @@
     NavigationControllerBrowserTest::DescribeParams);
 INSTANTIATE_TEST_SUITE_P(
     All,
-    SandboxedNavigationControllerPopupBrowserTest,
-    testing::Combine(testing::ValuesIn(RenderDocumentFeatureLevelValues()),
-                     testing::Bool()),
-    NavigationControllerBrowserTest::DescribeParams);
-INSTANTIATE_TEST_SUITE_P(
-    All,
     InitialEmptyDocNavigationControllerBrowserTest,
     testing::Combine(testing::ValuesIn(RenderDocumentFeatureLevelValues()),
                      testing::Bool()),
diff --git a/content/browser/storage_access/storage_access_handle.cc b/content/browser/storage_access/storage_access_handle.cc
index 2f8c0c9..17f3d63 100644
--- a/content/browser/storage_access/storage_access_handle.cc
+++ b/content/browser/storage_access/storage_access_handle.cc
@@ -4,6 +4,8 @@
 
 #include "content/browser/storage_access/storage_access_handle.h"
 
+#include "content/browser/broadcast_channel/broadcast_channel_provider.h"
+#include "content/browser/broadcast_channel/broadcast_channel_service.h"
 #include "content/browser/file_system_access/file_system_access_manager_impl.h"
 #include "content/browser/network/cross_origin_embedder_policy_reporter.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
@@ -156,6 +158,20 @@
                     std::move(receiver));
 }
 
+void StorageAccessHandle::BindBroadcastChannel(
+    mojo::PendingAssociatedReceiver<blink::mojom::BroadcastChannelProvider>
+        receiver) {
+  BroadcastChannelService* service =
+      static_cast<RenderFrameHostImpl&>(render_frame_host())
+          .GetStoragePartition()
+          ->GetBroadcastChannelService();
+  service->AddAssociatedReceiver(
+      std::make_unique<BroadcastChannelProvider>(
+          service, blink::StorageKey::CreateFirstParty(
+                       render_frame_host().GetStorageKey().origin())),
+      std::move(receiver));
+}
+
 StorageAccessHandle::StorageAccessHandle(
     RenderFrameHost& host,
     mojo::PendingReceiver<blink::mojom::StorageAccessHandle> receiver)
diff --git a/content/browser/storage_access/storage_access_handle.h b/content/browser/storage_access/storage_access_handle.h
index 806cae2a..321443e 100644
--- a/content/browser/storage_access/storage_access_handle.h
+++ b/content/browser/storage_access/storage_access_handle.h
@@ -10,6 +10,7 @@
 #include "components/services/storage/public/cpp/quota_error_or.h"
 #include "content/public/browser/document_service.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
+#include "third_party/blink/public/mojom/broadcastchannel/broadcast_channel.mojom-forward.h"
 #include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-forward.h"
 #include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-forward.h"
 #include "third_party/blink/public/mojom/locks/lock_manager.mojom-forward.h"
@@ -43,6 +44,9 @@
   void BindBlobStorage(
       mojo::PendingAssociatedReceiver<blink::mojom::BlobURLStore> receiver)
       override;
+  void BindBroadcastChannel(
+      mojo::PendingAssociatedReceiver<blink::mojom::BroadcastChannelProvider>
+          receiver) override;
 
  private:
   StorageAccessHandle(
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 0113e78..c590a81a 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -262,7 +262,6 @@
     {wf::EnableInstalledApp, raw_ref(features::kInstalledApp)},
     {wf::EnableLazyInitializeMediaControls,
      raw_ref(features::kLazyInitializeMediaControls)},
-    {wf::EnableLazyFrameLoading, raw_ref(features::kLazyFrameLoading)},
     {wf::EnableMachineLearningModelLoader,
      raw_ref(features::kEnableMachineLearningModelLoaderWebPlatformApi),
      kSetOnlyIfOverridden},
diff --git a/content/common/features.cc b/content/common/features.cc
index 0f0d93e..1edf25cd 100644
--- a/content/common/features.cc
+++ b/content/common/features.cc
@@ -273,10 +273,6 @@
              "JavaScriptArrayGrouping",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-BASE_FEATURE(kLazyFrameLoading,
-             "LazyFrameLoading",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Enables a fix for a macOS IME Live Conversion issue. crbug.com/1328530 and
 // crbug.com/1342551
 BASE_FEATURE(kMacImeLiveConversionFix,
diff --git a/content/common/features.h b/content/common/features.h
index f781ece..9152339 100644
--- a/content/common/features.h
+++ b/content/common/features.h
@@ -66,7 +66,6 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kIOSurfaceCapturer);
 #endif
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kJavaScriptArrayGrouping);
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kLazyFrameLoading);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kMacImeLiveConversionFix);
 #if BUILDFLAG(IS_MAC)
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kMacWebContentsOcclusion);
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 65c18e5f..e922de2 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -123,7 +123,6 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kIsolateOrigins);
 CONTENT_EXPORT extern const char kIsolateOriginsFieldTrialParamName[];
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kJavaScriptExperimentalSharedMemory);
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kLazyFrameLoading);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kLazyInitializeMediaControls);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kLegacyTechReportEnableCookieIssueReports);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kLegacyTechReportTopLevelUrl);
diff --git a/docs/updater/protocol_3_1.md b/docs/updater/protocol_3_1.md
index df20d29..1758257a 100644
--- a/docs/updater/protocol_3_1.md
+++ b/docs/updater/protocol_3_1.md
@@ -624,6 +624,10 @@
      *   "error-invalidAppId": The server is not aware of this application with
          this ID and furthermore the application ID was not in a format the
          server expected.
+     *   "error-osnotsupported": The server finds that the OS does not meet the
+         application requirements.
+     *   "error-hwnotsupported": The server finds that the computer does not
+         meet the hardware requirements of the application.
 
 #### `data` Objects (Update Check Response)
 Each data object in the response represents an answer to a data request from the
diff --git a/extensions/renderer/script_context_set.cc b/extensions/renderer/script_context_set.cc
index 4bd353d..b55f38e7 100644
--- a/extensions/renderer/script_context_set.cc
+++ b/extensions/renderer/script_context_set.cc
@@ -4,6 +4,7 @@
 
 #include "extensions/renderer/script_context_set.h"
 
+#include "base/compiler_specific.h"
 #include "base/functional/bind.h"
 #include "base/location.h"
 #include "base/task/single_thread_task_runner.h"
@@ -85,7 +86,10 @@
 }
 
 ScriptContext* ScriptContextSet::GetCurrent() const {
-  v8::Isolate* isolate = v8::Isolate::GetCurrent();
+  v8::Isolate* isolate = v8::Isolate::TryGetCurrent();
+  if (UNLIKELY(!isolate)) {
+    return nullptr;
+  }
   return isolate->InContext() ? GetByV8Context(isolate->GetCurrentContext())
                               : nullptr;
 }
diff --git a/google_apis/gcm/engine/gcm_store_impl.cc b/google_apis/gcm/engine/gcm_store_impl.cc
index c7eee5f..c2581dd 100644
--- a/google_apis/gcm/engine/gcm_store_impl.cc
+++ b/google_apis/gcm/engine/gcm_store_impl.cc
@@ -1027,8 +1027,6 @@
   if (!expired_incoming_messages.empty()) {
     DVLOG(1) << "Removing " << expired_incoming_messages.size()
              << " expired incoming messages.";
-    UMA_HISTOGRAM_COUNTS_1M("GCM.ExpiredIncomingMessages",
-                            expired_incoming_messages.size());
     RemoveIncomingMessages(expired_incoming_messages, base::DoNothing());
   }
   return true;
diff --git a/gpu/command_buffer/service/service_utils.cc b/gpu/command_buffer/service/service_utils.cc
index 557db2b..a77e4ef 100644
--- a/gpu/command_buffer/service/service_utils.cc
+++ b/gpu/command_buffer/service/service_utils.cc
@@ -216,11 +216,7 @@
     }
 #endif  // BUILDFLAG(SKIA_USE_DAWN)
 #if BUILDFLAG(SKIA_USE_METAL)
-    if (
-#if BUILDFLAG(IS_IOS)
-        value.empty() ||
-#endif  // BUILDFLAG(IS_IOS)
-        value == switches::kSkiaGraphiteBackendMetal) {
+    if (value == switches::kSkiaGraphiteBackendMetal) {
       return GrContextType::kGraphiteMetal;
     }
 #endif  // BUILDFLAG(SKIA_USE_METAL)
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc
index 986c9c88..8fbf6d43 100644
--- a/gpu/config/gpu_finch_features.cc
+++ b/gpu/config/gpu_finch_features.cc
@@ -358,11 +358,7 @@
 // --enable-skia-graphite & --disable-skia-graphite.
 BASE_FEATURE(kSkiaGraphite,
              "SkiaGraphite",
-#if BUILDFLAG(IS_IOS)
-             base::FEATURE_ENABLED_BY_DEFAULT
-#else
              base::FEATURE_DISABLED_BY_DEFAULT
-#endif
 );
 
 // Whether the Dawn "skip_validation" toggle is enabled for Skia Graphite.
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index b8357f51..c5ef650 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -92151,7 +92151,7 @@
       name: "mac-angle-chromium-try"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-angle-chromium-try"
-      dimensions: "cpu:arm64"
+      dimensions: "cpu:x86-64"
       dimensions: "os:Mac"
       dimensions: "pool:luci.chromium.try"
       exe {
diff --git a/infra/config/generated/testing/test_suites.pyl b/infra/config/generated/testing/test_suites.pyl
index c23beb6..e5cd5d7e 100644
--- a/infra/config/generated/testing/test_suites.pyl
+++ b/infra/config/generated/testing/test_suites.pyl
@@ -3852,7 +3852,14 @@
       'boringssl_ssl_tests': {},
       'capture_unittests': {},
       'cast_unittests': {},
-      'cc_unittests': {},
+      'cc_unittests': {
+        'test': 'cc_unittests',
+        'args': [
+          '--test-launcher-bot-mode',
+          '--test-launcher-filter-file=testing/buildbot/filters/ios.cc_unittests.filter',
+          '--use-gpu-in-tests',
+        ],
+      },
       'components_browsertests': {},
       'components_unittests': {},
       'content_browsertests': {
@@ -3887,6 +3894,24 @@
       'libjingle_xmpp_unittests': {},
       'liburlpattern_unittests': {},
       'media_unittests': {},
+      'media_unittests_skia_graphite_dawn': {
+        'test': 'media_unittests',
+        'args': [
+          '--test-launcher-bot-mode',
+          '--enable-features=SkiaGraphite',
+          '--skia-graphite-backend=dawn',
+          '--use-gpu-in-tests',
+        ],
+      },
+      'media_unittests_skia_graphite_metal': {
+        'test': 'media_unittests',
+        'args': [
+          '--test-launcher-bot-mode',
+          '--enable-features=SkiaGraphite',
+          '--skia-graphite-backend=metal',
+          '--use-gpu-in-tests',
+        ],
+      },
       'midi_unittests': {},
       'mojo_unittests': {},
       'net_unittests': {},
@@ -3905,7 +3930,14 @@
       'ui_touch_selection_unittests': {},
       'ui_unittests': {},
       'url_unittests': {},
-      'viz_unittests': {},
+      'viz_unittests': {
+        'test': 'viz_unittests',
+        'args': [
+          '--test-launcher-bot-mode',
+          '--test-launcher-filter-file=testing/buildbot/filters/ios.viz_unittests.filter',
+          '--use-gpu-in-tests',
+        ],
+      },
       'wtf_unittests': {},
       'zlib_unittests': {},
     },
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star b/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star
index 47ca374..01b9dc74 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 """Definitions of builders in the tryserver.chromium.angle builder group."""
 
-load("//lib/builders.star", "cpu", "os", "reclient")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/consoles.star", "consoles")
 load("//lib/try.star", "try_")
@@ -75,7 +75,6 @@
     ),
     cores = None,
     os = os.MAC_ANY,
-    cpu = cpu.ARM64,
 )
 
 try_.builder(
diff --git a/infra/config/targets/basic_suites.star b/infra/config/targets/basic_suites.star
index eb2dd71..f3481d1 100644
--- a/infra/config/targets/basic_suites.star
+++ b/infra/config/targets/basic_suites.star
@@ -4504,7 +4504,14 @@
         "boringssl_ssl_tests": None,
         "capture_unittests": None,
         "cast_unittests": None,
-        "cc_unittests": None,
+        "cc_unittests": targets.legacy_test_config(
+            test = "cc_unittests",
+            args = [
+                "--test-launcher-bot-mode",
+                "--test-launcher-filter-file=testing/buildbot/filters/ios.cc_unittests.filter",
+                "--use-gpu-in-tests",
+            ],
+        ),
         "components_browsertests": None,
         "components_unittests": None,
         "content_browsertests": targets.legacy_test_config(
@@ -4539,6 +4546,24 @@
         "libjingle_xmpp_unittests": None,
         "liburlpattern_unittests": None,
         "media_unittests": None,
+        "media_unittests_skia_graphite_dawn": targets.legacy_test_config(
+            test = "media_unittests",
+            args = [
+                "--test-launcher-bot-mode",
+                "--enable-features=SkiaGraphite",
+                "--skia-graphite-backend=dawn",
+                "--use-gpu-in-tests",
+            ],
+        ),
+        "media_unittests_skia_graphite_metal": targets.legacy_test_config(
+            test = "media_unittests",
+            args = [
+                "--test-launcher-bot-mode",
+                "--enable-features=SkiaGraphite",
+                "--skia-graphite-backend=metal",
+                "--use-gpu-in-tests",
+            ],
+        ),
         "midi_unittests": None,
         "mojo_unittests": None,
         "net_unittests": None,
@@ -4557,7 +4582,14 @@
         "ui_touch_selection_unittests": None,
         "ui_unittests": None,
         "url_unittests": None,
-        "viz_unittests": None,
+        "viz_unittests": targets.legacy_test_config(
+            test = "viz_unittests",
+            args = [
+                "--test-launcher-bot-mode",
+                "--test-launcher-filter-file=testing/buildbot/filters/ios.viz_unittests.filter",
+                "--use-gpu-in-tests",
+            ],
+        ),
         "wtf_unittests": None,
         "zlib_unittests": None,
     },
diff --git a/internal b/internal
index 8c572c9..1b190e3 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit 8c572c92ad2038d9a0488d55599a138ab24941eb
+Subproject commit 1b190e361c56e70d2c0e57fc9b56dc7af3a75fea
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index 0dd47928..ce06edc 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -140,6 +140,9 @@
 #import "ios/chrome/browser/credential_provider/model/credential_provider_service_factory.h"
 #import "ios/chrome/browser/credential_provider/model/credential_provider_support.h"
 #import "ios/chrome/browser/credential_provider/model/credential_provider_util.h"
+#endif
+
+#if BUILDFLAG(FAST_APP_TERMINATE_ENABLED)
 #import "ios/chrome/browser/sessions/session_restoration_service.h"
 #import "ios/chrome/browser/sessions/session_restoration_service_factory.h"
 #endif
diff --git a/ios/chrome/app/spotlight/open_tabs_spotlight_manager.mm b/ios/chrome/app/spotlight/open_tabs_spotlight_manager.mm
index 3ea9c2a..fc75a660 100644
--- a/ios/chrome/app/spotlight/open_tabs_spotlight_manager.mm
+++ b/ios/chrome/app/spotlight/open_tabs_spotlight_manager.mm
@@ -328,13 +328,16 @@
 
 /// Stops observing all objects and resets bridges.
 - (void)shutdownAllObservation {
-  if (!self.browserList) {
+  if (!_browserList) {
     return;
   }
 
   // Stop observing all webstates.
-  for (Browser* browser : self.browserList->AllRegularBrowsers()) {
+  for (Browser* browser : _browserList->AllRegularBrowsers()) {
     WebStateList* webStateList = browser->GetWebStateList();
+    if (!webStateList) {
+      continue;
+    }
     for (int i = 0; i < webStateList->count(); i++) {
       WebState* webState = webStateList->GetWebStateAt(i);
       webState->RemoveObserver(_webStateObserverBridge.get());
diff --git a/ios/chrome/browser/credential_provider/model/archivable_credential+password_form.mm b/ios/chrome/browser/credential_provider/model/archivable_credential+password_form.mm
index cb6899d..b4fc06a 100644
--- a/ios/chrome/browser/credential_provider/model/archivable_credential+password_form.mm
+++ b/ios/chrome/browser/credential_provider/model/archivable_credential+password_form.mm
@@ -32,7 +32,7 @@
   form.url = password_manager_util::StripAuthAndParams(url);
   form.signon_realm = form.url.DeprecatedGetOriginAsURL().spec();
   form.username_value = SysNSStringToUTF16(credential.user);
-  form.keychain_identifier = SysNSStringToUTF8(credential.keychainIdentifier);
+  form.password_value = SysNSStringToUTF16(credential.password);
   form.times_used_in_html_form = credential.rank;
   form.SetNoteWithEmptyUniqueDisplayName(SysNSStringToUTF16(credential.note));
 
@@ -49,8 +49,6 @@
   }
   std::string site_name =
       password_manager::GetShownOrigin(url::Origin::Create(passwordForm.url));
-  NSString* keychainIdentifier =
-      SysUTF8ToNSString(passwordForm.keychain_identifier);
 
   NSString* serviceName = SysUTF8ToNSString(site_name);
   NSString* note =
@@ -89,7 +87,7 @@
   DCHECK(serviceIdentifier.length);
 
   return [self initWithFavicon:favicon
-            keychainIdentifier:keychainIdentifier
+                      password:SysUTF16ToNSString(passwordForm.password_value)
                           rank:passwordForm.times_used_in_html_form
               recordIdentifier:RecordIdentifierForPasswordForm(passwordForm)
              serviceIdentifier:serviceIdentifier
diff --git a/ios/chrome/browser/credential_provider/model/archivable_credential+password_form_unittest.mm b/ios/chrome/browser/credential_provider/model/archivable_credential+password_form_unittest.mm
index 9ea56b6..d4a37593 100644
--- a/ios/chrome/browser/credential_provider/model/archivable_credential+password_form_unittest.mm
+++ b/ios/chrome/browser/credential_provider/model/archivable_credential+password_form_unittest.mm
@@ -20,7 +20,7 @@
 TEST_F(ArchivableCredentialPasswordFormTest, Creation) {
   NSString* username = @"username_value";
   NSString* favicon = @"favicon_value";
-  NSString* keychainIdentifier = @"keychain_identifier_value";
+  NSString* password = @"Qwerty123!";
   NSString* url = @"http://www.alpha.example.com/path/and?args=8";
 
   PasswordForm passwordForm;
@@ -28,8 +28,7 @@
   passwordForm.username_element = u"username_element";
   passwordForm.password_element = u"password_element";
   passwordForm.username_value = base::SysNSStringToUTF16(username);
-  passwordForm.keychain_identifier =
-      base::SysNSStringToUTF8(keychainIdentifier);
+  passwordForm.password_value = base::SysNSStringToUTF16(password);
   passwordForm.url = GURL(base::SysNSStringToUTF16(url));
   ArchivableCredential* credential =
       [[ArchivableCredential alloc] initWithPasswordForm:passwordForm
@@ -39,7 +38,7 @@
   EXPECT_EQ(passwordForm.times_used_in_html_form, credential.rank);
   EXPECT_NSEQ(username, credential.user);
   EXPECT_NSEQ(favicon, credential.favicon);
-  EXPECT_NSEQ(keychainIdentifier, credential.keychainIdentifier);
+  EXPECT_NSEQ(password, credential.password);
   EXPECT_NSEQ(@"alpha.example.com", credential.serviceName);
   EXPECT_NSEQ(@"http://www.alpha.example.com/path/and?args=8|"
               @"username_element|username_value|password_element|",
@@ -98,13 +97,13 @@
 // Tests the creation of a PasswordForm from a Credential.
 TEST_F(ArchivableCredentialPasswordFormTest, PasswordFormFromCredential) {
   NSString* username = @"username_value";
-  NSString* keychainIdentifier = @"keychain_identifier_value";
+  NSString* password = @"password";
   NSString* url = @"http://www.alpha.example.com/path/and?args=8";
   NSString* recordIdentifier = @"recordIdentifier";
 
   id<Credential> credential =
       [[ArchivableCredential alloc] initWithFavicon:nil
-                                 keychainIdentifier:keychainIdentifier
+                                           password:password
                                                rank:1
                                    recordIdentifier:recordIdentifier
                                   serviceIdentifier:url
@@ -116,8 +115,7 @@
   PasswordForm passwordForm = PasswordFormFromCredential(credential);
   EXPECT_EQ(passwordForm.times_used_in_html_form, credential.rank);
   EXPECT_EQ(passwordForm.username_value, base::SysNSStringToUTF16(username));
-  EXPECT_EQ(passwordForm.keychain_identifier,
-            base::SysNSStringToUTF8(keychainIdentifier));
+  EXPECT_EQ(passwordForm.password_value, base::SysNSStringToUTF16(password));
   EXPECT_EQ(passwordForm.url, GURL("http://www.alpha.example.com/path/and"));
   EXPECT_EQ(passwordForm.signon_realm, "http://www.alpha.example.com/");
 }
@@ -127,7 +125,7 @@
 TEST_F(ArchivableCredentialPasswordFormTest, CreationWithMobileURL) {
   NSString* username = @"username_value";
   NSString* favicon = @"favicon_value";
-  NSString* keychainIdentifier = @"keychain_identifier_value";
+  NSString* password = @"qwerty123";
   NSString* url = @"http://m.alpha.example.com/path/and?args=8";
 
   PasswordForm passwordForm;
@@ -135,8 +133,7 @@
   passwordForm.username_element = u"username_element";
   passwordForm.password_element = u"password_element";
   passwordForm.username_value = base::SysNSStringToUTF16(username);
-  passwordForm.keychain_identifier =
-      base::SysNSStringToUTF8(keychainIdentifier);
+  passwordForm.password_value = base::SysNSStringToUTF16(password);
   passwordForm.url = GURL(base::SysNSStringToUTF16(url));
   ArchivableCredential* credential =
       [[ArchivableCredential alloc] initWithPasswordForm:passwordForm
@@ -146,7 +143,7 @@
   EXPECT_EQ(passwordForm.times_used_in_html_form, credential.rank);
   EXPECT_NSEQ(username, credential.user);
   EXPECT_NSEQ(favicon, credential.favicon);
-  EXPECT_NSEQ(keychainIdentifier, credential.keychainIdentifier);
+  EXPECT_NSEQ(password, credential.password);
   EXPECT_NSEQ(@"alpha.example.com", credential.serviceName);
   EXPECT_NSEQ(@"http://m.alpha.example.com/path/and?args=8|"
               @"username_element|username_value|password_element|",
diff --git a/ios/chrome/browser/credential_provider/model/credential_provider_migrator_unittest.mm b/ios/chrome/browser/credential_provider/model/credential_provider_migrator_unittest.mm
index 1070b90..1071296 100644
--- a/ios/chrome/browser/credential_provider/model/credential_provider_migrator_unittest.mm
+++ b/ios/chrome/browser/credential_provider/model/credential_provider_migrator_unittest.mm
@@ -27,12 +27,12 @@
 
 ArchivableCredential* TestCredential() {
   NSString* username = @"username_value";
-  NSString* keychainIdentifier = @"keychain_identifier_value";
+  NSString* password = @"qwerty123";
   NSString* url = @"http://www.alpha.example.com/path/and?args=8";
   NSString* recordIdentifier = @"recordIdentifier";
   NSString* note = @"note";
   return [[ArchivableCredential alloc] initWithFavicon:nil
-                                    keychainIdentifier:keychainIdentifier
+                                              password:password
                                                   rank:1
                                       recordIdentifier:recordIdentifier
                                      serviceIdentifier:url
diff --git a/ios/chrome/browser/credential_provider/model/credential_provider_service_unittest.mm b/ios/chrome/browser/credential_provider/model/credential_provider_service_unittest.mm
index b7aedfb..7ffdce8b 100644
--- a/ios/chrome/browser/credential_provider/model/credential_provider_service_unittest.mm
+++ b/ios/chrome/browser/credential_provider/model/credential_provider_service_unittest.mm
@@ -160,7 +160,7 @@
   password_manager::PasswordForm form;
   form.url = GURL("http://g.com");
   form.username_value = u"user";
-  form.keychain_identifier = "encrypted-pwd";
+  form.password_value = u"qwerty123";
   password_store_->AddLogin(form);
   base::RunLoop().RunUntilIdle();
 
@@ -172,8 +172,7 @@
   ASSERT_EQ(credential_store_.credentials.count, 1u);
   EXPECT_NSEQ(credential_store_.credentials[0].serviceName, @"g.com");
   EXPECT_NSEQ(credential_store_.credentials[0].user, @"user");
-  EXPECT_NSEQ(credential_store_.credentials[0].keychainIdentifier,
-              @"encrypted-pwd");
+  EXPECT_NSEQ(credential_store_.credentials[0].password, @"qwerty123");
 }
 
 TEST_F(CredentialProviderServiceTest, TwoStores) {
@@ -230,24 +229,20 @@
   form.signon_realm = "http://www.example.com/";
   form.action = GURL("http://www.example.com/action");
   form.password_element = u"pwd";
-  form.keychain_identifier = "example";
+  form.password_value = u"qwerty123";
   password_store_->AddLogin(form);
   task_environment_.RunUntilIdle();
 
   // Expect the store to be populated with 1 credential.
   ASSERT_EQ(1u, credential_store_.credentials.count);
-  NSString* keychainIdentifier =
-      credential_store_.credentials[0].keychainIdentifier;
 
-  form.keychain_identifier = "secret";
+  form.password_value = u"Qwerty123!";
   password_store_->UpdateLogin(form);
   task_environment_.RunUntilIdle();
 
-  // Expect that the credential in the store now has a different keychain
-  // identifier.
+  // Expect that the credential in the store now has the same password.
   ASSERT_EQ(1u, credential_store_.credentials.count);
-  EXPECT_NSNE(keychainIdentifier,
-              credential_store_.credentials[0].keychainIdentifier);
+  EXPECT_NSEQ(credential_store_.credentials[0].password, @"Qwerty123!");
 
   password_store_->RemoveLogin(form);
   task_environment_.RunUntilIdle();
diff --git a/ios/chrome/browser/credential_provider/model/credential_provider_util.mm b/ios/chrome/browser/credential_provider/model/credential_provider_util.mm
index d4fff85..0af9a01 100644
--- a/ios/chrome/browser/credential_provider/model/credential_provider_util.mm
+++ b/ios/chrome/browser/credential_provider/model/credential_provider_util.mm
@@ -264,14 +264,14 @@
       // Add favicon name to the credential and update the store.
       filename = GetFaviconFileKey(url);
       ArchivableCredential* newCredential = [[ArchivableCredential alloc]
-             initWithFavicon:filename
-          keychainIdentifier:credential.keychainIdentifier
-                        rank:credential.rank
-            recordIdentifier:credential.recordIdentifier
-           serviceIdentifier:credential.serviceIdentifier
-                 serviceName:credential.serviceName
-                        user:credential.user
-                        note:credential.note];
+            initWithFavicon:filename
+                   password:credential.password
+                       rank:credential.rank
+           recordIdentifier:credential.recordIdentifier
+          serviceIdentifier:credential.serviceIdentifier
+                serviceName:credential.serviceName
+                       user:credential.user
+                       note:credential.note];
       if ([archivable_store
               credentialWithRecordIdentifier:newCredential.recordIdentifier]) {
         [archivable_store updateCredential:newCredential];
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 91ce9478..f1750ae 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -1091,9 +1091,6 @@
     {"ios-password-ui-split", flag_descriptions::kIOSPasswordUISplitName,
      flag_descriptions::kIOSPasswordUISplitDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(password_manager::features::kIOSPasswordUISplit)},
-    {"ios-set-up-list", flag_descriptions::kIOSSetUpListName,
-     flag_descriptions::kIOSSetUpListDescription, flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(kIOSSetUpList)},
     {"ios-password-bottom-sheet",
      flag_descriptions::kIOSPasswordBottomSheetName,
      flag_descriptions::kIOSPasswordBottomSheetDescription, flags_ui::kOsIos,
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index 131e5804..df3ebe4 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -588,10 +588,6 @@
 const char kIOSSaveToPhotosDescription[] =
     "Enables the Save to Photos feature on iOS.";
 
-const char kIOSSetUpListName[] = "IOS Set Up List";
-const char kIOSSetUpListDescription[] =
-    "Displays an unobtrusive list of set up tasks on Home for a new user.";
-
 const char kIOSPasswordBottomSheetName[] = "IOS Password Manager Bottom Sheet";
 const char kIOSPasswordBottomSheetDescription[] =
     "Enables the display of the password bottom sheet on IOS.";
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index 1ec713e..fa9bb586 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -495,10 +495,6 @@
 extern const char kIOSPasswordUISplitName[];
 extern const char kIOSPasswordUISplitDescription[];
 
-// Title and description for the flag to display the Set Up List.
-extern const char kIOSSetUpListName[];
-extern const char kIOSSetUpListDescription[];
-
 // Title and description for the flag to enable password bottom sheet on IOS.
 extern const char kIOSPasswordBottomSheetName[];
 extern const char kIOSPasswordBottomSheetDescription[];
diff --git a/ios/chrome/browser/passwords/model/password_tab_helper.mm b/ios/chrome/browser/passwords/model/password_tab_helper.mm
index 58e48ab..f952fd9 100644
--- a/ios/chrome/browser/passwords/model/password_tab_helper.mm
+++ b/ios/chrome/browser/passwords/model/password_tab_helper.mm
@@ -73,8 +73,7 @@
         HandlerForProtocol(controller_.dispatcher, ApplicationSettingsCommands);
 
     [settings_command_handler showSavedPasswordsSettingsFromViewController:nil
-                                                          showCancelButton:NO
-                                                        startPasswordCheck:NO];
+                                                          showCancelButton:NO];
     std::move(callback).Run(
         web::WebStatePolicyDecider::PolicyDecision::Cancel());
     UMA_HISTOGRAM_ENUMERATION(
diff --git a/ios/chrome/browser/passwords/model/password_tab_helper_unittest.mm b/ios/chrome/browser/passwords/model/password_tab_helper_unittest.mm
index 079ac57..97bad3fc 100644
--- a/ios/chrome/browser/passwords/model/password_tab_helper_unittest.mm
+++ b/ios/chrome/browser/passwords/model/password_tab_helper_unittest.mm
@@ -94,8 +94,7 @@
       });
 
   OCMExpect([dispatcher_ showSavedPasswordsSettingsFromViewController:nil
-                                                     showCancelButton:NO
-                                                   startPasswordCheck:NO]);
+                                                     showCancelButton:NO]);
 
   helper_->ShouldAllowRequest(request, request_info, std::move(callback));
 
diff --git a/ios/chrome/browser/push_notification/model/BUILD.gn b/ios/chrome/browser/push_notification/model/BUILD.gn
index 3a0d13f..714a9ec7 100644
--- a/ios/chrome/browser/push_notification/model/BUILD.gn
+++ b/ios/chrome/browser/push_notification/model/BUILD.gn
@@ -115,7 +115,3 @@
     "//base",
   ]
 }
-
-source_set("model") {
-  public_deps = [ ":push_notification_service" ]
-}
diff --git a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
index 4ec6fe4..e0cb006 100644
--- a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
+++ b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
@@ -2000,8 +2000,7 @@
 // TODO(crbug.com/779791) : Remove show settings commands from MainController.
 - (void)showSavedPasswordsSettingsFromViewController:
             (UIViewController*)baseViewController
-                                    showCancelButton:(BOOL)showCancelButton
-                                  startPasswordCheck:(BOOL)startPasswordCheck {
+                                    showCancelButton:(BOOL)showCancelButton {
   if (!baseViewController) {
     // TODO(crbug.com/779791): Don't pass base view controller through
     // dispatched command.
@@ -2014,8 +2013,7 @@
   if (self.settingsNavigationController) {
     [self.settingsNavigationController
         showSavedPasswordsSettingsFromViewController:baseViewController
-                                    showCancelButton:showCancelButton
-                                  startPasswordCheck:startPasswordCheck];
+                                    showCancelButton:showCancelButton];
     return;
   }
   Browser* browser = self.mainInterface.browser;
diff --git a/ios/chrome/browser/shared/public/commands/application_commands.h b/ios/chrome/browser/shared/public/commands/application_commands.h
index 926cd7f..d229957 100644
--- a/ios/chrome/browser/shared/public/commands/application_commands.h
+++ b/ios/chrome/browser/shared/public/commands/application_commands.h
@@ -59,16 +59,12 @@
 - (void)showSyncPassphraseSettingsFromViewController:
     (UIViewController*)baseViewController;
 
-// TODO(crbug.com/1406871): Remove the `startPasswordCheck` parameter when
-// kIOSPasswordCheckup feature is enabled by default.
 // Shows the list of saved passwords in the settings. `showCancelButton`
 // indicates whether a cancel button should be added as the left navigation item
-// of the saved passwords view. `startPasswordCheck` indicates whether a
-// password check should be started when the saved passwords are shown.
+// of the saved passwords view.
 - (void)showSavedPasswordsSettingsFromViewController:
             (UIViewController*)baseViewController
-                                    showCancelButton:(BOOL)showCancelButton
-                                  startPasswordCheck:(BOOL)startPasswordCheck;
+                                    showCancelButton:(BOOL)showCancelButton;
 
 // Shows the password details page for a credential.
 // `showCancelButton` indicates whether a cancel button should be added as the
diff --git a/ios/chrome/browser/shared/public/features/features.h b/ios/chrome/browser/shared/public/features/features.h
index a027661d..4c38ee1 100644
--- a/ios/chrome/browser/shared/public/features/features.h
+++ b/ios/chrome/browser/shared/public/features/features.h
@@ -287,9 +287,6 @@
 // Feature flag to enable feed experiment tagging.
 BASE_DECLARE_FEATURE(kEnableFeedExperimentTagging);
 
-// Feature flag to enable the Set Up List.
-BASE_DECLARE_FEATURE(kIOSSetUpList);
-
 // Feature flag to disable Discover-controlled foregrounding refreshes.
 BASE_DECLARE_FEATURE(kFeedDisableHotStartRefresh);
 
@@ -494,9 +491,6 @@
 // Whether the feed experiment tagging is enabled.
 bool IsFeedExperimentTaggingEnabled();
 
-// Whether the Set Up List feature is enabled.
-bool IsIOSSetUpListEnabled();
-
 // Whether Discover-controlled foregrounding refreshes are disabled.
 bool IsFeedHotStartRefreshDisabled();
 
diff --git a/ios/chrome/browser/shared/public/features/features.mm b/ios/chrome/browser/shared/public/features/features.mm
index ce8fa2bf..3003536 100644
--- a/ios/chrome/browser/shared/public/features/features.mm
+++ b/ios/chrome/browser/shared/public/features/features.mm
@@ -334,8 +334,6 @@
              "EnableFeedExperimentTagging",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-BASE_FEATURE(kIOSSetUpList, "IOSSetUpList", base::FEATURE_ENABLED_BY_DEFAULT);
-
 BASE_FEATURE(kFeedDisableHotStartRefresh,
              "FeedDisableHotStartRefresh",
              base::FEATURE_DISABLED_BY_DEFAULT);
@@ -631,10 +629,6 @@
   return base::FeatureList::IsEnabled(kEnableFeedExperimentTagging);
 }
 
-bool IsIOSSetUpListEnabled() {
-  return base::FeatureList::IsEnabled(kIOSSetUpList);
-}
-
 bool IsFeedHotStartRefreshDisabled() {
   return base::FeatureList::IsEnabled(kFeedDisableHotStartRefresh);
 }
diff --git a/ios/chrome/browser/supervised_user/model/supervised_user_service_factory.mm b/ios/chrome/browser/supervised_user/model/supervised_user_service_factory.mm
index 526f96d3..8a4da1f 100644
--- a/ios/chrome/browser/supervised_user/model/supervised_user_service_factory.mm
+++ b/ios/chrome/browser/supervised_user/model/supervised_user_service_factory.mm
@@ -97,7 +97,7 @@
   return std::make_unique<supervised_user::SupervisedUserService>(
       IdentityManagerFactory::GetForBrowserState(browser_state),
       KidsChromeManagementClientFactory::GetForBrowserState(browser_state),
-      *user_prefs, *settings_service, *sync_service,
+      *user_prefs, *settings_service, sync_service,
       // iOS does not support extensions, check_webstore_url_callback returns
       // false.
       base::BindRepeating([](const GURL& url) { return false; }),
diff --git a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_mediator_unittest.mm b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_mediator_unittest.mm
index a27e7fc..d3877db 100644
--- a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_mediator_unittest.mm
@@ -25,9 +25,7 @@
 
 const char kTestNumber[] = "4234567890123456";  // Visa
 
-const autofill::Suggestion::Suggestion::BackendId kTestGuid =
-    autofill::Suggestion::Suggestion::BackendId(
-        "00000000-0000-0000-0000-000000000001");
+const char kTestGuid[] = "00000000-0000-0000-0000-000000000001";
 
 }  // namespace
 
@@ -106,7 +104,7 @@
   // 1 card.
   void CreateMediatorWithSuggestions() {
     CreateMediator();
-    CreateCreditCard(kTestGuid.value());
+    CreateCreditCard(kTestGuid);
     personal_data_manager_->SetSyncingForTest(true);
   }
 
@@ -114,7 +112,7 @@
   // 1 local card.
   void CreateMediatorWithLocalCardOnlySuggestions() {
     CreateMediator();
-    CreateCreditCard(kTestGuid.value(), kTestNumber, 0,
+    CreateCreditCard(kTestGuid, kTestNumber, 0,
                      autofill::CreditCard::RecordType::kLocalCard);
     personal_data_manager_->SetSyncingForTest(true);
   }
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
index e5fedc2d..fcf431e8 100644
--- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -987,8 +987,6 @@
       HandlerForProtocol(_dispatcher, FindInPageCommands);
   _viewControllerDependencies.isOffTheRecord = browserState->IsOffTheRecord();
   _viewControllerDependencies.urlLoadingBrowserAgent = _urlLoadingBrowserAgent;
-  _viewControllerDependencies.urlLoadingNotifierBrowserAgent =
-      _urlLoadingNotifierBrowserAgent;
   _viewControllerDependencies.tabUsageRecorderBrowserAgent =
       TabUsageRecorderBrowserAgent::FromBrowser(self.browser);
   _viewControllerDependencies.layoutGuideCenter = _layoutGuideCenter;
@@ -1061,7 +1059,6 @@
   _viewControllerDependencies.applicationCommandsHandler = nil;
   _viewControllerDependencies.findInPageCommandsHandler = nil;
   _viewControllerDependencies.urlLoadingBrowserAgent = nil;
-  _viewControllerDependencies.urlLoadingNotifierBrowserAgent = nil;
   _viewControllerDependencies.tabUsageRecorderBrowserAgent = nil;
   _viewControllerDependencies.layoutGuideCenter = nil;
   _viewControllerDependencies.voiceSearchController = nil;
@@ -1242,15 +1239,13 @@
   self.tabLifecycleMediator.priceNotificationsIPHPresenter =
       self.priceNotificationsIPHCoordinator;
 
-  if (IsCredentialProviderExtensionPromoEnabled() || IsIOSSetUpListEnabled()) {
-    _credentialProviderPromoCoordinator =
-        [[CredentialProviderPromoCoordinator alloc]
-            initWithBaseViewController:self.viewController
-                               browser:self.browser];
-    _credentialProviderPromoCoordinator.promosUIHandler =
-        _promosManagerCoordinator;
-    [_credentialProviderPromoCoordinator start];
-  }
+  _credentialProviderPromoCoordinator =
+      [[CredentialProviderPromoCoordinator alloc]
+          initWithBaseViewController:self.viewController
+                             browser:self.browser];
+  _credentialProviderPromoCoordinator.promosUIHandler =
+      _promosManagerCoordinator;
+  [_credentialProviderPromoCoordinator start];
 }
 
 // Stops child coordinators.
@@ -1968,13 +1963,9 @@
 
 - (void)maybeDisplayPromo {
   if (!self.promosManagerCoordinator) {
-    id<CredentialProviderPromoCommands> credentialProviderPromoHandler = nil;
-    if (IsCredentialProviderExtensionPromoEnabled() ||
-        IsIOSSetUpListEnabled()) {
-      credentialProviderPromoHandler =
-          HandlerForProtocol(self.browser->GetCommandDispatcher(),
-                             CredentialProviderPromoCommands);
-    }
+    id<CredentialProviderPromoCommands> credentialProviderPromoHandler =
+        HandlerForProtocol(self.browser->GetCommandDispatcher(),
+                           CredentialProviderPromoCommands);
     self.promosManagerCoordinator = [[PromosManagerCoordinator alloc]
             initWithBaseViewController:self.viewController
                                browser:self.browser
@@ -2070,8 +2061,7 @@
 - (void)openPasswordManager {
   [HandlerForProtocol(self.dispatcher, ApplicationCommands)
       showSavedPasswordsSettingsFromViewController:self.viewController
-                                  showCancelButton:YES
-                                startPasswordCheck:NO];
+                                  showCancelButton:YES];
 }
 
 - (void)openPasswordSettings {
@@ -3063,8 +3053,7 @@
       HandlerForProtocol(_dispatcher, ApplicationCommands);
   [applicationCommandsHandler
       showSavedPasswordsSettingsFromViewController:self.viewController
-                                  showCancelButton:YES
-                                startPasswordCheck:NO];
+                                  showCancelButton:YES];
 }
 
 - (void)showPasswordDetailsForCredential:
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.h b/ios/chrome/browser/ui/browser_view/browser_view_controller.h
index cfe61132..e412446 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.h
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.h
@@ -49,7 +49,6 @@
 @class LayoutGuideCenter;
 @protocol LoadQueryCommands;
 class UrlLoadingBrowserAgent;
-class UrlLoadingNotifierBrowserAgent;
 @protocol VoiceSearchController;
 class WebStateUpdateBrowserAgent;
 
@@ -73,7 +72,6 @@
   BOOL isOffTheRecord;
   PagePlaceholderBrowserAgent* pagePlaceholderBrowserAgent;
   UrlLoadingBrowserAgent* urlLoadingBrowserAgent;
-  UrlLoadingNotifierBrowserAgent* urlLoadingNotifierBrowserAgent;
   id<VoiceSearchController> voiceSearchController;
   TabUsageRecorderBrowserAgent* tabUsageRecorderBrowserAgent;
   base::WeakPtr<WebStateList> webStateList;
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index f217ff1..4ec56a3 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -78,7 +78,6 @@
 #import "ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_coordinator.h"
 #import "ios/chrome/browser/url_loading/model/url_loading_browser_agent.h"
-#import "ios/chrome/browser/url_loading/model/url_loading_notifier_browser_agent.h"
 #import "ios/chrome/browser/url_loading/model/url_loading_params.h"
 #import "ios/chrome/browser/web/page_placeholder_browser_agent.h"
 #import "ios/chrome/browser/web/page_placeholder_tab_helper.h"
@@ -221,9 +220,6 @@
   // The service used to load url parameters in current or new tab.
   UrlLoadingBrowserAgent* _urlLoadingBrowserAgent;
 
-  // Used to notify observers of url loading state change.
-  UrlLoadingNotifierBrowserAgent* _urlLoadingNotifierBrowserAgent;
-
   // Used to report usage of a single Browser's tab.
   TabUsageRecorderBrowserAgent* _tabUsageRecorderBrowserAgent;
 
@@ -373,8 +369,6 @@
     self.findInPageCommandsHandler = dependencies.findInPageCommandsHandler;
     _isOffTheRecord = dependencies.isOffTheRecord;
     _urlLoadingBrowserAgent = dependencies.urlLoadingBrowserAgent;
-    _urlLoadingNotifierBrowserAgent =
-        dependencies.urlLoadingNotifierBrowserAgent;
     _tabUsageRecorderBrowserAgent = dependencies.tabUsageRecorderBrowserAgent;
     _layoutGuideCenter = dependencies.layoutGuideCenter;
     _webStateList = dependencies.webStateList;
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm
index 46f474c7..0cd16b2 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm
@@ -246,14 +246,14 @@
     HostContentSettingsMap* settings_map =
         ios::HostContentSettingsMapFactory::GetForBrowserState(
             chrome_browser_state_.get());
-    UrlLoadingNotifierBrowserAgent* urlLoadingNotifier_ =
+    UrlLoadingNotifierBrowserAgent* url_loading_notifier =
         UrlLoadingNotifierBrowserAgent::FromBrowser(browser_.get());
 
     bubble_presenter_ = [[BubblePresenter alloc]
         initWithDeviceSwitcherResultDispatcher:nullptr
                         hostContentSettingsMap:(HostContentSettingsMap*)
                                                    settings_map
-                               loadingNotifier:urlLoadingNotifier_
+                               loadingNotifier:url_loading_notifier
                                    prefService:chrome_browser_state_.get()
                                                    ->GetPrefs()
                                     sceneState:scene_state_
@@ -285,9 +285,6 @@
     bookmarks_coordinator_ =
         [[BookmarksCoordinator alloc] initWithBrowser:browser_.get()];
 
-    url_loading_notifier_browser_agent_ =
-        UrlLoadingNotifierBrowserAgent::FromBrowser(browser_.get());
-
     tab_usage_recorder_browser_agent_ =
         TabUsageRecorderBrowserAgent::FromBrowser(browser_.get());
     page_placeholder_browser_agent_ =
@@ -307,8 +304,6 @@
     dependencies.sideSwipeMediator = side_swipe_mediator_;
     dependencies.bookmarksCoordinator = bookmarks_coordinator_;
     dependencies.fullscreenController = fullscreen_controller_;
-    dependencies.urlLoadingNotifierBrowserAgent =
-        url_loading_notifier_browser_agent_;
     dependencies.tabUsageRecorderBrowserAgent =
         tab_usage_recorder_browser_agent_;
     dependencies.layoutGuideCenter =
@@ -332,7 +327,7 @@
         initWithWebStateList:browser_.get()->GetWebStateList()
               ntpCoordinator:NTPCoordinator_
                 browserState:chrome_browser_state_.get()
-             loadingNotifier:urlLoadingNotifier_];
+             loadingNotifier:url_loading_notifier];
     tab_events_mediator_.consumer = bvc_;
 
     // Force the view to load.
@@ -443,7 +438,6 @@
   FullscreenController* fullscreen_controller_;
   TabEventsMediator* tab_events_mediator_;
   NewTabPageCoordinator* NTPCoordinator_;
-  UrlLoadingNotifierBrowserAgent* url_loading_notifier_browser_agent_;
   TabUsageRecorderBrowserAgent* tab_usage_recorder_browser_agent_;
   SafeAreaProvider* safe_area_provider_;
   PagePlaceholderBrowserAgent* page_placeholder_browser_agent_;
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
index e12ba65..54047232 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
@@ -308,8 +308,7 @@
     _syncService = syncService;
     _shoppingService = shoppingService;
 
-    BOOL isSetupListEnabled = IsIOSSetUpListEnabled() &&
-                              set_up_list_utils::IsSetUpListActive(_localState);
+    BOOL isSetupListEnabled = set_up_list_utils::IsSetUpListActive(_localState);
     if (IsTabResumptionEnabled() || isSetupListEnabled) {
       _syncObserverBridge =
           std::make_unique<SyncObserverBridge>(self, _syncService);
@@ -596,20 +595,18 @@
 - (void)onPrimaryAccountChanged:
     (const signin::PrimaryAccountChangeEvent&)event {
   switch (event.GetEventTypeFor(signin::ConsentLevel::kSignin)) {
-    case signin::PrimaryAccountChangeEvent::Type::kSet:
-      if (IsIOSSetUpListEnabled()) {
-        // User has signed in, mark SetUpList item complete. Delayed to allow
-        // Signin UI flow to be fully dismissed before starting SetUpList
-        // completion animation.
-        PrefService* localState = _localState;
-        base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
-            FROM_HERE, base::BindOnce(^{
-              set_up_list_prefs::MarkItemComplete(
-                  localState, SetUpListItemType::kSignInSync);
-            }),
-            base::Seconds(0.5));
-      }
-      break;
+    case signin::PrimaryAccountChangeEvent::Type::kSet: {
+      // User has signed in, mark SetUpList item complete. Delayed to allow
+      // Signin UI flow to be fully dismissed before starting SetUpList
+      // completion animation.
+      PrefService* localState = _localState;
+      base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
+          FROM_HERE, base::BindOnce(^{
+            set_up_list_prefs::MarkItemComplete(localState,
+                                                SetUpListItemType::kSignInSync);
+          }),
+          base::Seconds(0.5));
+    } break;
     case signin::PrimaryAccountChangeEvent::Type::kCleared: {
       if (IsTabResumptionEnabled()) {
         // If the user is signed out, remove the tab resumption tile.
@@ -873,7 +870,7 @@
 - (void)sceneState:(SceneState*)sceneState
     transitionedToActivationLevel:(SceneActivationLevel)level {
   if (level == SceneActivationLevelForegroundActive) {
-    if (IsIOSSetUpListEnabled() && _setUpList) {
+    if (_setUpList) {
       [self checkIfCPEEnabled];
     }
   }
@@ -1429,9 +1426,6 @@
 
 // Returns YES if the conditions are right to display the Set Up List.
 - (BOOL)shouldShowSetUpList {
-  if (!IsIOSSetUpListEnabled()) {
-    return NO;
-  }
   if (!set_up_list_utils::IsSetUpListActive(_localState)) {
     return NO;
   }
@@ -1742,15 +1736,13 @@
 #pragma mark - PrefObserverDelegate
 
 - (void)onPreferenceChanged:(const std::string&)preferenceName {
-  if (IsIOSSetUpListEnabled()) {
-    if (preferenceName == prefs::kIosCredentialProviderPromoLastActionTaken &&
-        CredentialProviderPromoDismissed(_localState)) {
-      set_up_list_prefs::MarkItemComplete(_localState,
-                                          SetUpListItemType::kAutofill);
-    } else if (preferenceName == set_up_list_prefs::kDisabled &&
-               set_up_list_prefs::IsSetUpListDisabled(_localState)) {
-      [self hideSetUpList];
-    }
+  if (preferenceName == prefs::kIosCredentialProviderPromoLastActionTaken &&
+      CredentialProviderPromoDismissed(_localState)) {
+    set_up_list_prefs::MarkItemComplete(_localState,
+                                        SetUpListItemType::kAutofill);
+  } else if (preferenceName == set_up_list_prefs::kDisabled &&
+             set_up_list_prefs::IsSetUpListDisabled(_localState)) {
+    [self hideSetUpList];
   }
   if (IsTabResumptionEnabled()) {
     if (_tabResumptionItem &&
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm
index 924c33c..40a9b70 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm
@@ -83,6 +83,22 @@
 using set_up_list_prefs::SetUpListItemState;
 using startup_metric_utils::FirstRunSentinelCreationResult;
 
+#define EXPECT_SET_MAGIC_STACK_ORDER(consumer, ...)                      \
+  {                                                                      \
+    id block_checker = [OCMArg checkWithBlock:^BOOL(id value) {          \
+      NSArray<NSNumber*>* magic_stack_order = (NSArray*)value;           \
+      std::vector<ContentSuggestionsModuleType> expected_order = {       \
+          __VA_ARGS__};                                                  \
+      EXPECT_EQ(magic_stack_order.count, expected_order.size());         \
+      for (unsigned int i = 0; i < expected_order.size(); i++) {         \
+        EXPECT_EQ(magic_stack_order[i].intValue, int(expected_order[i])) \
+            << "For Magic Stack order index " << i;                      \
+      }                                                                  \
+      return YES;                                                        \
+    }];                                                                  \
+    OCMExpect([consumer setMagicStackOrder:block_checker]);              \
+  }
+
 @protocol ContentSuggestionsMediatorDispatcher <BrowserCoordinatorCommands,
                                                 SnackbarCommands>
 @end
@@ -100,8 +116,7 @@
     scoped_feature_list_.InitWithFeaturesAndParameters(
         {{segmentation_platform::features::kSegmentationPlatformFeature, {}},
          {segmentation_platform::features::kSegmentationPlatformIosModuleRanker,
-          {{segmentation_platform::kDefaultModelEnabledParam, "true"}}},
-         {kIOSSetUpList, {}}},
+          {{segmentation_platform::kDefaultModelEnabledParam, "true"}}}},
         {});
 
     TestChromeBrowserState::Builder test_cbs_builder;
@@ -434,15 +449,15 @@
            {{segmentation_platform::kDefaultModelEnabledParam, "true"}}},
           {kMagicStack, {{kMagicStackMostVisitedModuleParam, "true"}}},
       },
-      {kIOSSetUpList});
-  OCMExpect(
-      [consumer_ setMagicStackOrder:[OCMArg checkWithBlock:^BOOL(id value) {
-                   NSArray<NSNumber*>* magicStackOrder = (NSArray*)value;
-                   // Ensure MVT and Shortcuts are returned in that order.
-                   return [magicStackOrder count] == 2 &&
-                          0 == [magicStackOrder[0] intValue] &&
-                          1 == [magicStackOrder[1] intValue];
-                 }]]);
+      {});
+
+  EXPECT_SET_MAGIC_STACK_ORDER(
+      consumer_, ContentSuggestionsModuleType::kSetUpListSync,
+      ContentSuggestionsModuleType::kSetUpListDefaultBrowser,
+      ContentSuggestionsModuleType::kSetUpListAutofill,
+      ContentSuggestionsModuleType::kMostVisited,
+      ContentSuggestionsModuleType::kShortcuts, );
+
   mediator_.consumer = consumer_;
 
   EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
@@ -470,17 +485,15 @@
         {{segmentation_platform::kDefaultModelEnabledParam, "true"}}},
        {kMagicStack, {{kMagicStackMostVisitedModuleParam, "true"}}},
        {kSafetyCheckMagicStack, {}}},
-      {kIOSSetUpList});
-  OCMExpect(
-      [consumer_ setMagicStackOrder:[OCMArg checkWithBlock:^BOOL(id value) {
-                   NSArray<NSNumber*>* magicStackOrder = (NSArray*)value;
-                   // Ensure MVT, Shortcuts, and Safety Check are returned in
-                   // that order.
-                   return [magicStackOrder count] == 3 &&
-                          0 == [magicStackOrder[0] intValue] &&
-                          1 == [magicStackOrder[1] intValue] &&
-                          7 == [magicStackOrder[2] intValue];
-                 }]]);
+      {});
+
+  EXPECT_SET_MAGIC_STACK_ORDER(
+      consumer_, ContentSuggestionsModuleType::kSetUpListSync,
+      ContentSuggestionsModuleType::kSetUpListDefaultBrowser,
+      ContentSuggestionsModuleType::kSetUpListAutofill,
+      ContentSuggestionsModuleType::kMostVisited,
+      ContentSuggestionsModuleType::kShortcuts,
+      ContentSuggestionsModuleType::kSafetyCheck, );
   mediator_.consumer = consumer_;
 
   EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
@@ -508,7 +521,7 @@
          {kHideIrrelevantModulesParam, "true"}}},
        {kSafetyCheckMagicStack, {}},
        {kTabResumption, {}}},
-      {kIOSSetUpList});
+      {});
 
   [mediator_ disconnect];
   SetUpMediator();
@@ -517,15 +530,12 @@
       segmentation_platform::SegmentationPlatformServiceFactory::
           GetForBrowserState(chrome_browser_state_.get());
 
-  OCMExpect(
-      [consumer_ setMagicStackOrder:[OCMArg checkWithBlock:^BOOL(id value) {
-                   NSArray<NSNumber*>* magicStackOrder = (NSArray*)value;
-                   // Ensure MVT, Shortcuts, and Safety Check are returned in
-                   // that order.
-                   return [magicStackOrder count] == 2 &&
-                          0 == [magicStackOrder[0] intValue] &&
-                          1 == [magicStackOrder[1] intValue];
-                 }]]);
+  EXPECT_SET_MAGIC_STACK_ORDER(
+      consumer_, ContentSuggestionsModuleType::kSetUpListDefaultBrowser,
+      ContentSuggestionsModuleType::kSetUpListAutofill,
+      ContentSuggestionsModuleType::kSetUpListSync,
+      ContentSuggestionsModuleType::kMostVisited,
+      ContentSuggestionsModuleType::kShortcuts, );
   mediator_.consumer = consumer_;
 
   EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
@@ -638,7 +648,7 @@
         {{segmentation_platform::kDefaultModelEnabledParam, "true"}}},
        {kMagicStack, {{kMagicStackMostVisitedModuleParam, "true"}}},
        {kIOSParcelTracking, {}}},
-      {kIOSSetUpList});
+      {});
   [mediator_ disconnect];
   SetUpMediator();
   consumer_ = OCMProtocolMock(@protocol(ContentSuggestionsConsumer));
@@ -651,17 +661,15 @@
           prefs::
               kIosMagicStackSegmentationParcelTrackingImpressionsSinceFreshness);
   EXPECT_EQ(parcel_tracking_freshness_impression_count, -1);
-  OCMExpect(
-      [consumer_ setMagicStackOrder:[OCMArg checkWithBlock:^BOOL(id value) {
-                   NSArray<NSNumber*>* magicStackOrder = (NSArray*)value;
-                   // Ensure MVT, Shortcuts, and two Parcel Tracking items are
-                   // in the ranking.
-                   return [magicStackOrder count] == 4 &&
-                          0 == [magicStackOrder[0] intValue] &&
-                          1 == [magicStackOrder[1] intValue] &&
-                          11 == [magicStackOrder[2] intValue] &&
-                          11 == [magicStackOrder[3] intValue];
-                 }]]);
+
+  EXPECT_SET_MAGIC_STACK_ORDER(
+      consumer_, ContentSuggestionsModuleType::kSetUpListDefaultBrowser,
+      ContentSuggestionsModuleType::kSetUpListAutofill,
+      ContentSuggestionsModuleType::kSetUpListSync,
+      ContentSuggestionsModuleType::kMostVisited,
+      ContentSuggestionsModuleType::kShortcuts,
+      ContentSuggestionsModuleType::kParcelTracking,
+      ContentSuggestionsModuleType::kParcelTracking, );
   OCMExpect([consumer_ showParcelTrackingItems:[OCMArg any]]);
   // One of the parcels should be untracked since it was delivered more than two
   // days ago.
diff --git a/ios/chrome/browser/ui/content_suggestions/magic_stack_half_sheet_mediator.mm b/ios/chrome/browser/ui/content_suggestions/magic_stack_half_sheet_mediator.mm
index 0f148f10..dc2a465 100644
--- a/ios/chrome/browser/ui/content_suggestions/magic_stack_half_sheet_mediator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/magic_stack_half_sheet_mediator.mm
@@ -32,8 +32,7 @@
   if (self = [super init]) {
     CHECK(prefService);
     _prefService = prefService;
-    if (IsIOSSetUpListEnabled() &&
-        set_up_list_utils::IsSetUpListActive(_prefService, false)) {
+    if (set_up_list_utils::IsSetUpListActive(_prefService, false)) {
       _setUpListDisabled = [[PrefBackedBoolean alloc]
           initWithPrefService:_prefService
                      prefName:set_up_list_prefs::kDisabled];
diff --git a/ios/chrome/browser/ui/content_suggestions/magic_stack_half_sheet_table_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/magic_stack_half_sheet_table_view_controller.mm
index 080bf96..186e084 100644
--- a/ios/chrome/browser/ui/content_suggestions/magic_stack_half_sheet_table_view_controller.mm
+++ b/ios/chrome/browser/ui/content_suggestions/magic_stack_half_sheet_table_view_controller.mm
@@ -118,7 +118,7 @@
 
   [self.tableViewModel addSectionWithIdentifier:SectionIdentifierOptions];
 
-  if (IsIOSSetUpListEnabled() && _showSetUpList) {
+  if (_showSetUpList) {
     NSString* listSymbolName = kListBulletRectangleSymbol;
     if (@available(iOS 16.0, *)) {
       listSymbolName = kListBulletClipboardSymbol;
diff --git a/ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface.h b/ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface.h
index 9ec33e729..aeb2bd7 100644
--- a/ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface.h
+++ b/ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface.h
@@ -29,6 +29,9 @@
 // Returns the Discover header label.
 + (UILabel*)discoverHeaderLabel;
 
+// Disables the SetUpList via a pref.
++ (void)disableSetUpList;
+
 // Resets SetUpList prefs to clear any completed items.
 + (void)resetSetUpListPrefs;
 
diff --git a/ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface.mm b/ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface.mm
index 4d75762..dc0cc272 100644
--- a/ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface.mm
+++ b/ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface.mm
@@ -51,6 +51,10 @@
   return ntp_home::DiscoverHeaderLabel();
 }
 
++ (void)disableSetUpList {
+  set_up_list_prefs::DisableSetUpList(GetApplicationContext()->GetLocalState());
+}
+
 + (void)resetSetUpListPrefs {
   PrefService* localState = GetApplicationContext()->GetLocalState();
   localState->ClearPref(set_up_list_prefs::kDisabled);
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
index a38c422..fb981ae 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -163,7 +163,6 @@
   config.features_disabled.push_back(kEnableFeedAblation);
   // TODO(crbug.com/1403077): Scrolling issues when promo is enabled.
   config.features_disabled.push_back(kEnableDiscoverFeedTopSyncPromo);
-  config.features_disabled.push_back(kIOSSetUpList);
 
   if ([self isRunningTest:@selector(testLargeFakeboxFocus)]) {
     config.features_enabled.push_back(kIOSLargeFakebox);
@@ -181,6 +180,7 @@
        forUserPref:base::SysUTF8ToNSString(feed::prefs::kArticlesListVisible)];
 
   self.defaultSearchEngine = [SearchEnginesAppInterface defaultSearchEngine];
+  [NewTabPageAppInterface disableSetUpList];
 }
 
 - (void)tearDown {
@@ -200,9 +200,9 @@
 
 // Tests that the collections shortcut are displayed and working.
 - (void)testCollectionShortcuts {
-  AppLaunchConfiguration config = self.appConfigurationForTestCase;
-  config.relaunch_policy = ForceRelaunchByCleanShutdown;
-  [[AppLaunchManager sharedManager] ensureAppLaunchedWithConfiguration:config];
+  // Close NTP and reopen.
+  [ChromeEarlGrey closeAllTabs];
+  [ChromeEarlGrey openNewTab];
 
   // Check the Bookmarks.
   [[EarlGrey
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_mediator.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_mediator.mm
index 3000f017..de60fb4 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_mediator.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_mediator.mm
@@ -110,7 +110,10 @@
 void FullscreenMediator::FullscreenModelProgressUpdated(
     FullscreenModel* model) {
   DCHECK_EQ(model_, model);
-  StopAnimating(true /* update_model */);
+  // Stops the animation only if there is a current animation running.
+  if (animator_ && animator_.state == UIViewAnimatingStateActive) {
+    StopAnimating(true /* update_model */);
+  }
   for (auto& observer : observers_) {
     observer.FullscreenProgressUpdated(controller_, model_->progress());
   }
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm
index ce8a1c53..aea01ec 100644
--- a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm
+++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm
@@ -128,9 +128,8 @@
                                    [self.NTPDelegate isStartSurface] ||
                                    !self.isSignInPromoEnabled;
 
-  // Don't show the promo if Set Up Lists is Enabled.
-  BOOL isSetupListEnabled = IsIOSSetUpListEnabled() &&
-                            set_up_list_utils::IsSetUpListActive(localState);
+  // Don't show the promo if Set Up List is active.
+  BOOL isSetupListEnabled = set_up_list_utils::IsSetUpListActive(localState);
 
   // Don't show the promo if the account is not elegible for a SigninPromo.
   BOOL isAccountEligibleForPromo = NO;
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_pedal_annotator.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_pedal_annotator.mm
index 0c8d490..e8781642 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_pedal_annotator.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_pedal_annotator.mm
@@ -148,8 +148,7 @@
                        [omniboxCommandHandler cancelOmniboxEdit];
                        [pedalsEndpoint
                            showSavedPasswordsSettingsFromViewController:nil
-                                                       showCancelButton:NO
-                                                     startPasswordCheck:NO];
+                                                       showCancelButton:NO];
                      }];
     }
     case OmniboxPedalId::UPDATE_CREDIT_CARD: {
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/passwords/password_infobar_modal_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/infobar_modal/passwords/password_infobar_modal_overlay_mediator.mm
index 41aebbf..c086fe0 100644
--- a/ios/chrome/browser/ui/overlays/infobar_modal/passwords/password_infobar_modal_overlay_mediator.mm
+++ b/ios/chrome/browser/ui/overlays/infobar_modal/passwords/password_infobar_modal_overlay_mediator.mm
@@ -130,8 +130,7 @@
   id<ApplicationSettingsCommands> settings_command_handler = HandlerForProtocol(
       delegate_->GetDispatcher(), ApplicationSettingsCommands);
   [settings_command_handler showSavedPasswordsSettingsFromViewController:nil
-                                                        showCancelButton:YES
-                                                      startPasswordCheck:NO];
+                                                        showCancelButton:YES];
 
   UMA_HISTOGRAM_ENUMERATION(
       "PasswordManager.ManagePasswordsReferrer",
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/passwords/password_infobar_modal_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/infobar_modal/passwords/password_infobar_modal_overlay_mediator_unittest.mm
index 492a498..6e99d93 100644
--- a/ios/chrome/browser/ui/overlays/infobar_modal/passwords/password_infobar_modal_overlay_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/overlays/infobar_modal/passwords/password_infobar_modal_overlay_mediator_unittest.mm
@@ -149,8 +149,7 @@
       startDispatchingToTarget:commands_handler
                    forProtocol:@protocol(ApplicationSettingsCommands)];
   [[commands_handler expect] showSavedPasswordsSettingsFromViewController:nil
-                                                         showCancelButton:YES
-                                                       startPasswordCheck:NO];
+                                                         showCancelButton:YES];
 
   OCMExpect([delegate_ stopOverlayForMediator:mediator_]);
 
diff --git a/ios/chrome/browser/ui/passwords/password_breach_coordinator.mm b/ios/chrome/browser/ui/passwords/password_breach_coordinator.mm
index 0e1cfa8..5588afd 100644
--- a/ios/chrome/browser/ui/passwords/password_breach_coordinator.mm
+++ b/ios/chrome/browser/ui/passwords/password_breach_coordinator.mm
@@ -123,8 +123,7 @@
       base::UserMetricsAction("MobilePasswordBreachOpenPasswordManager"));
 
   [handler showSavedPasswordsSettingsFromViewController:self.baseViewController
-                                       showCancelButton:NO
-                                     startPasswordCheck:YES];
+                                       showCancelButton:NO];
 }
 
 @end
diff --git a/ios/chrome/browser/ui/passwords/password_protection_coordinator.mm b/ios/chrome/browser/ui/passwords/password_protection_coordinator.mm
index 0f513547..0d0f79a 100644
--- a/ios/chrome/browser/ui/passwords/password_protection_coordinator.mm
+++ b/ios/chrome/browser/ui/passwords/password_protection_coordinator.mm
@@ -79,8 +79,7 @@
       self.browser->GetCommandDispatcher(), ApplicationCommands);
 
   [handler showSavedPasswordsSettingsFromViewController:self.baseViewController
-                                       showCancelButton:NO
-                                     startPasswordCheck:YES];
+                                       showCancelButton:NO];
 }
 
 @end
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm
index b20a9d1..9b04fe5a 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm
@@ -2088,8 +2088,7 @@
   [self.popupMenuHandler dismissPopupMenuAnimated:YES];
   [self.applicationHandler
       showSavedPasswordsSettingsFromViewController:self.baseViewController
-                                  showCancelButton:NO
-                                startPasswordCheck:NO];
+                                  showCancelButton:NO];
 }
 
 // Dismisses the menu and opens price notifications list.
diff --git a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm
index 61fd01b..3126db6 100644
--- a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm
+++ b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm
@@ -573,11 +573,9 @@
                                     self.browser->GetBrowserState())];
 
   // CredentialProvider Promo handler
-  if (IsCredentialProviderExtensionPromoEnabled() || IsIOSSetUpListEnabled()) {
-    _displayHandlerPromos[promos_manager::Promo::CredentialProviderExtension] =
-        [[CredentialProviderPromoDisplayHandler alloc]
-            initWithHandler:_credentialProviderPromoCommandHandler];
-  }
+  _displayHandlerPromos[promos_manager::Promo::CredentialProviderExtension] =
+      [[CredentialProviderPromoDisplayHandler alloc]
+          initWithHandler:_credentialProviderPromoCommandHandler];
 
   // DefaultBrowser Promo handler
   _displayHandlerPromos[promos_manager::Promo::DefaultBrowser] =
diff --git a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
index 961b1b1..9746d80 100644
--- a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
@@ -1080,8 +1080,7 @@
 // TODO(crbug.com/779791) : Do not pass `baseViewController` through dispatcher.
 - (void)showSavedPasswordsSettingsFromViewController:
             (UIViewController*)baseViewController
-                                    showCancelButton:(BOOL)showCancelButton
-                                  startPasswordCheck:(BOOL)startPasswordCheck {
+                                    showCancelButton:(BOOL)showCancelButton {
   [self showSavedPasswordsAndShowCancelButton:showCancelButton];
 }
 
diff --git a/ios/chrome/common/credential_provider/archivable_credential.h b/ios/chrome/common/credential_provider/archivable_credential.h
index ca850a1..62f13e5 100644
--- a/ios/chrome/common/credential_provider/archivable_credential.h
+++ b/ios/chrome/common/credential_provider/archivable_credential.h
@@ -17,7 +17,7 @@
 @interface ArchivableCredential : NSObject <Credential, NSSecureCoding>
 
 - (instancetype)initWithFavicon:(NSString*)favicon
-             keychainIdentifier:(NSString*)keychainIdentifier
+                       password:(NSString*)password
                            rank:(int64_t)rank
                recordIdentifier:(NSString*)recordIdentifier
               serviceIdentifier:(NSString*)serviceIdentifier
diff --git a/ios/chrome/common/credential_provider/archivable_credential.mm b/ios/chrome/common/credential_provider/archivable_credential.mm
index 21d2ead..25adbf5f 100644
--- a/ios/chrome/common/credential_provider/archivable_credential.mm
+++ b/ios/chrome/common/credential_provider/archivable_credential.mm
@@ -8,7 +8,7 @@
 
 // Keys used to serialize properties.
 NSString* const kACFaviconKey = @"favicon";
-NSString* const kACKeychainIdentifierKey = @"keychainIdentifier";
+NSString* const kACPasswordKey = @"password";
 NSString* const kACRankKey = @"rank";
 NSString* const kACRecordIdentifierKey = @"recordIdentifier";
 NSString* const kACServiceIdentifierKey = @"serviceIdentifier";
@@ -21,7 +21,7 @@
 @implementation ArchivableCredential
 
 @synthesize favicon = _favicon;
-@synthesize keychainIdentifier = _keychainIdentifier;
+@synthesize password = _password;
 @synthesize rank = _rank;
 @synthesize recordIdentifier = _recordIdentifier;
 @synthesize serviceIdentifier = _serviceIdentifier;
@@ -30,7 +30,7 @@
 @synthesize note = _note;
 
 - (instancetype)initWithFavicon:(NSString*)favicon
-             keychainIdentifier:(NSString*)keychainIdentifier
+                       password:(NSString*)password
                            rank:(int64_t)rank
                recordIdentifier:(NSString*)recordIdentifier
               serviceIdentifier:(NSString*)serviceIdentifier
@@ -40,7 +40,7 @@
   self = [super init];
   if (self) {
     _favicon = favicon;
-    _keychainIdentifier = keychainIdentifier;
+    _password = password;
     _rank = rank;
     _recordIdentifier = recordIdentifier;
     _serviceIdentifier = serviceIdentifier;
@@ -60,8 +60,7 @@
     }
     ArchivableCredential* otherCredential = (ArchivableCredential*)other;
     return [self.favicon isEqualToString:otherCredential.favicon] &&
-           [self.keychainIdentifier
-               isEqualToString:otherCredential.keychainIdentifier] &&
+           [self.password isEqualToString:otherCredential.password] &&
            self.rank == otherCredential.rank &&
            [self.recordIdentifier
                isEqualToString:otherCredential.recordIdentifier] &&
@@ -74,8 +73,8 @@
 }
 
 - (NSUInteger)hash {
-  // Using record identifier xored with keychain identifier should be enough.
-  return self.recordIdentifier.hash ^ self.keychainIdentifier.hash;
+  // Using record identifier xored with password should be enough.
+  return self.recordIdentifier.hash ^ self.password.hash;
 }
 
 #pragma mark - NSSecureCoding
@@ -86,7 +85,7 @@
 
 - (void)encodeWithCoder:(NSCoder*)coder {
   [coder encodeObject:self.favicon forKey:kACFaviconKey];
-  [coder encodeObject:self.keychainIdentifier forKey:kACKeychainIdentifierKey];
+  [coder encodeObject:self.password forKey:kACPasswordKey];
   [coder encodeInt64:self.rank forKey:kACRankKey];
   [coder encodeObject:self.recordIdentifier forKey:kACRecordIdentifierKey];
   [coder encodeObject:self.serviceIdentifier forKey:kACServiceIdentifierKey];
@@ -98,13 +97,13 @@
 - (instancetype)initWithCoder:(NSCoder*)coder {
   return
       [self initWithFavicon:[coder decodeObjectForKey:kACFaviconKey]
-          keychainIdentifier:[coder decodeObjectForKey:kACKeychainIdentifierKey]
-                        rank:[coder decodeInt64ForKey:kACRankKey]
-            recordIdentifier:[coder decodeObjectForKey:kACRecordIdentifierKey]
-           serviceIdentifier:[coder decodeObjectForKey:kACServiceIdentifierKey]
-                 serviceName:[coder decodeObjectForKey:kACServiceNameKey]
-                        user:[coder decodeObjectForKey:kACUserKey]
-                        note:[coder decodeObjectForKey:kNoteKey]];
+                   password:[coder decodeObjectForKey:kACPasswordKey]
+                       rank:[coder decodeInt64ForKey:kACRankKey]
+           recordIdentifier:[coder decodeObjectForKey:kACRecordIdentifierKey]
+          serviceIdentifier:[coder decodeObjectForKey:kACServiceIdentifierKey]
+                serviceName:[coder decodeObjectForKey:kACServiceNameKey]
+                       user:[coder decodeObjectForKey:kACUserKey]
+                       note:[coder decodeObjectForKey:kNoteKey]];
 }
 
 @end
diff --git a/ios/chrome/common/credential_provider/archivable_credential_store_unittest.mm b/ios/chrome/common/credential_provider/archivable_credential_store_unittest.mm
index d455fa0..9850a2f 100644
--- a/ios/chrome/common/credential_provider/archivable_credential_store_unittest.mm
+++ b/ios/chrome/common/credential_provider/archivable_credential_store_unittest.mm
@@ -36,7 +36,7 @@
 
 ArchivableCredential* TestCredential() {
   return [[ArchivableCredential alloc] initWithFavicon:@"favicon"
-                                    keychainIdentifier:@"keychainIdentifier"
+                                              password:@"qwerty123"
                                                   rank:5
                                       recordIdentifier:@"recordIdentifier"
                                      serviceIdentifier:@"serviceIdentifier"
@@ -73,7 +73,7 @@
 
   ArchivableCredential* updatedCredential =
       [[ArchivableCredential alloc] initWithFavicon:@"other_favicon"
-                                 keychainIdentifier:@"other_keychainIdentifier"
+                                           password:@"Qwerty123!"
                                                rank:credential.rank + 10
                                    recordIdentifier:@"recordIdentifier"
                                   serviceIdentifier:@"other_serviceIdentifier"
diff --git a/ios/chrome/common/credential_provider/archivable_credential_unittest.mm b/ios/chrome/common/credential_provider/archivable_credential_unittest.mm
index 94148d5..9e7f24e3 100644
--- a/ios/chrome/common/credential_provider/archivable_credential_unittest.mm
+++ b/ios/chrome/common/credential_provider/archivable_credential_unittest.mm
@@ -14,7 +14,7 @@
 
 ArchivableCredential* TestCredential() {
   return [[ArchivableCredential alloc] initWithFavicon:@"favicon"
-                                    keychainIdentifier:@"keychainIdentifier"
+                                              password:@"qwery123"
                                                   rank:5
                                       recordIdentifier:@"recordIdentifier"
                                      serviceIdentifier:@"serviceIdentifier"
@@ -27,7 +27,7 @@
 TEST_F(ArchivableCredentialTest, create) {
   ArchivableCredential* credential =
       [[ArchivableCredential alloc] initWithFavicon:@"favicon"
-                                 keychainIdentifier:@"keychainIdentifier"
+                                           password:@"test"
                                                rank:5
                                    recordIdentifier:@"recordIdentifier"
                                   serviceIdentifier:@"serviceIdentifier"
@@ -68,8 +68,7 @@
       [unarchivedCredential isKindOfClass:[ArchivableCredential class]]);
 
   EXPECT_NSEQ(credential.favicon, unarchivedCredential.favicon);
-  EXPECT_NSEQ(credential.keychainIdentifier,
-              unarchivedCredential.keychainIdentifier);
+  EXPECT_NSEQ(credential.password, unarchivedCredential.password);
   EXPECT_EQ(credential.rank, unarchivedCredential.rank);
   EXPECT_NSEQ(credential.recordIdentifier,
               unarchivedCredential.recordIdentifier);
@@ -88,7 +87,7 @@
 
   ArchivableCredential* credentialSameIdentifier =
       [[ArchivableCredential alloc] initWithFavicon:@"other_favicon"
-                                 keychainIdentifier:@"other_keychainIdentifier"
+                                           password:@"Qwerty123!"
                                                rank:credential.rank + 10
                                    recordIdentifier:@"recordIdentifier"
                                   serviceIdentifier:@"other_serviceIdentifier"
@@ -99,7 +98,7 @@
 
   ArchivableCredential* credentialDiferentIdentifier =
       [[ArchivableCredential alloc] initWithFavicon:@"favicon"
-                                 keychainIdentifier:@"keychainIdentifier"
+                                           password:@"123456789"
                                                rank:credential.rank
                                    recordIdentifier:@"other_recordIdentifier"
                                   serviceIdentifier:@"serviceIdentifier"
diff --git a/ios/chrome/common/credential_provider/as_password_credential_identity+credential_unittests.mm b/ios/chrome/common/credential_provider/as_password_credential_identity+credential_unittests.mm
index 363c7ff..fe8f4a8c 100644
--- a/ios/chrome/common/credential_provider/as_password_credential_identity+credential_unittests.mm
+++ b/ios/chrome/common/credential_provider/as_password_credential_identity+credential_unittests.mm
@@ -17,7 +17,7 @@
 TEST_F(ASPasswordCredentialIdentity_CredentialTest, create) {
   ArchivableCredential* credential =
       [[ArchivableCredential alloc] initWithFavicon:@"favicon"
-                                 keychainIdentifier:@"keychainIdentifier"
+                                           password:@"qwerty!"
                                                rank:5
                                    recordIdentifier:@"recordIdentifier"
                                   serviceIdentifier:@"serviceIdentifier"
diff --git a/ios/chrome/common/credential_provider/credential.h b/ios/chrome/common/credential_provider/credential.h
index 3a5268f..2db99ec 100644
--- a/ios/chrome/common/credential_provider/credential.h
+++ b/ios/chrome/common/credential_provider/credential.h
@@ -14,8 +14,8 @@
 // Associated favicon name.
 @property(nonatomic, readonly) NSString* favicon;
 
-// Identifier used to look up the secret in the Keychain.
-@property(nonatomic, readonly) NSString* keychainIdentifier;
+// Plain text password.
+@property(nonatomic, readonly) NSString* password;
 
 // Importance ranking of this credential.
 @property(nonatomic, readonly) int64_t rank;
diff --git a/ios/chrome/common/credential_provider/memory_credential_store_unittests.mm b/ios/chrome/common/credential_provider/memory_credential_store_unittests.mm
index 3186ce6..ef85907c 100644
--- a/ios/chrome/common/credential_provider/memory_credential_store_unittests.mm
+++ b/ios/chrome/common/credential_provider/memory_credential_store_unittests.mm
@@ -14,7 +14,7 @@
 
 ArchivableCredential* TestCredential() {
   return [[ArchivableCredential alloc] initWithFavicon:@"favicon"
-                                    keychainIdentifier:@"keychainIdentifier"
+                                              password:@"qwerty!"
                                                   rank:5
                                       recordIdentifier:@"recordIdentifier"
                                      serviceIdentifier:@"serviceIdentifier"
@@ -48,7 +48,7 @@
 
   ArchivableCredential* updatedCredential =
       [[ArchivableCredential alloc] initWithFavicon:@"other_favicon"
-                                 keychainIdentifier:@"other_keychainIdentifier"
+                                           password:@"Qwerty123!"
                                                rank:credential.rank + 10
                                    recordIdentifier:@"recordIdentifier"
                                   serviceIdentifier:@"other_serviceIdentifier"
diff --git a/ios/chrome/common/credential_provider/multi_store_credential_store_unittests.mm b/ios/chrome/common/credential_provider/multi_store_credential_store_unittests.mm
index a4c9542a..16123f2 100644
--- a/ios/chrome/common/credential_provider/multi_store_credential_store_unittests.mm
+++ b/ios/chrome/common/credential_provider/multi_store_credential_store_unittests.mm
@@ -19,7 +19,7 @@
 
 ArchivableCredential* TestCredential(NSString* user) {
   return [[ArchivableCredential alloc] initWithFavicon:@"favicon"
-                                    keychainIdentifier:@"keychainIdentifier"
+                                              password:@"qwerty123"
                                                   rank:5
                                       recordIdentifier:@"recordIdentifier"
                                      serviceIdentifier:@"serviceIdentifier"
diff --git a/ios/chrome/common/credential_provider/user_defaults_credential_store_unittests.mm b/ios/chrome/common/credential_provider/user_defaults_credential_store_unittests.mm
index 6e59a71..7308382 100644
--- a/ios/chrome/common/credential_provider/user_defaults_credential_store_unittests.mm
+++ b/ios/chrome/common/credential_provider/user_defaults_credential_store_unittests.mm
@@ -34,7 +34,7 @@
 
 ArchivableCredential* TestCredential() {
   return [[ArchivableCredential alloc] initWithFavicon:@"favicon"
-                                    keychainIdentifier:@"keychainIdentifier"
+                                              password:@"qwerty123"
                                                   rank:5
                                       recordIdentifier:@"recordIdentifier"
                                      serviceIdentifier:@"serviceIdentifier"
@@ -77,7 +77,7 @@
 
   ArchivableCredential* updatedCredential =
       [[ArchivableCredential alloc] initWithFavicon:@"other_favicon"
-                                 keychainIdentifier:@"other_keychainIdentifier"
+                                           password:@"Qwerty123!"
                                                rank:credential.rank + 10
                                    recordIdentifier:@"recordIdentifier"
                                   serviceIdentifier:@"other_serviceIdentifier"
diff --git a/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm b/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm
index 6438a14e..d5eee05 100644
--- a/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm
+++ b/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm
@@ -224,17 +224,12 @@
   id<Credential> credential =
       [self.credentialStore credentialWithRecordIdentifier:identifier];
   if (credential) {
-    NSString* password =
-        PasswordWithKeychainIdentifier(credential.keychainIdentifier);
-    if (password) {
-      UpdateUMACountForKey(
-          app_group::kCredentialExtensionQuickPasswordUseCount);
-      ASPasswordCredential* ASCredential =
-          [ASPasswordCredential credentialWithUser:credential.user
-                                          password:password];
-      [self completeRequestWithSelectedCredential:ASCredential];
-      return;
-    }
+    UpdateUMACountForKey(app_group::kCredentialExtensionQuickPasswordUseCount);
+    ASPasswordCredential* ASCredential =
+        [ASPasswordCredential credentialWithUser:credential.user
+                                        password:credential.password];
+    [self completeRequestWithSelectedCredential:ASCredential];
+    return;
   }
   [self exitWithErrorCode:ASExtensionErrorCodeCredentialIdentityNotFound];
 }
diff --git a/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.mm b/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.mm
index 9ce56e5..aa041f9 100644
--- a/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.mm
+++ b/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.mm
@@ -126,11 +126,9 @@
   [self reauthenticateIfNeededWithCompletionHandler:^(
             ReauthenticationResult result) {
     if (result != ReauthenticationResult::kFailure) {
-      NSString* password =
-          PasswordWithKeychainIdentifier(credential.keychainIdentifier);
       ASPasswordCredential* ASCredential =
           [ASPasswordCredential credentialWithUser:credential.user
-                                          password:password];
+                                          password:credential.password];
       [self.credentialResponseHandler userSelectedCredential:ASCredential];
     }
   }];
@@ -167,9 +165,7 @@
   [self reauthenticateIfNeededWithCompletionHandler:^(
             ReauthenticationResult result) {
     if (result != ReauthenticationResult::kFailure) {
-      NSString* password =
-          PasswordWithKeychainIdentifier(credential.keychainIdentifier);
-      completionHandler(password);
+      completionHandler(credential.password);
     }
   }];
 }
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_mediator.mm b/ios/chrome/credential_provider_extension/ui/new_password_mediator.mm
index 8bcedf0d..55a9ba3 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_mediator.mm
+++ b/ios/chrome/credential_provider_extension/ui/new_password_mediator.mm
@@ -125,12 +125,8 @@
   NSURL* url = [NSURL URLWithString:identifier];
   NSString* recordIdentifier = RecordIdentifierForData(url, username);
 
-  NSString* uuid = [[NSUUID UUID] UUIDString];
-  if (!StorePasswordInKeychain(password, uuid)) {
-    return nil;
-  }
   return [[ArchivableCredential alloc] initWithFavicon:nil
-                                    keychainIdentifier:uuid
+                                              password:password
                                                   rank:1
                                       recordIdentifier:recordIdentifier
                                      serviceIdentifier:identifier
@@ -159,8 +155,7 @@
 
 // Alerts the host app that the user selected a credential.
 - (void)userSelectedCredential:(id<Credential>)credential {
-  NSString* password =
-      PasswordWithKeychainIdentifier(credential.keychainIdentifier);
+  NSString* password = credential.password;
   ASPasswordCredential* ASCredential =
       [ASPasswordCredential credentialWithUser:credential.user
                                       password:password];
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_mediator_unittest.mm b/ios/chrome/credential_provider_extension/ui/new_password_mediator_unittest.mm
index ce5f6257..acc8a52 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_mediator_unittest.mm
+++ b/ios/chrome/credential_provider_extension/ui/new_password_mediator_unittest.mm
@@ -99,7 +99,7 @@
 
 ArchivableCredential* TestCredential(NSString* recordIdentifier) {
   return [[ArchivableCredential alloc] initWithFavicon:@"favicon"
-                                    keychainIdentifier:@"keychainIdentifier"
+                                              password:@"qwerty123"
                                                   rank:5
                                       recordIdentifier:recordIdentifier
                                      serviceIdentifier:@"serviceIdentifier"
diff --git a/ios/showcase/credential_provider/sc_credential_list_coordinator.mm b/ios/showcase/credential_provider/sc_credential_list_coordinator.mm
index 466a43c..7ec782f2 100644
--- a/ios/showcase/credential_provider/sc_credential_list_coordinator.mm
+++ b/ios/showcase/credential_provider/sc_credential_list_coordinator.mm
@@ -17,7 +17,7 @@
 
 @implementation SCCredential
 @synthesize favicon = _favicon;
-@synthesize keychainIdentifier = _keychainIdentifier;
+@synthesize password = _password;
 @synthesize rank = _rank;
 @synthesize recordIdentifier = _recordIdentifier;
 @synthesize serviceIdentifier = _serviceIdentifier;
diff --git a/media/mojo/services/gpu_mojo_media_client_linux.cc b/media/mojo/services/gpu_mojo_media_client_linux.cc
index 197e369..2836cda 100644
--- a/media/mojo/services/gpu_mojo_media_client_linux.cc
+++ b/media/mojo/services/gpu_mojo_media_client_linux.cc
@@ -28,7 +28,11 @@
     return VideoDecoderType::kOutOfProcess;
   }
 
+#if BUILDFLAG(USE_VAAPI)
   return VideoDecoderType::kVaapi;
+#elif BUILDFLAG(USE_V4L2_CODEC)
+  return VideoDecoderType::kV4L2;
+#endif
 }
 
 std::vector<Fourcc> GetPreferredRenderableFourccs(
@@ -56,6 +60,8 @@
       return VideoDecoderType::kUnknown;
     case VideoDecoderType::kOutOfProcess:
       return VideoDecoderType::kOutOfProcess;
+    case VideoDecoderType::kV4L2:
+      return VideoDecoderType::kV4L2;
     case VideoDecoderType::kVaapi: {
       // Allow VaapiVideoDecoder on GL.
       if (gpu_preferences.gr_context_type == gpu::GrContextType::kGL) {
diff --git a/media/renderers/paint_canvas_video_renderer_unittest.cc b/media/renderers/paint_canvas_video_renderer_unittest.cc
index 3a844d2..71982f1 100644
--- a/media/renderers/paint_canvas_video_renderer_unittest.cc
+++ b/media/renderers/paint_canvas_video_renderer_unittest.cc
@@ -1311,17 +1311,8 @@
 
 // Checks that we correctly copy a RGBA shared image VideoFrame when using
 // CopyVideoFrameYUVDataToGLTexture, including correct cropping.
-#if BUILDFLAG(IS_IOS) && BUILDFLAG(SKIA_USE_METAL)
-// TODO(crbug.com/1476625): R and B channels are currently inverted with
-// SkiaGraphite and metal.
-#define MAYBE_CopyVideoFrameTexturesToGLTextureRGBA \
-  DISABLED_CopyVideoFrameTexturesToGLTextureRGBA
-#else
-#define MAYBE_CopyVideoFrameTexturesToGLTextureRGBA \
-  CopyVideoFrameTexturesToGLTextureRGBA
-#endif  // BUILDFLAG(IS_IOS) && BUILDFLAG(SKIA_USE_METAL)
 TEST_F(PaintCanvasVideoRendererWithGLTest,
-       MAYBE_CopyVideoFrameTexturesToGLTextureRGBA) {
+       CopyVideoFrameTexturesToGLTextureRGBA) {
   base::RunLoop run_loop;
   scoped_refptr<VideoFrame> frame = CreateTestRGBAFrame(run_loop.QuitClosure());
 
@@ -1334,17 +1325,8 @@
 // Checks that we correctly copy a RGBA shared image VideoFrame that needs read
 // lock fences, when using CopyVideoFrameYUVDataToGLTexture, including correct
 // cropping.
-#if BUILDFLAG(IS_IOS) && BUILDFLAG(SKIA_USE_METAL)
-// TODO(crbug.com/1476625): R and B channels are currently inverted with
-// SkiaGraphite and metal.
-#define MAYBE_CopyVideoFrameTexturesToGLTextureRGBA_ReadLockFence \
-  DISABLED_CopyVideoFrameTexturesToGLTextureRGBA_ReadLockFence
-#else
-#define MAYBE_CopyVideoFrameTexturesToGLTextureRGBA_ReadLockFence \
-  CopyVideoFrameTexturesToGLTextureRGBA_ReadLockFence
-#endif  // BUILDFLAG(IS_IOS) && BUILDFLAG(SKIA_USE_METAL)
 TEST_F(PaintCanvasVideoRendererWithGLTest,
-       MAYBE_CopyVideoFrameTexturesToGLTextureRGBA_ReadLockFence) {
+       CopyVideoFrameTexturesToGLTextureRGBA_ReadLockFence) {
   base::RunLoop run_loop;
   scoped_refptr<VideoFrame> frame = CreateTestRGBAFrame(run_loop.QuitClosure());
   frame->metadata().read_lock_fences_enabled = true;
diff --git a/net/base/proxy_string_util.cc b/net/base/proxy_string_util.cc
index e93eb065..3c7e0691 100644
--- a/net/base/proxy_string_util.cc
+++ b/net/base/proxy_string_util.cc
@@ -128,13 +128,6 @@
   return FromSchemeHostAndPort(scheme, pac_result_element.substr(space));
 }
 
-std::string ProxyChainToPacResultElement(const ProxyChain& proxy_chain) {
-  // TODO(https://crbug.com/1491092): Support converting a multi-hop ProxyChain
-  // to a PAC script format.
-  CHECK(!proxy_chain.is_multi_proxy());
-  return ProxyServerToPacResultElement(proxy_chain.proxy_server());
-}
-
 std::string ProxyServerToPacResultElement(const ProxyServer& proxy_server) {
   switch (proxy_server.scheme()) {
     case ProxyServer::SCHEME_DIRECT:
diff --git a/net/base/proxy_string_util.h b/net/base/proxy_string_util.h
index 3b0ef675..33f25d0 100644
--- a/net/base/proxy_string_util.h
+++ b/net/base/proxy_string_util.h
@@ -52,8 +52,6 @@
 PacResultElementToProxyChain(std::string_view pac_result_element);
 NET_EXPORT ProxyServer
 PacResultElementToProxyServer(std::string_view pac_result_element);
-NET_EXPORT std::string ProxyChainToPacResultElement(
-    const ProxyChain& proxy_chain);
 NET_EXPORT std::string ProxyServerToPacResultElement(
     const ProxyServer& proxy_server);
 
diff --git a/net/base/proxy_string_util_unittest.cc b/net/base/proxy_string_util_unittest.cc
index 08f8666..5dbed7d 100644
--- a/net/base/proxy_string_util_unittest.cc
+++ b/net/base/proxy_string_util_unittest.cc
@@ -221,7 +221,10 @@
     // `PacResultElementToProxyServer()`.
     ProxyChain chain = PacResultElementToProxyChain(test.input_pac);
     EXPECT_TRUE(chain.IsValid());
-    EXPECT_EQ(test.expected_uri, ProxyServerToProxyUri(chain.proxy_server()));
+    if (!chain.is_direct()) {
+      EXPECT_EQ(test.expected_uri,
+                ProxyServerToProxyUri(chain.GetProxyServer(/*chain_index=*/0)));
+    }
   }
 }
 
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index a522666a..c5bdccb 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -1645,9 +1645,17 @@
   //
   // See https://crbug.com/828965.
   bool is_server = !UsingHttpProxyWithoutTunnel();
-  HostPortPair host_port_pair =
-      is_server ? HostPortPair::FromURL(request_->url)
-                : proxy_info_.proxy_chain().proxy_server().host_port_pair();
+  HostPortPair host_port_pair;
+  // TODO(https://crbug.com/1491092): Remove check and return error when
+  // multi-proxy chain.
+  if (is_server) {
+    host_port_pair = HostPortPair::FromURL(request_->url);
+  } else {
+    CHECK(proxy_info_.proxy_chain().is_single_proxy());
+    host_port_pair = proxy_info_.proxy_chain()
+                         .GetProxyServer(/*chain_index=*/0)
+                         .host_port_pair();
+  }
 
   if (error == ERR_SSL_PROTOCOL_ERROR || IsClientCertificateError(error)) {
     DCHECK((is_server && IsSecureRequest()) ||
@@ -1977,17 +1985,20 @@
 GURL HttpNetworkTransaction::AuthURL(HttpAuth::Target target) const {
   switch (target) {
     case HttpAuth::AUTH_PROXY: {
+      // TODO(https://crbug.com/1491092): Update to handle multi-proxy chain.
       if (!proxy_info_.proxy_chain().IsValid() ||
-          proxy_info_.proxy_chain().is_direct()) {
+          proxy_info_.proxy_chain().is_direct() ||
+          !proxy_info_.proxy_chain().is_single_proxy()) {
         return GURL();  // There is no proxy chain.
       }
       // TODO(https://crbug.com/1103768): Mapping proxy addresses to
       // URLs is a lossy conversion, shouldn't do this.
       const char* scheme =
           proxy_info_.is_secure_http_like() ? "https://" : "http://";
-      return GURL(
-          scheme +
-          proxy_info_.proxy_chain().proxy_server().host_port_pair().ToString());
+      return GURL(scheme + proxy_info_.proxy_chain()
+                               .GetProxyServer(/*chain_index=*/0)
+                               .host_port_pair()
+                               .ToString());
     }
     case HttpAuth::AUTH_SERVER:
       if (ForWebSocketHandshake()) {
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins
index e9a77704..52cb516 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: 2023-11-09 12:55 UTC
+# Last updated: 2023-11-10 12:54 UTC
 PinsListTimestamp
-1699534500
+1699620856
 
 TestSPKI
 sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json
index a626ad85..be9184d 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: 2023-11-09 12:55 UTC
+// Last updated: 2023-11-10 12:54 UTC
 //
 {
   "pinsets": [
diff --git a/net/socket/transport_client_socket_pool.cc b/net/socket/transport_client_socket_pool.cc
index 6a52062..4c7c0084 100644
--- a/net/socket/transport_client_socket_pool.cc
+++ b/net/socket/transport_client_socket_pool.cc
@@ -841,13 +841,14 @@
   // interfaces so the parameter is not necessary.
   base::TimeTicks now = base::TimeTicks::Now();
 
-  // If the proxy is |server| and uses SSL settings (HTTPS or QUIC), refresh
-  // every group.
+  // If the proxy chain includes a server from `servers` and uses SSL settings
+  // (HTTPS or QUIC), refresh every group.
   // TODO(https://crbug.com/1491092): Check each ProxyServer in `proxy_chain_`.
   bool proxy_matches =
       proxy_chain_.proxy_server().is_http_like() &&
       !proxy_chain_.proxy_server().is_http() &&
       servers.contains(proxy_chain_.proxy_server().host_port_pair());
+
   bool refreshed_any = false;
   for (auto it = group_map_.begin(); it != group_map_.end();) {
     if (proxy_matches ||
diff --git a/net/spdy/spdy_session_key.h b/net/spdy/spdy_session_key.h
index 92336250..f431216 100644
--- a/net/spdy/spdy_session_key.h
+++ b/net/spdy/spdy_session_key.h
@@ -80,11 +80,6 @@
 
   const ProxyChain& proxy_chain() const { return host_port_proxy_pair_.second; }
 
-  // TODO(crbug.com/1491092): Remove this method.
-  const ProxyServer& proxy_server() const {
-    return host_port_proxy_pair_.second.proxy_server();
-  }
-
   PrivacyMode privacy_mode() const {
     return privacy_mode_;
   }
diff --git a/net/spdy/spdy_session_pool.cc b/net/spdy/spdy_session_pool.cc
index 4f1e7ae2..e45eef1 100644
--- a/net/spdy/spdy_session_pool.cc
+++ b/net/spdy/spdy_session_pool.cc
@@ -545,8 +545,11 @@
       continue;
 
     // TODO(crbug.com/1491092): Update to support multi-proxy chains.
+    const ProxyChain& proxy_chain = session->spdy_session_key().proxy_chain();
+    CHECK(proxy_chain.length() <= 1);
     const ProxyServer& proxy_server =
-        session->spdy_session_key().proxy_server();
+        !proxy_chain.is_direct() ? proxy_chain.GetProxyServer(/*chain_index=*/0)
+                                 : net::ProxyServer::Direct();
     if (servers.contains(session->host_port_pair()) ||
         (proxy_server.is_http_like() && !proxy_server.is_http() &&
          servers.contains(proxy_server.host_port_pair()))) {
diff --git a/net/url_request/url_request_http_job_unittest.cc b/net/url_request/url_request_http_job_unittest.cc
index 8a40a5d6..68917980 100644
--- a/net/url_request/url_request_http_job_unittest.cc
+++ b/net/url_request/url_request_http_job_unittest.cc
@@ -263,7 +263,8 @@
 
   std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
       ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
-          ProxyChainToPacResultElement(proxy_chain),
+          ProxyServerToPacResultElement(
+              proxy_chain.GetProxyServer(/*chain_index=*/0)),
           TRAFFIC_ANNOTATION_FOR_TESTS);
 
   MockWrite writes[] = {MockWrite(kSimpleProxyGetMockWrite)};
@@ -306,7 +307,9 @@
   // DIRECT.
   std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
       ConfiguredProxyResolutionService::CreateFixedFromPacResultForTest(
-          ProxyChainToPacResultElement(proxy_chain) + "; DIRECT",
+          ProxyServerToPacResultElement(
+              proxy_chain.GetProxyServer(/*chain_index=*/0)) +
+              "; DIRECT",
           TRAFFIC_ANNOTATION_FOR_TESTS);
 
   MockWrite writes[] = {MockWrite(kSimpleGetMockWrite)};
diff --git a/services/network/attribution/attribution_request_helper.cc b/services/network/attribution/attribution_request_helper.cc
index 80c09b3..371fa73 100644
--- a/services/network/attribution/attribution_request_helper.cc
+++ b/services/network/attribution/attribution_request_helper.cc
@@ -352,6 +352,9 @@
           AttributionReportingRuntimeFeature::kCrossAppWeb) &&
       base::FeatureList::IsEnabled(
           features::kAttributionReportingCrossAppWeb)) {
+    base::UmaHistogramEnumeration("Conversions.RequestSupportHeader",
+                                  request.attribution_reporting_support);
+
     url_request.SetExtraRequestHeaderByName(
         "Attribution-Reporting-Support",
         GetAttributionSupportHeader(
diff --git a/services/network/attribution/attribution_request_helper_unittest.cc b/services/network/attribution/attribution_request_helper_unittest.cc
index c4bb696..ab335ea9 100644
--- a/services/network/attribution/attribution_request_helper_unittest.cc
+++ b/services/network/attribution/attribution_request_helper_unittest.cc
@@ -501,5 +501,54 @@
   }
 }
 
+class AttributionCrossAppWebRequestHelperTest
+    : public AttributionRequestHelperTest {
+ public:
+  AttributionCrossAppWebRequestHelperTest() {
+    scoped_feature_list_.InitWithFeatures(
+        /*enabled_features=*/{network::features::
+                                  kAttributionReportingCrossAppWeb},
+        /*disabled_features=*/{});
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+TEST_F(AttributionCrossAppWebRequestHelperTest,
+       SetAttributionReportingSupportHeaders) {
+  const struct {
+    mojom::AttributionSupport support;
+  } kTestCases[] = {
+      {mojom::AttributionSupport::kWeb},
+      {mojom::AttributionSupport::kWebAndOs},
+      {mojom::AttributionSupport::kOs},
+  };
+
+  for (const auto& test_case : kTestCases) {
+    std::unique_ptr<net::URLRequest> request =
+        CreateTestUrlRequest(/*to_url=*/example_valid_request_url_);
+
+    ResourceRequest resource_request;
+    resource_request.attribution_reporting_eligibility =
+        AttributionReportingEligibility::kEventSource;
+    resource_request.attribution_reporting_support = test_case.support;
+    resource_request.attribution_reporting_runtime_features.Put(
+        AttributionReportingRuntimeFeature::kCrossAppWeb);
+    SetAttributionReportingHeaders(*request, resource_request);
+
+    std::string actual;
+    request->extra_request_headers().GetHeader(kAttributionReportingEligible,
+                                               &actual);
+
+    auto dict = net::structured_headers::ParseDictionary(actual);
+    EXPECT_TRUE(dict.has_value());
+
+    histograms_.ExpectBucketCount("Conversions.RequestSupportHeader",
+                                  test_case.support,
+                                  /*expected_bucket_count=*/1);
+  }
+}
+
 }  // namespace
 }  // namespace network
diff --git a/services/network/network_service_proxy_delegate.cc b/services/network/network_service_proxy_delegate.cc
index 9ef122c..e2e70b68 100644
--- a/services/network/network_service_proxy_delegate.cc
+++ b/services/network/network_service_proxy_delegate.cc
@@ -216,7 +216,7 @@
                                              int net_error) {
   // If the bad proxy was an IP Protection proxy, refresh the list of IP
   // protection proxies immediately.
-  if (IsProxyForIpProtection(bad_chain.proxy_server()) && ipp_config_cache_) {
+  if (IsProxyForIpProtection(bad_chain) && ipp_config_cache_) {
     ipp_config_cache_->RequestRefreshProxyList();
   }
 
@@ -231,15 +231,14 @@
     net::HttpRequestHeaders* extra_headers) {
   // TODO(crbug.com/1491092): Handle proxy chains.
   CHECK(chain_index == 0);
-  const net::ProxyServer& proxy_server = proxy_chain.proxy_server();
 
   auto vlog = [](std::string message) {
     VLOG(2) << "NSPD::OnBeforeTunnelRequest() - " << message;
   };
-  if (IsInProxyConfig(proxy_server)) {
+  if (IsInProxyConfig(proxy_chain)) {
     MergeRequestHeaders(extra_headers, proxy_config_->connect_tunnel_headers);
   }
-  if (IsForIpProtection() && IsProxyForIpProtection(proxy_server)) {
+  if (IsForIpProtection() && IsProxyForIpProtection(proxy_chain)) {
     if (ipp_config_cache_) {
       absl::optional<network::mojom::BlindSignedAuthTokenPtr> token =
           ipp_config_cache_->GetAuthToken(chain_index);
@@ -312,12 +311,15 @@
 }
 
 bool NetworkServiceProxyDelegate::IsInProxyConfig(
-    const net::ProxyServer& proxy_server) const {
-  if (!proxy_server.is_valid() || proxy_server.is_direct()) {
+    const net::ProxyChain& proxy_chain) const {
+  if (!proxy_chain.IsValid() || proxy_chain.is_direct()) {
     return false;
   }
 
-  if (RulesContainsProxy(proxy_config_->rules, proxy_server)) {
+  // TODO(https://crbug.com/1491092): Support nested proxies.
+  if (proxy_chain.is_single_proxy() &&
+      RulesContainsProxy(proxy_config_->rules,
+                         proxy_chain.GetProxyServer(/*chain_index=*/0))) {
     return true;
   }
 
@@ -335,14 +337,17 @@
 }
 
 bool NetworkServiceProxyDelegate::IsProxyForIpProtection(
-    const net::ProxyServer& proxy_server) const {
+    const net::ProxyChain& proxy_chain) const {
   if (!ipp_config_cache_) {
     return false;
   }
 
   // This list will typically be quite short (2-3), so linear search is
   // adequate.
-  std::string proxy_server_host = proxy_server.GetHost();
+  // TODO(https://crbug.com/1491092): Update to support nested proxies.
+  CHECK(proxy_chain.is_single_proxy());
+  std::string proxy_server_host =
+      proxy_chain.GetProxyServer(/*chain_index=*/0).GetHost();
   return base::Contains(ipp_config_cache_->GetProxyList(), proxy_server_host);
 }
 
diff --git a/services/network/network_service_proxy_delegate.h b/services/network/network_service_proxy_delegate.h
index 9437405..a7d98202 100644
--- a/services/network/network_service_proxy_delegate.h
+++ b/services/network/network_service_proxy_delegate.h
@@ -77,10 +77,10 @@
   // Checks if this CustomProxyConfig is supporting IP Protection.
   bool IsForIpProtection();
 
-  // Checks whether |proxy_server| is present in the current proxy config.
-  bool IsInProxyConfig(const net::ProxyServer& proxy_server) const;
+  // Checks whether `proxy_chain` is present in the current proxy config.
+  bool IsInProxyConfig(const net::ProxyChain& proxy_chain) const;
 
-  bool IsProxyForIpProtection(const net::ProxyServer& proxy_server) const;
+  bool IsProxyForIpProtection(const net::ProxyChain& proxy_chain) const;
 
   // Whether the current config may proxy |url|.
   bool MayProxyURL(const GURL& url) const;
diff --git a/services/network/public/mojom/attribution.mojom b/services/network/public/mojom/attribution.mojom
index 231522a2..cc56bc4 100644
--- a/services/network/public/mojom/attribution.mojom
+++ b/services/network/public/mojom/attribution.mojom
@@ -16,6 +16,8 @@
 
 // Indicates whether web or OS-level Attribution Reporting is supported.
 // See https://github.com/WICG/attribution-reporting-api/blob/main/app_to_web.md.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
 enum AttributionSupport {
   kWeb,
   kWebAndOs,
diff --git a/services/webnn/dml/graph_impl_test.cc b/services/webnn/dml/graph_impl_test.cc
index c1205a4..fd2d13a 100644
--- a/services/webnn/dml/graph_impl_test.cc
+++ b/services/webnn/dml/graph_impl_test.cc
@@ -89,6 +89,10 @@
     EXPECT_FALSE(was_callback_called);
     EXPECT_FALSE(webnn_graph_remote.is_bound());
     EXPECT_TRUE(webnn_context_remote.is_bound());
+    webnn_graph_remote.reset();
+    webnn_context_remote.reset();
+    webnn_provider_remote.reset();
+    base::RunLoop().RunUntilIdle();
     return;
   }
   EXPECT_TRUE(was_callback_called);
@@ -992,23 +996,22 @@
     ElementWiseUnaryTester<float>{
         .input = {.type = mojom::Operand::DataType::kFloat32,
                   .dimensions = {1, 2, 3, 1},
-                  .values = {0, 4, 2, 16, 64, 3}},
+                  .values = {0, 4, 25, 16, 64, 49}},
         .kind = mojom::ElementWiseUnary::Kind::kSqrt,
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 2, 3, 1},
-                   .values = {0, 2, sqrt(2.0f), 4, 8, sqrt(3.0f)}}}
+                   .values = {0, 2, 5, 4, 8, 7}}}
         .Test();
   }
   {
     ElementWiseUnaryTester<float16>{
         .input = {.type = mojom::Operand::DataType::kFloat16,
                   .dimensions = {1, 2, 3, 1},
-                  .values = Float16FromFloat32({0, 4, 2, 16, 64, 3})},
+                  .values = Float16FromFloat32({0, 4, 25, 16, 64, 49})},
         .kind = mojom::ElementWiseUnary::Kind::kSqrt,
         .output = {.type = mojom::Operand::DataType::kFloat16,
                    .dimensions = {1, 2, 3, 1},
-                   .values = Float16FromFloat32(
-                       {0, 2, sqrt(2.0f), 4, 8, sqrt(3.0f)})}}
+                   .values = Float16FromFloat32({0, 2, 5, 4, 8, 7})}}
         .Test();
   }
   {
@@ -1035,22 +1038,22 @@
     ElementWiseUnaryTester<float>{
         .input = {.type = mojom::Operand::DataType::kFloat32,
                   .dimensions = {1, 2, 3, 1},
-                  .values = {0, 4, 0.5, 16, 64, -5}},
+                  .values = {0, 4, 0, 16, 64, -5}},
         .kind = mojom::ElementWiseUnary::Kind::kErf,
         .output = {.type = mojom::Operand::DataType::kFloat32,
                    .dimensions = {1, 2, 3, 1},
-                   .values = {0, 1, 0.52050006, 1, 1, -1}}}
+                   .values = {0, 1, 0, 1, 1, -1}}}
         .Test();
   }
   {
     ElementWiseUnaryTester<float16>{
         .input = {.type = mojom::Operand::DataType::kFloat16,
                   .dimensions = {1, 2, 3, 1},
-                  .values = Float16FromFloat32({0, 4, 0.5, 16, 64, -5})},
+                  .values = Float16FromFloat32({0, 4, 0, 16, 64, -5})},
         .kind = mojom::ElementWiseUnary::Kind::kErf,
         .output = {.type = mojom::Operand::DataType::kFloat16,
                    .dimensions = {1, 2, 3, 1},
-                   .values = Float16FromFloat32({0, 1, 0.52001953, 1, 1, -1})}}
+                   .values = Float16FromFloat32({0, 1, 0, 1, 1, -1})}}
         .Test();
   }
   {
diff --git a/skia/features.gni b/skia/features.gni
index cd7c919..0b11db93 100644
--- a/skia/features.gni
+++ b/skia/features.gni
@@ -6,16 +6,16 @@
 import("//printing/buildflags/buildflags.gni")
 
 declare_args() {
-  # Enable experimental Skia Graphite Dawn backend. Currently enabled for Mac
+  # Enable experimental Skia Graphite Dawn backend. Currently enabled for Apple
   # and Windows only.
-  skia_use_dawn = is_mac || is_win
+  skia_use_dawn = is_apple || is_win
 
   # Enable experimental Skia Graphite Metal backend. Intended only for debugging
   # on non-official developer builds.
-  skia_use_metal = is_mac && !is_official_build
+  skia_use_metal = is_apple && !is_official_build
 
   # Enable gtests using SkiaRenderer on Skia Graphite.
-  enable_skia_graphite_gtests = is_mac
+  enable_skia_graphite_gtests = is_apple
 }
 
 # Skia only needs to support GPU rasterization if we use the full Chromium
diff --git a/storage/browser/blob/OWNERS b/storage/browser/blob/OWNERS
new file mode 100644
index 0000000..7dc232d
--- /dev/null
+++ b/storage/browser/blob/OWNERS
@@ -0,0 +1,5 @@
+file://storage/OWNERS
+
+# Secondary
+dmurph@chromium.org
+mek@chromium.org
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 8786120..47cd5cc 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -5167,6 +5167,9 @@
       },
       {
         "args": [
+          "--test-launcher-bot-mode",
+          "--test-launcher-filter-file=testing/buildbot/filters/ios.cc_unittests.filter",
+          "--use-gpu-in-tests",
           "--platform",
           "iPhone 14",
           "--version",
@@ -6325,6 +6328,110 @@
       },
       {
         "args": [
+          "--test-launcher-bot-mode",
+          "--enable-features=SkiaGraphite",
+          "--skia-graphite-backend=dawn",
+          "--use-gpu-in-tests",
+          "--platform",
+          "iPhone 14",
+          "--version",
+          "17.0",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}",
+          "--xcode-build-version",
+          "15c5042i",
+          "--xctest"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "media_unittests_skia_graphite_dawn iPhone 14 17.0",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:32d81d877ee07af07bf03b7f70ce597e323b80ce"
+            }
+          ],
+          "dimensions": {
+            "cpu": "arm64",
+            "os": "Mac-13"
+          },
+          "named_caches": [
+            {
+              "name": "xcode_ios_15c5042i",
+              "path": "Xcode.app"
+            },
+            {
+              "name": "runtime_ios_17_0",
+              "path": "Runtime-ios-17.0"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "media_unittests",
+        "test_id_prefix": "ninja://media:media_unittests/",
+        "variant_id": "iPhone 14 17.0"
+      },
+      {
+        "args": [
+          "--test-launcher-bot-mode",
+          "--enable-features=SkiaGraphite",
+          "--skia-graphite-backend=metal",
+          "--use-gpu-in-tests",
+          "--platform",
+          "iPhone 14",
+          "--version",
+          "17.0",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}",
+          "--xcode-build-version",
+          "15c5042i",
+          "--xctest"
+        ],
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "media_unittests_skia_graphite_metal iPhone 14 17.0",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:32d81d877ee07af07bf03b7f70ce597e323b80ce"
+            }
+          ],
+          "dimensions": {
+            "cpu": "arm64",
+            "os": "Mac-13"
+          },
+          "named_caches": [
+            {
+              "name": "xcode_ios_15c5042i",
+              "path": "Xcode.app"
+            },
+            {
+              "name": "runtime_ios_17_0",
+              "path": "Runtime-ios-17.0"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "media_unittests",
+        "test_id_prefix": "ninja://media:media_unittests/",
+        "variant_id": "iPhone 14 17.0"
+      },
+      {
+        "args": [
           "--platform",
           "iPhone 14",
           "--version",
@@ -6998,6 +7105,9 @@
       },
       {
         "args": [
+          "--test-launcher-bot-mode",
+          "--test-launcher-filter-file=testing/buildbot/filters/ios.viz_unittests.filter",
+          "--use-gpu-in-tests",
           "--platform",
           "iPhone 14",
           "--version",
diff --git a/testing/buildbot/filters/ios.cc_unittests.filter b/testing/buildbot/filters/ios.cc_unittests.filter
new file mode 100644
index 0000000..2d4e454
--- /dev/null
+++ b/testing/buildbot/filters/ios.cc_unittests.filter
@@ -0,0 +1,214 @@
+# These appear to fail with imperciptible pixel differences.
+-All/BackdropFilterInvertTest.StandardDpi/SkiaGraphiteDawn
+-All/BackdropFilterInvertTest.StandardDpi/SkiaGraphiteMetal
+-All/BackdropFilterOffsetTest.StandardDpi/SkiaGraphiteDawn
+-All/LayerTreeHostFiltersPixelTest.BackdropFilterBlurRect/SkiaGraphiteMetal
+-All/LayerTreeHostFiltersPixelTest.BackdropFilterBlurRounded/SkiaGraphiteMetal
+-All/LayerTreeHostFiltersPixelTest.EnlargedTextureWithAlphaThresholdFilter/SkiaGraphiteMetal
+-All/LayerTreeHostFiltersPixelTest.EnlargedTextureWithCropOffsetFilter/SkiaGraphiteMetal
+
+# Spot checking seems to show that the following tests fail with errors like
+# the following:
+# dawn_context_provider.cc(448)] First instance (1) must be zero.
+# - While encoding [RenderPassEncoder].DrawIndexed(29, 1, 0, 0, 1).
+-All/BackdropFilterOffsetTest.HiDpi/SkiaGraphiteDawn
+-All/LayerTreeHostFiltersPixelTest.BackdropFilterBlurOutsets/SkiaGraphiteDawn
+-All/LayerTreeHostFiltersPixelTest.BackdropFilterBlurRect/SkiaGraphiteDawn
+-All/LayerTreeHostFiltersPixelTest.BackdropFilterBlurRounded/SkiaGraphiteDawn
+-All/LayerTreeHostFiltersPixelTest.BackdropFilterBoundsWithChildren/SkiaGraphiteDawn
+-All/LayerTreeHostFiltersPixelTest.BackdropFilterInvalid/SkiaGraphiteDawn
+-All/LayerTreeHostFiltersPixelTest.BlurFilterWithClip/SkiaGraphiteDawn
+-All/LayerTreeHostFiltersPixelTest.EnlargedTextureWithAlphaThresholdFilter/SkiaGraphiteDawn
+-All/LayerTreeHostFiltersPixelTest.EnlargedTextureWithCropOffsetFilter/SkiaGraphiteDawn
+-All/LayerTreeHostFiltersPixelTest.NullFilter/SkiaGraphiteDawn
+-All/LayerTreeHostFiltersPixelTest.RotatedDropShadowFilter/SkiaGraphiteDawn
+-All/LayerTreeHostFiltersPixelTest.TranslatedFilter/SkiaGraphiteDawn
+-All/LayerTreeHostMirrorPixelTest.MirrorLayer/SkiaGraphiteDawn
+-All/LayerTreeHostOverlayScrollbarsPixelTest.NinePatchScrollbarScaledDown/SkiaGraphiteDawn
+-All/LayerTreeHostOverlayScrollbarsPixelTest.NinePatchScrollbarScaledUp/SkiaGraphiteDawn
+-All/LayerTreeHostReadbackDeviceScalePixelTest.ReadbackNonRootLayerSubrect/SkiaGraphiteDawn_Bitmap
+-All/LayerTreeHostReadbackDeviceScalePixelTest.ReadbackSubrect/SkiaGraphiteDawn_Bitmap
+-All/LayerTreeHostReadbackPixelTest.HiddenSubtreeNotVisibleWhenDrawnForReadback/SkiaGraphiteDawn_Bitmap
+-All/LayerTreeHostReadbackPixelTest.ReadbackHiddenSubtree/SkiaGraphiteDawn_Bitmap
+-All/LayerTreeHostReadbackPixelTest.ReadbackNonRootLayerOutsideViewport/SkiaGraphiteDawn_Bitmap
+-All/LayerTreeHostReadbackPixelTest.ReadbackNonRootLayerSubrect/SkiaGraphiteDawn_Bitmap
+-All/LayerTreeHostReadbackPixelTest.ReadbackOutsideViewportWhenNoDamage/SkiaGraphiteDawn_Bitmap
+-All/LayerTreeHostReadbackPixelTest.ReadbackRootLayerWithChild/SkiaGraphiteDawn_Bitmap
+-All/LayerTreeHostReadbackPixelTest.ReadbackSmallNonRootLayerWithChild/SkiaGraphiteDawn_Bitmap
+-All/LayerTreeHostReadbackPixelTest.ReadbackSubrect/SkiaGraphiteDawn_Bitmap
+-All/LayerTreeHostReadbackPixelTest.ReadbackSubtreeExtendsBeyondTargetLayer/SkiaGraphiteDawn_Bitmap
+-All/LayerTreeHostReadbackPixelTest.ReadbackSubtreeSurroundsTargetLayer/SkiaGraphiteDawn_Bitmap
+-All/LayerTreeHostReadbackPixelTest.ReadbackWhenNoDamage/SkiaGraphiteDawn_Bitmap
+-All/LayerTreeHostTilesTestPartialInvalidation.FullRaster/SkiaGraphiteDawn_GPU
+-All/LayerTreeHostTilesTestPartialInvalidation.PartialRaster/SkiaGraphiteDawn_GPU
+-All/LayerTreeHostTilesTestPartialInvalidationMultiThread.FullRaster/SkiaGraphiteDawn_GPU
+-All/LayerTreeHostTilesTestPartialInvalidationMultiThread.PartialRaster/SkiaGraphiteDawn_GPU
+-All/LayerTreeHostTilesTestRasterColorSpace.CustomColorSpace/SkiaGraphiteDawn_GPU
+-All/LayerTreeHostTilesTestRasterColorSpace.GenericRGB/SkiaGraphiteDawn_GPU
+-All/LayerTreeHostTilesTestRasterColorSpace.sRGB/SkiaGraphiteDawn_GPU
+
+# Spot checking seems to show that the following tests fail due to reading from
+# a render target not being supported in the simulator. Fail with error output
+# similar to:
+#
+# [graphite] ** ERROR ** Render pipeline creation failure:
+# Error Domain=CompilerError Code=2 "reading from a rendertarget is not
+# supported" UserInfo={NSLocalizedDescription=reading from a rendertarget is
+# not supported}
+#
+# DrawPass.cpp(686)] [graphite] WARNING - Failed to create GraphicsPipeline for
+# draw in RenderPass. Dropping pass!
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_Color
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_ColorBurn
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_ColorDodge
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_Darken
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_Difference
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_Exclusion
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_HardLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_Hue
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_Lighten
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_Luminosity
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_Multiply
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_Overlay
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_Saturation
+-B/LayerTreeHostBlendingPixelTest.BlendingWithBackdropFilter/SkiaGraphiteMetal_GPU_SoftLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_Color
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_ColorBurn
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_ColorDodge
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_Darken
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_Difference
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_Exclusion
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_HardLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_Hue
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_Lighten
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_Luminosity
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_Multiply
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_Overlay
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_Saturation
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPass/SkiaGraphiteMetal_GPU_SoftLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_Color
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_ColorBurn
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_ColorDodge
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_Darken
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_Difference
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_Exclusion
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_HardLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_Hue
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_Lighten
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_Luminosity
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_Multiply
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_Overlay
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_Saturation
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassAA/SkiaGraphiteMetal_GPU_SoftLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_Color
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_ColorBurn
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_ColorDodge
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_Darken
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_Difference
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_Exclusion
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_HardLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_Hue
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_Lighten
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_Luminosity
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_Multiply
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_Overlay
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_Saturation
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrix/SkiaGraphiteMetal_GPU_SoftLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_Color
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_ColorBurn
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_ColorDodge
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_Darken
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_Difference
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_Exclusion
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_HardLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_Hue
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_Lighten
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_Luminosity
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_Multiply
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_Overlay
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_Saturation
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassColorMatrixAA/SkiaGraphiteMetal_GPU_SoftLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_Color
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_ColorBurn
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_ColorDodge
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_Darken
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_Difference
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_Exclusion
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_HardLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_Hue
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_Lighten
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_Luminosity
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_Multiply
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_Overlay
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_Saturation
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMask/SkiaGraphiteMetal_GPU_SoftLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_Color
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_ColorBurn
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_ColorDodge
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_Darken
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_Difference
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_Exclusion
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_HardLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_Hue
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_Lighten
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_Luminosity
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_Multiply
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_Overlay
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_Saturation
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskAA/SkiaGraphiteMetal_GPU_SoftLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_Color
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_ColorBurn
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_ColorDodge
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_Darken
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_Difference
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_Exclusion
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_HardLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_Hue
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_Lighten
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_Luminosity
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_Multiply
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_Overlay
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_Saturation
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrix/SkiaGraphiteMetal_GPU_SoftLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_Color
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_ColorBurn
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_ColorDodge
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_Darken
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_Difference
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_Exclusion
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_HardLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_Hue
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_Lighten
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_Luminosity
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_Multiply
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_Overlay
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_Saturation
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRenderPassWithMaskColorMatrixAA/SkiaGraphiteMetal_GPU_SoftLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_Color
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_ColorBurn
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_ColorDodge
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_Darken
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_Difference
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_Exclusion
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_HardLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_Hue
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_Lighten
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_Luminosity
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_Multiply
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_Overlay
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_Saturation
+-B/LayerTreeHostBlendingPixelTest.BlendingWithRoot/SkiaGraphiteMetal_GPU_SoftLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_Color
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_ColorBurn
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_ColorDodge
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_Darken
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_Difference
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_Exclusion
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_HardLight
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_Hue
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_Lighten
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_Luminosity
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_Multiply
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_Overlay
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_Saturation
+-B/LayerTreeHostBlendingPixelTest.BlendingWithTransparent/SkiaGraphiteMetal_GPU_SoftLight
diff --git a/testing/buildbot/filters/ios.viz_unittests.filter b/testing/buildbot/filters/ios.viz_unittests.filter
new file mode 100644
index 0000000..d8bbc49
--- /dev/null
+++ b/testing/buildbot/filters/ios.viz_unittests.filter
@@ -0,0 +1,62 @@
+# The following appear to fail with imperceptible pixel differences.
+-DelegatedInkTest.DrawTrailWithPredictionDisabled/SkiaGraphiteDawn
+-DelegatedInkTest.DrawTrailWithPredictionDisabled/SkiaGraphiteMetal
+-DelegatedInkWithPredictionTest.DelegatedInkTrailAfterBatchedQuads/SkiaGraphiteDawn
+-DelegatedInkWithPredictionTest.DelegatedInkTrailAfterBatchedQuads/SkiaGraphiteMetal
+-DelegatedInkWithPredictionTest.DrawOneTrailAndErase/SkiaGraphiteDawn
+-DelegatedInkWithPredictionTest.DrawOneTrailAndErase/SkiaGraphiteMetal
+-DelegatedInkWithPredictionTest.DrawTrailsWithDifferentPointerIds/SkiaGraphiteDawn
+-DelegatedInkWithPredictionTest.DrawTrailsWithDifferentPointerIds/SkiaGraphiteMetal
+-DelegatedInkWithPredictionTest.DrawTwoTrailsAndErase/SkiaGraphiteDawn
+-DelegatedInkWithPredictionTest.DrawTwoTrailsAndErase/SkiaGraphiteMetal
+-DelegatedInkWithPredictionTest.IdenticalTrailDrawnAfterSameMetadataReceived/SkiaGraphiteDawn
+-DelegatedInkWithPredictionTest.IdenticalTrailDrawnAfterSameMetadataReceived/SkiaGraphiteMetal
+-DelegatedInkWithPredictionTest.TrailExtendsBeyondPresentationArea/SkiaGraphiteDawn
+-DelegatedInkWithPredictionTest.TrailExtendsBeyondPresentationArea/SkiaGraphiteMetal
+-GPURendererPixelTest.AntiAliasing/SkiaGraphiteMetal
+-GPURendererPixelTest.AntiAliasingPerspective/SkiaGraphiteMetal
+-IntersectingVideoQuadPixelTest.Y16VideoQuads/SkiaGraphiteMetal
+-IntersectingVideoQuadPixelTest.YUVVideoQuads/SkiaGraphiteMetal
+-RendererPixelTest.RoundedCornerOnRenderPass/SkiaGraphiteMetal
+-SurfaceAggregatorPixelTest.DrawAndEraseDelegatedInkTrail/SkiaGraphiteDawn
+-SurfaceAggregatorPixelTest.DrawAndEraseDelegatedInkTrail/SkiaGraphiteMetal
+
+# These tests fail with perceptible pixel differences
+-FromColorSpace/ColorTransformPixelTest.Basic/118
+-FromColorSpace/ColorTransformPixelTest.Basic/119
+
+# Spot checking seems to show that the following fail with errors similar to:
+# dawn_context_provider.cc(448) First instance (1) must be zero.
+# - While encoding [RenderPassEncoder].DrawIndexed(69, 1, 0, 0, 1).
+-GPURendererPixelTest.AntiAliasing/SkiaGraphiteDawn
+-GPURendererPixelTest.AntiAliasingPerspective/SkiaGraphiteDawn
+-GPURendererPixelTest.AxisAligned/SkiaGraphiteDawn
+-GPURendererPixelTest.BlendingWithoutAntiAliasing/SkiaGraphiteDawn
+-GPURendererPixelTest.CheckReadbackSubset/SkiaGraphiteDawn
+-GPURendererPixelTest.OverlayHintRequiredFallback/SkiaGraphiteDawn
+-GPURendererPixelTest.RenderPassDrawQuadForceAntiAliasingOff/SkiaGraphiteDawn
+-GPURendererPixelTest.SolidColorDrawQuadForceAntiAliasingOff/SkiaGraphiteDawn
+-GPURendererPixelTest.TextureQuadBatching/SkiaGraphiteDawn
+-IntersectingQuadPixelTest.FlippedTexturedQuads/SkiaGraphiteDawn
+-IntersectingQuadPixelTest.NonFlippedTexturedQuads/SkiaGraphiteDawn
+-IntersectingQuadPixelTest.RenderPassQuads/SkiaGraphiteDawn
+-IntersectingQuadPixelTest.SolidColorQuads/SkiaGraphiteDawn
+-IntersectingQuadPixelTest.TexturedQuads/SkiaGraphiteDawn
+-IntersectingVideoQuadPixelTest.Y16VideoQuads/SkiaGraphiteDawn
+-IntersectingVideoQuadPixelTest.YUVVideoQuads/SkiaGraphiteDawn
+-RendererPixelBypassTest.BypassableRenderPassQuad/SkiaGraphiteDawn
+-RendererPixelTest.BlurExpandsBounds/SkiaGraphiteDawn
+-RendererPixelTest.EnlargedRenderPassTexture/SkiaGraphiteDawn
+-RendererPixelTest.EnlargedRenderPassTextureWithAntiAliasing/SkiaGraphiteDawn
+-RendererPixelTest.FastPassColorFilterAlpha/SkiaGraphiteDawn
+-RendererPixelTest.FastPassColorFilterAlphaTranslation/SkiaGraphiteDawn
+-RendererPixelTest.FastPassFilterChain/SkiaGraphiteDawn
+-RendererPixelTest.FastPassSaturateFilter/SkiaGraphiteDawn
+-RendererPixelTest.RoundedCornerOnRenderPass/SkiaGraphiteDawn
+-RendererPixelTestWithBackdropFilter.InvertFilter/SkiaGraphiteDawn
+-RendererPixelTestWithBackdropFilter.OffsetFilter/SkiaGraphiteDawn
+-RendererPixelTestWithBackdropFilter.ZoomFilter/SkiaGraphiteDawn
+-RendererPixelTestWithFlippedOutputSurface.CheckChildPassUnflipped/SkiaGraphiteDawn
+-RendererPixelTestWithFlippedOutputSurface.ExplicitFlipTest/SkiaGraphiteDawn
+-SurfaceAggregatorPixelTest.DrawAggregatedFrameWithSurfaceTransforms/SkiaGraphiteDawn
+-SurfaceAggregatorPixelTest.DrawSimpleAggregatedFrame/SkiaGraphiteDawn
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index c23beb6..e5cd5d7e 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -3852,7 +3852,14 @@
       'boringssl_ssl_tests': {},
       'capture_unittests': {},
       'cast_unittests': {},
-      'cc_unittests': {},
+      'cc_unittests': {
+        'test': 'cc_unittests',
+        'args': [
+          '--test-launcher-bot-mode',
+          '--test-launcher-filter-file=testing/buildbot/filters/ios.cc_unittests.filter',
+          '--use-gpu-in-tests',
+        ],
+      },
       'components_browsertests': {},
       'components_unittests': {},
       'content_browsertests': {
@@ -3887,6 +3894,24 @@
       'libjingle_xmpp_unittests': {},
       'liburlpattern_unittests': {},
       'media_unittests': {},
+      'media_unittests_skia_graphite_dawn': {
+        'test': 'media_unittests',
+        'args': [
+          '--test-launcher-bot-mode',
+          '--enable-features=SkiaGraphite',
+          '--skia-graphite-backend=dawn',
+          '--use-gpu-in-tests',
+        ],
+      },
+      'media_unittests_skia_graphite_metal': {
+        'test': 'media_unittests',
+        'args': [
+          '--test-launcher-bot-mode',
+          '--enable-features=SkiaGraphite',
+          '--skia-graphite-backend=metal',
+          '--use-gpu-in-tests',
+        ],
+      },
       'midi_unittests': {},
       'mojo_unittests': {},
       'net_unittests': {},
@@ -3905,7 +3930,14 @@
       'ui_touch_selection_unittests': {},
       'ui_unittests': {},
       'url_unittests': {},
-      'viz_unittests': {},
+      'viz_unittests': {
+        'test': 'viz_unittests',
+        'args': [
+          '--test-launcher-bot-mode',
+          '--test-launcher-filter-file=testing/buildbot/filters/ios.viz_unittests.filter',
+          '--use-gpu-in-tests',
+        ],
+      },
       'wtf_unittests': {},
       'zlib_unittests': {},
     },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 76aa8c6cc..f8b638dd 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3597,34 +3597,6 @@
             ]
         }
     ],
-    "ChromeStartReturnTime": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "params": {
-                        "start_surface_return_time_seconds": "28800",
-                        "start_surface_return_time_use_model": "false"
-                    },
-                    "enable_features": [
-                        "StartSurfaceReturnTime"
-                    ]
-                },
-                {
-                    "name": "Enabled_Model",
-                    "params": {
-                        "start_surface_return_time_use_model": "true"
-                    },
-                    "enable_features": [
-                        "StartSurfaceReturnTime"
-                    ]
-                }
-            ]
-        }
-    ],
     "ChromeWideEchoCancellation": [
         {
             "platforms": [
@@ -7006,6 +6978,26 @@
             ]
         }
     ],
+    "FencedFramesEnableM120Features": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "FencedFramesM120FeaturesPart2"
+                    ]
+                }
+            ]
+        }
+    ],
     "FenderScriptScheduling": [
         {
             "platforms": [
@@ -9474,26 +9466,6 @@
             ]
         }
     ],
-    "JourneysZeroStateFiltering": [
-        {
-            "platforms": [
-                "chromeos",
-                "chromeos_lacros",
-                "fuchsia",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled_20230419",
-                    "enable_features": [
-                        "JourneysZeroStateFiltering"
-                    ]
-                }
-            ]
-        }
-    ],
     "KeyboardAccessoryAddressIPH": [
         {
             "platforms": [
@@ -11897,6 +11869,27 @@
             ]
         }
     ],
+    "PMProcessPriorityPolicy": [
+        {
+            "platforms": [
+                "android",
+                "android_webview",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "PMProcessPriorityPolicy"
+                    ]
+                }
+            ]
+        }
+    ],
     "PageAllocatorRetryOnCommitFailure": [
         {
             "platforms": [
diff --git a/third_party/blink/common/blob/OWNERS b/third_party/blink/common/blob/OWNERS
index ad58dae..85322b60 100644
--- a/third_party/blink/common/blob/OWNERS
+++ b/third_party/blink/common/blob/OWNERS
@@ -1,2 +1 @@
-file://storage/OWNERS
-
+file://storage/browser/blob/OWNERS
diff --git a/third_party/blink/public/common/blob/OWNERS b/third_party/blink/public/common/blob/OWNERS
index ad58dae..85322b60 100644
--- a/third_party/blink/public/common/blob/OWNERS
+++ b/third_party/blink/public/common/blob/OWNERS
@@ -1,2 +1 @@
-file://storage/OWNERS
-
+file://storage/browser/blob/OWNERS
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn
index 7b405ee..fd5fcc1 100644
--- a/third_party/blink/public/mojom/BUILD.gn
+++ b/third_party/blink/public/mojom/BUILD.gn
@@ -1290,6 +1290,9 @@
     "messaging/transferable_message.mojom",
     "messaging/user_activation_snapshot.mojom",
 
+    # Depends on cloneable message.
+    "broadcastchannel/broadcast_channel.mojom",
+
     # Depends on frame_policy.mojom.
     "fenced_frame/fenced_frame.mojom",
     "navigation/navigation_params.mojom",
@@ -1780,37 +1783,6 @@
   export_header_blink = "third_party/blink/public/platform/web_common.h"
 }
 
-# The mojom_broadcastchannel_bindings is separated from the rest of mojom files
-# to allow blink/renderer/core to depend on this.
-mojom("mojom_broadcastchannel_bindings") {
-  visibility = [ "//content/*" ]
-  visibility_blink = [ "//third_party/blink/renderer/core/*" ]
-  sources = [ "broadcastchannel/broadcast_channel.mojom" ]
-  public_deps = [
-    ":mojom_core",
-    "//url/mojom:url_mojom_origin",
-  ]
-
-  overridden_deps = [ ":mojom_core" ]
-  component_deps = [ "//third_party/blink/public/common" ]
-  overridden_deps_blink = []
-  component_deps_blink =
-      [ "//third_party/blink/renderer/bindings:generate_bindings_all" ]
-
-  component_output_prefix = "blink_mojom_broadcastchannel_bindings"
-
-  # See comment above.
-  export_class_attribute = "CONTENT_EXPORT"
-  export_define = "CONTENT_IMPLEMENTATION=1"
-  export_header = "content/common/content_export.h"
-
-  # Similarly, the blink variant must be linked with the core component
-  # since it uses types from it in its typemaps.
-  export_class_attribute_blink = "CORE_EXPORT"
-  export_define_blink = "BLINK_CORE_IMPLEMENTATION=1"
-  export_header_blink = "third_party/blink/renderer/core/core_export.h"
-}
-
 mojom("mojom_mhtml_load_result") {
   generate_java = true
   sources = [ "loader/mhtml_load_result.mojom" ]
diff --git a/third_party/blink/public/mojom/blob/OWNERS b/third_party/blink/public/mojom/blob/OWNERS
index 3d3d4fb0..02dddafe 100644
--- a/third_party/blink/public/mojom/blob/OWNERS
+++ b/third_party/blink/public/mojom/blob/OWNERS
@@ -1,4 +1,4 @@
-file://storage/OWNERS
+file://storage/browser/blob/OWNERS
 
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/public/mojom/storage_access/storage_access_handle.mojom b/third_party/blink/public/mojom/storage_access/storage_access_handle.mojom
index 7697e392..ddaa06d 100644
--- a/third_party/blink/public/mojom/storage_access/storage_access_handle.mojom
+++ b/third_party/blink/public/mojom/storage_access/storage_access_handle.mojom
@@ -5,6 +5,7 @@
 module blink.mojom;
 
 import "third_party/blink/public/mojom/blob/blob_url_store.mojom";
+import "third_party/blink/public/mojom/broadcastchannel/broadcast_channel.mojom";
 import "third_party/blink/public/mojom/cache_storage/cache_storage.mojom";
 import "third_party/blink/public/mojom/file_system_access/file_system_access_directory_handle.mojom";
 import "third_party/blink/public/mojom/file_system_access/file_system_access_error.mojom";
@@ -40,4 +41,7 @@
 
   // Binds a BlobURLStore with access to first-party storage.
   BindBlobStorage(pending_associated_receiver<BlobURLStore> receiver);
+
+  // Binds a BroadcastChannelProvider with access to first-party channels.
+  BindBroadcastChannel(pending_associated_receiver<BroadcastChannelProvider> receiver);
 };
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
index 0b0c260..ecd77da 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -4065,6 +4065,8 @@
   kStorageAccessAPI_requestStorageAccess_BeyondCookies_createObjectURL_Use = 4726,
   kStorageAccessAPI_requestStorageAccess_BeyondCookies_revokeObjectURL = 4727,
   kStorageAccessAPI_requestStorageAccess_BeyondCookies_revokeObjectURL_Use = 4728,
+  kStorageAccessAPI_requestStorageAccess_BeyondCookies_BroadcastChannel = 4729,
+  kStorageAccessAPI_requestStorageAccess_BeyondCookies_BroadcastChannel_Use = 4730,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc b/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc
index 2504d9bc..da7f7fa 100644
--- a/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc
@@ -34,8 +34,9 @@
 
   void LogSetter(const String& api_name,
                  const v8::Local<v8::Value>& new_value) override {
-    logged_activities_.push_back(
-        api_name + " | " + ToCoreStringWithUndefinedOrNullCheck(new_value));
+    logged_activities_.push_back(api_name + " | " +
+                                 ToCoreStringWithUndefinedOrNullCheck(
+                                     v8::Isolate::GetCurrent(), new_value));
   }
 
   void LogMethod(const String& api_name,
@@ -44,7 +45,8 @@
     String activity_string = api_name;
     for (int i = 0; i < argc; i++) {
       activity_string = activity_string + " | " +
-                        ToCoreStringWithUndefinedOrNullCheck(argv[i]);
+                        ToCoreStringWithUndefinedOrNullCheck(
+                            v8::Isolate::GetCurrent(), argv[i]);
     }
     logged_activities_.push_back(activity_string);
   }
diff --git a/third_party/blink/renderer/bindings/core/v8/capture_source_location.cc b/third_party/blink/renderer/bindings/core/v8/capture_source_location.cc
index 29ca509..ec80254 100644
--- a/third_party/blink/renderer/bindings/core/v8/capture_source_location.cc
+++ b/third_party/blink/renderer/bindings/core/v8/capture_source_location.cc
@@ -81,7 +81,7 @@
   }
 
   String url = ToCoreStringWithUndefinedOrNullCheck(
-      message->GetScriptOrigin().ResourceName());
+      isolate, message->GetScriptOrigin().ResourceName());
   if (url.empty()) {
     url = execution_context->Url();
   }
diff --git a/third_party/blink/renderer/bindings/core/v8/dictionary.cc b/third_party/blink/renderer/bindings/core/v8/dictionary.cc
index ec2e780..1dd81d7 100644
--- a/third_party/blink/renderer/bindings/core/v8/dictionary.cc
+++ b/third_party/blink/renderer/bindings/core/v8/dictionary.cc
@@ -164,18 +164,20 @@
       exception_state.RethrowV8Exception(try_catch.Exception());
       return HashMap<String, String>();
     }
-    V8StringResource<> string_key(key);
-    if (!string_key.Prepare(GetIsolate(), exception_state))
+    V8StringResource<> string_key(GetIsolate(), key);
+    if (!string_key.Prepare(exception_state)) {
       return HashMap<String, String>();
+    }
 
     v8::Local<v8::Value> value;
     if (!dictionary_object_->Get(V8Context(), key).ToLocal(&value)) {
       exception_state.RethrowV8Exception(try_catch.Exception());
       return HashMap<String, String>();
     }
-    V8StringResource<> string_value(value);
-    if (!string_value.Prepare(GetIsolate(), exception_state))
+    V8StringResource<> string_value(GetIsolate(), value);
+    if (!string_value.Prepare(exception_state)) {
       return HashMap<String, String>();
+    }
 
     if (!static_cast<const String&>(string_key).empty())
       own_properties.Set(string_key, string_value);
@@ -204,9 +206,10 @@
       exception_state.RethrowV8Exception(try_catch.Exception());
       return Vector<String>();
     }
-    V8StringResource<> string_key(key);
-    if (!string_key.Prepare(GetIsolate(), exception_state))
+    V8StringResource<> string_key(GetIsolate(), key);
+    if (!string_key.Prepare(exception_state)) {
       return Vector<String>();
+    }
 
     names.push_back(string_key);
   }
diff --git a/third_party/blink/renderer/bindings/core/v8/js_based_event_listener.cc b/third_party/blink/renderer/bindings/core/v8/js_based_event_listener.cc
index 9864d8e..457850e 100644
--- a/third_party/blink/renderer/bindings/core/v8/js_based_event_listener.cc
+++ b/third_party/blink/renderer/bindings/core/v8/js_based_event_listener.cc
@@ -170,8 +170,10 @@
     EventTarget& target) {
   v8::HandleScope handle_scope(GetIsolate());
   v8::Local<v8::Value> effective_function = GetEffectiveFunction(target);
-  if (effective_function->IsFunction())
-    return CaptureSourceLocation(effective_function.As<v8::Function>());
+  if (effective_function->IsFunction()) {
+    return CaptureSourceLocation(GetIsolate(),
+                                 effective_function.As<v8::Function>());
+  }
   return nullptr;
 }
 
diff --git a/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc b/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc
index 50306197..e22ccf32 100644
--- a/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc
+++ b/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc
@@ -487,22 +487,24 @@
   if (!property->IsString())
     return;
   // FIXME: Consider passing StringImpl directly.
-  AtomicString name = ToCoreAtomicString(property.As<v8::String>());
+  v8::Isolate* isolate = info.GetIsolate();
+  AtomicString name = ToCoreAtomicString(isolate, property.As<v8::String>());
   HTMLDocument* html_document =
       V8HTMLDocument::ToWrappableUnsafe(info.Holder());
   DCHECK(html_document);
   v8::Local<v8::Value> result =
-      GetNamedProperty(html_document, name, info.Holder(), info.GetIsolate());
+      GetNamedProperty(html_document, name, info.Holder(), isolate);
   if (!result.IsEmpty()) {
     V8SetReturnValue(info, result);
     return;
   }
   v8::Local<v8::Value> value;
   if (info.Holder()
-          ->GetRealNamedPropertyInPrototypeChain(
-              info.GetIsolate()->GetCurrentContext(), property.As<v8::String>())
-          .ToLocal(&value))
+          ->GetRealNamedPropertyInPrototypeChain(isolate->GetCurrentContext(),
+                                                 property.As<v8::String>())
+          .ToLocal(&value)) {
     V8SetReturnValue(info, value);
+  }
 }
 
 void LocalWindowProxy::NamedItemAdded(HTMLDocument* document,
diff --git a/third_party/blink/renderer/bindings/core/v8/module_record.cc b/third_party/blink/renderer/bindings/core/v8/module_record.cc
index ebf1540..91286c8 100644
--- a/third_party/blink/renderer/bindings/core/v8/module_record.cc
+++ b/third_party/blink/renderer/bindings/core/v8/module_record.cc
@@ -179,8 +179,9 @@
             v8_module_request->GetImportAssertions(),
             /*v8_import_assertions_has_positions=*/true);
 
-    requests.emplace_back(ToCoreString(v8_specifier), position,
-                          import_assertions);
+    requests.emplace_back(
+        ToCoreString(script_state->GetIsolate(), v8_specifier), position,
+        import_assertions);
   }
 
   return requests;
@@ -201,7 +202,8 @@
   DCHECK(modulator);
 
   ModuleRequest module_request(
-      ToCoreStringWithNullCheck(specifier), TextPosition::MinimumPosition(),
+      ToCoreStringWithNullCheck(isolate, specifier),
+      TextPosition::MinimumPosition(),
       ModuleRecord::ToBlinkImportAssertions(
           context, referrer, import_assertions,
           /*v8_import_assertions_has_positions=*/true));
@@ -230,6 +232,7 @@
   // in the form [key1, value1, key2, value2, ...].
   const int kV8AssertionEntrySize = v8_import_assertions_has_positions ? 3 : 2;
 
+  v8::Isolate* isolate = context->GetIsolate();
   Vector<ImportAssertion> import_assertions;
   int number_of_import_assertions =
       v8_import_assertions->Length() / kV8AssertionEntrySize;
@@ -254,8 +257,8 @@
           OrdinalNumber::FromZeroBasedInt(v8_assertion_loc.GetColumnNumber()));
     }
 
-    import_assertions.emplace_back(ToCoreString(v8_assertion_key),
-                                   ToCoreString(v8_assertion_value),
+    import_assertions.emplace_back(ToCoreString(isolate, v8_assertion_key),
+                                   ToCoreString(isolate, v8_assertion_value),
                                    assertion_position);
   }
 
diff --git a/third_party/blink/renderer/bindings/core/v8/module_record_test.cc b/third_party/blink/renderer/bindings/core/v8/module_record_test.cc
index 22baf833..89f0f55 100644
--- a/third_party/blink/renderer/bindings/core/v8/module_record_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/module_record_test.cc
@@ -287,7 +287,8 @@
           ->RunScriptAndReturnValue(&scope.GetWindow())
           .GetSuccessValueOrEmpty();
   ASSERT_TRUE(value->IsString());
-  EXPECT_EQ("bar", ToCoreString(v8::Local<v8::String>::Cast(value)));
+  EXPECT_EQ("bar", ToCoreString(scope.GetIsolate(),
+                                v8::Local<v8::String>::Cast(value)));
 
   v8::Local<v8::Object> module_namespace =
       v8::Local<v8::Object>::Cast(ModuleRecord::V8Namespace(module));
@@ -320,7 +321,8 @@
   v8::Local<v8::Value> exception =
       GetException(scope.GetScriptState(), std::move(result));
   ASSERT_TRUE(exception->IsString());
-  EXPECT_EQ("bar", ToCoreString(exception.As<v8::String>()));
+  EXPECT_EQ("bar",
+            ToCoreString(scope.GetIsolate(), exception.As<v8::String>()));
 }
 
 }  // namespace
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 588581e..899929d 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
@@ -234,12 +234,14 @@
   NativeValueTraitsStringAdapter(const NativeValueTraitsStringAdapter&) =
       delete;
   NativeValueTraitsStringAdapter(NativeValueTraitsStringAdapter&&) = default;
-  explicit NativeValueTraitsStringAdapter(v8::Local<v8::String> value)
-      : v8_string_(value) {}
-  explicit NativeValueTraitsStringAdapter(const String& value)
-      : wtf_string_(value) {}
-  explicit NativeValueTraitsStringAdapter(int32_t value)
-      : wtf_string_(ToBlinkString(value)) {}
+  explicit NativeValueTraitsStringAdapter(v8::Isolate* isolate,
+                                          v8::Local<v8::String> value)
+      : v8_string_(value), isolate_(isolate) {}
+  explicit NativeValueTraitsStringAdapter(v8::Isolate* isolate,
+                                          const String& value)
+      : isolate_(isolate), wtf_string_(value) {}
+  explicit NativeValueTraitsStringAdapter(v8::Isolate* isolate, int32_t value)
+      : isolate_(isolate), wtf_string_(ToBlinkString(value)) {}
 
   NativeValueTraitsStringAdapter& operator=(
       const NativeValueTraitsStringAdapter&) = delete;
@@ -251,10 +253,11 @@
     return *this;
   }
 
-  void Init(v8::Local<v8::String> value) {
+  void Init(v8::Isolate* isolate, v8::Local<v8::String> value) {
     DCHECK(v8_string_.IsEmpty());
     DCHECK(wtf_string_.IsNull());
     v8_string_ = value;
+    isolate_ = isolate;
   }
 
   // NOLINTNEXTLINE(google-explicit-constructor)
@@ -270,19 +273,23 @@
   template <class StringType>
   StringType ToString() const {
     if (LIKELY(!v8_string_.IsEmpty()))
-      return ToBlinkString<StringType>(v8_string_, kExternalize);
+      return ToBlinkString<StringType>(isolate_, v8_string_, kExternalize);
     return StringType(wtf_string_);
   }
 
   StringView ToStringView() const& {
     if (LIKELY(!v8_string_.IsEmpty())) {
-      return ToBlinkStringView(v8_string_, string_view_backing_store_,
+      return ToBlinkStringView(isolate_, v8_string_, string_view_backing_store_,
                                kExternalize);
     }
     return wtf_string_;
   }
 
+  // Careful here, ordering some of the members here (mainly the isolate) may
+  // be important in the hot path. Having the isolate the second member showed
+  // a performance gain on MacOS arm (see crbug.com/1482549).
   v8::Local<v8::String> v8_string_;
+  v8::Isolate* isolate_ = nullptr;
   String wtf_string_;
   mutable StringView::StackBackingStore string_view_backing_store_;
 };
@@ -297,11 +304,13 @@
       v8::Isolate* isolate,
       v8::Local<v8::Value> value,
       ExceptionState& exception_state) {
-    if (value->IsString() and value.As<v8::String>()->ContainsOnlyOneByte())
-      return bindings::NativeValueTraitsStringAdapter(value.As<v8::String>());
+    if (value->IsString() and value.As<v8::String>()->ContainsOnlyOneByte()) {
+      return bindings::NativeValueTraitsStringAdapter(isolate,
+                                                      value.As<v8::String>());
+    }
     if (value->IsInt32()) {
       return bindings::NativeValueTraitsStringAdapter(
-          value.As<v8::Int32>()->Value());
+          isolate, value.As<v8::Int32>()->Value());
     }
 
     if (mode == bindings::IDLStringConvMode::kNullable) {
@@ -320,7 +329,7 @@
           "String contains non ISO-8859-1 code point.");
       return bindings::NativeValueTraitsStringAdapter();
     }
-    return bindings::NativeValueTraitsStringAdapter(v8_string);
+    return bindings::NativeValueTraitsStringAdapter(isolate, v8_string);
   }
 };
 
@@ -357,11 +366,13 @@
       v8::Isolate* isolate,
       v8::Local<v8::Value> value,
       ExceptionState& exception_state) {
-    if (value->IsString())
-      return bindings::NativeValueTraitsStringAdapter(value.As<v8::String>());
+    if (value->IsString()) {
+      return bindings::NativeValueTraitsStringAdapter(isolate,
+                                                      value.As<v8::String>());
+    }
     if (value->IsInt32()) {
       return bindings::NativeValueTraitsStringAdapter(
-          value.As<v8::Int32>()->Value());
+          isolate, value.As<v8::Int32>()->Value());
     }
 
     if (mode == bindings::IDLStringConvMode::kNullable) {
@@ -369,8 +380,10 @@
         return bindings::NativeValueTraitsStringAdapter();
     }
     if (mode == bindings::IDLStringConvMode::kLegacyNullToEmptyString) {
-      if (value->IsNull())
-        return bindings::NativeValueTraitsStringAdapter(g_empty_string);
+      if (value->IsNull()) {
+        return bindings::NativeValueTraitsStringAdapter(isolate,
+                                                        g_empty_string);
+      }
     }
 
     v8::TryCatch try_catch(isolate);
@@ -379,7 +392,7 @@
       exception_state.RethrowV8Exception(try_catch.Exception());
       return bindings::NativeValueTraitsStringAdapter();
     }
-    return bindings::NativeValueTraitsStringAdapter(v8_string);
+    return bindings::NativeValueTraitsStringAdapter(isolate, v8_string);
   }
 };
 
@@ -422,7 +435,7 @@
       return bindings::NativeValueTraitsStringAdapter();
 
     return bindings::NativeValueTraitsStringAdapter(
-        ReplaceUnmatchedSurrogates(string));
+        isolate, ReplaceUnmatchedSurrogates(string));
   }
 };
 
diff --git a/third_party/blink/renderer/bindings/core/v8/referrer_script_info.cc b/third_party/blink/renderer/bindings/core/v8/referrer_script_info.cc
index 161e965..7eed34e 100644
--- a/third_party/blink/renderer/bindings/core/v8/referrer_script_info.cc
+++ b/third_party/blink/renderer/bindings/core/v8/referrer_script_info.cc
@@ -78,7 +78,7 @@
       host_defined_options->Get(isolate, kBaseURL);
   SECURITY_CHECK(base_url_value->IsString());
   String base_url_string =
-      ToCoreString(v8::Local<v8::String>::Cast(base_url_value));
+      ToCoreString(isolate, v8::Local<v8::String>::Cast(base_url_value));
   KURL base_url = base_url_string.empty() ? KURL() : KURL(base_url_string);
   DCHECK(base_url.IsNull() || base_url.IsValid());
   if (base_url.IsNull()) {
@@ -95,7 +95,8 @@
   v8::Local<v8::Primitive> nonce_value =
       host_defined_options->Get(isolate, kNonce);
   SECURITY_CHECK(nonce_value->IsString());
-  String nonce = ToCoreString(v8::Local<v8::String>::Cast(nonce_value));
+  String nonce =
+      ToCoreString(isolate, v8::Local<v8::String>::Cast(nonce_value));
 
   v8::Local<v8::Primitive> parser_state_value =
       host_defined_options->Get(isolate, kParserState);
diff --git a/third_party/blink/renderer/bindings/core/v8/script_controller.cc b/third_party/blink/renderer/bindings/core/v8/script_controller.cc
index e07408b..674ebc70 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_controller.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_controller.cc
@@ -260,7 +260,8 @@
       SanitizeScriptErrors::kDoNotSanitize);
 
   DCHECK_EQ(&window_->GetScriptController(), this);
-  v8::HandleScope handle_scope(GetIsolate());
+  v8::Isolate* isolate = GetIsolate();
+  v8::HandleScope handle_scope(isolate);
   v8::Local<v8::Value> v8_result =
       script->RunScriptAndReturnValue(window_).GetSuccessValueOrEmpty();
   UseCounter::Count(window_.Get(), WebFeature::kExecutedJavaScriptURL);
@@ -302,7 +303,7 @@
   DCHECK(previous_document_loader);
   auto params =
       previous_document_loader->CreateWebNavigationParamsToCloneDocument();
-  String result = ToCoreString(v8::Local<v8::String>::Cast(v8_result));
+  String result = ToCoreString(isolate, v8::Local<v8::String>::Cast(v8_result));
   WebNavigationParams::FillStaticResponse(
       params.get(), "text/html", "UTF-8",
       StringUTF8Adaptor(
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_property_test.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_property_test.cc
index ada1aa7..2ffb6be 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise_property_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise_property_test.cc
@@ -227,7 +227,8 @@
     PerformMicrotaskCheckpoint();
     {
       ScriptState::Scope scope(MainScriptState());
-      actual = ToCoreString(actual_value.V8Value()
+      actual = ToCoreString(MainScriptState()->GetIsolate(),
+                            actual_value.V8Value()
                                 ->ToString(MainScriptState()->GetContext())
                                 .ToLocalChecked());
     }
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_test.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_test.cc
index e8b5528f..195200b 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_test.cc
@@ -31,6 +31,7 @@
   ScriptValue Call(ScriptState* script_state, ScriptValue value) override {
     DCHECK(!value.IsEmpty());
     *value_ = ToCoreString(
+        script_state->GetIsolate(),
         value.V8Value()->ToString(script_state->GetContext()).ToLocalChecked());
     return value;
   }
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_with_tracker_test.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_with_tracker_test.cc
index b97ca965..9114f2c 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_with_tracker_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_with_tracker_test.cc
@@ -24,6 +24,7 @@
   ScriptValue Call(ScriptState* script_state, ScriptValue value) override {
     DCHECK(!value.IsEmpty());
     *value_ = ToCoreString(
+        script_state->GetIsolate(),
         value.V8Value()->ToString(script_state->GetContext()).ToLocalChecked());
     return value;
   }
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_test.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_test.cc
index 971adb6a..f0d40789 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise_test.cc
@@ -113,7 +113,8 @@
 };
 
 String ToString(v8::Local<v8::Context> context, const ScriptValue& value) {
-  return ToCoreString(value.V8Value()->ToString(context).ToLocalChecked());
+  return ToCoreString(context->GetIsolate(),
+                      value.V8Value()->ToString(context).ToLocalChecked());
 }
 
 Vector<String> ToStringArray(v8::Isolate* isolate, const ScriptValue& value) {
diff --git a/third_party/blink/renderer/bindings/core/v8/script_regexp.cc b/third_party/blink/renderer/bindings/core/v8/script_regexp.cc
index b076781ef..9c2e6eab 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_regexp.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_regexp.cc
@@ -72,8 +72,8 @@
     regex_.Reset(isolate, regex);
   }
   if (try_catch.HasCaught() && !try_catch.Message().IsEmpty()) {
-    exception_message_ =
-        ToCoreStringWithUndefinedOrNullCheck(try_catch.Message()->Get());
+    exception_message_ = ToCoreStringWithUndefinedOrNullCheck(
+        isolate, try_catch.Message()->Get());
   }
 }
 
@@ -138,8 +138,8 @@
         return -1;
       String group_string;
       if (group->IsString()) {
-        group_string =
-            ToBlinkString<String>(group.As<v8::String>(), kExternalize);
+        group_string = ToBlinkString<String>(isolate, group.As<v8::String>(),
+                                             kExternalize);
       }
       group_list->push_back(group_string);
     }
diff --git a/third_party/blink/renderer/bindings/core/v8/script_value.cc b/third_party/blink/renderer/bindings/core/v8/script_value.cc
index ee44862e..8c0b9eb 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_value.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_value.cc
@@ -59,7 +59,7 @@
   v8::Local<v8::Value> string = V8Value();
   if (string.IsEmpty() || !string->IsString())
     return false;
-  result = ToCoreString(v8::Local<v8::String>::Cast(string));
+  result = ToCoreString(GetIsolate(), v8::Local<v8::String>::Cast(string));
   return true;
 }
 
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc
index 8cbb19a..9d3fdef9 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc
@@ -910,7 +910,8 @@
                                  exception_state_->GetContext());
   exception_state.ThrowDOMException(
       DOMExceptionCode::kDataCloneError,
-      ToBlinkString<String>(v8_message, kDoNotExternalize));
+      ToBlinkString<String>(script_state_->GetIsolate(), v8_message,
+                            kDoNotExternalize));
 }
 
 v8::Maybe<bool> V8ScriptValueSerializer::WriteHostObject(
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc
index 7dce0ab..64c5e49 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc
@@ -129,6 +129,7 @@
 
 String ToJSON(v8::Local<v8::Object> object, const V8TestingScope& scope) {
   return ToBlinkString<String>(
+      scope.GetIsolate(),
       v8::JSON::Stringify(scope.GetContext(), object).ToLocalChecked(),
       kDoNotExternalize);
 }
diff --git a/third_party/blink/renderer/bindings/core/v8/to_v8_test.cc b/third_party/blink/renderer/bindings/core/v8/to_v8_test.cc
index 173fda1..69941d7 100644
--- a/third_party/blink/renderer/bindings/core/v8/to_v8_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/to_v8_test.cc
@@ -33,7 +33,8 @@
     return;
   }
   String actual_string =
-      ToCoreString(actual->ToString(scope->GetContext()).ToLocalChecked());
+      ToCoreString(scope->GetIsolate(),
+                   actual->ToString(scope->GetContext()).ToLocalChecked());
   if (String(expected) != actual_string) {
     ADD_FAILURE_AT(path, line_number)
         << "toV8 returns an incorrect value.\n  Actual: "
@@ -250,13 +251,15 @@
           .ToLocalChecked();
   EXPECT_TRUE(one->IsObject());
   EXPECT_EQ(String("foo"),
-            ToCoreString(one->ToString(context).ToLocalChecked()));
+            ToCoreString(scope.GetIsolate(),
+                         one->ToString(context).ToLocalChecked()));
   v8::Local<v8::Value> two =
       result->Get(context, V8String(scope.GetIsolate(), "two"))
           .ToLocalChecked();
   EXPECT_TRUE(two->IsObject());
   EXPECT_EQ(String("bar"),
-            ToCoreString(two->ToString(context).ToLocalChecked()));
+            ToCoreString(scope.GetIsolate(),
+                         two->ToString(context).ToLocalChecked()));
 }
 
 TEST(ToV8Test, stringVectorVector) {
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 eb55e87..efc3608 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
@@ -37,7 +37,8 @@
     return;
   }
   String actual_string =
-      ToCoreString(actual->ToString(scope.GetContext()).ToLocalChecked());
+      ToCoreString(scope.GetIsolate(),
+                   actual->ToString(scope.GetContext()).ToLocalChecked());
   if (expected != actual_string) {
     ADD_FAILURE_AT(path, line_number)
         << "ToV8 returns an incorrect value.\n  Actual: "
@@ -493,13 +494,15 @@
           .ToLocalChecked();
   EXPECT_TRUE(one->IsObject());
   EXPECT_EQ(String("foo"),
-            ToCoreString(one->ToString(scope.GetContext()).ToLocalChecked()));
+            ToCoreString(scope.GetIsolate(),
+                         one->ToString(scope.GetContext()).ToLocalChecked()));
   v8::Local<v8::Value> two =
       result->Get(scope.GetContext(), V8String(scope.GetIsolate(), "two"))
           .ToLocalChecked();
   EXPECT_TRUE(two->IsObject());
   EXPECT_EQ(String("bar"),
-            ToCoreString(two->ToString(scope.GetContext()).ToLocalChecked()));
+            ToCoreString(scope.GetIsolate(),
+                         two->ToString(scope.GetContext()).ToLocalChecked()));
 }
 
 TEST(ToV8TraitsTest, NullStringInputForNoneNullableType) {
@@ -636,7 +639,8 @@
           scope.GetScriptState(), absl::optional<base::Time>(expected_date))
           .ToLocal(&result));
   String actual_string =
-      ToCoreString(result->ToString(scope.GetContext()).ToLocalChecked());
+      ToCoreString(scope.GetIsolate(),
+                   result->ToString(scope.GetContext()).ToLocalChecked());
   base::Time actual_date;
   EXPECT_TRUE(
       base::Time::FromString(actual_string.Ascii().c_str(), &actual_date));
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
index eefae4b5..50a504f 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
@@ -184,7 +184,8 @@
     context->AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>(
         mojom::ConsoleMessageSource::kJavaScript,
         MessageLevelFromNonFatalErrorLevel(message->ErrorLevel()),
-        ToCoreStringWithNullCheck(message->Get()), std::move(location)));
+        ToCoreStringWithNullCheck(isolate, message->Get()),
+        std::move(location)));
     return;
   }
 
@@ -193,7 +194,7 @@
                                           : SanitizeScriptErrors::kSanitize;
 
   ErrorEvent* event = ErrorEvent::Create(
-      ToCoreStringWithNullCheck(message->Get()), std::move(location),
+      ToCoreStringWithNullCheck(isolate, message->Get()), std::move(location),
       ScriptValue::From(script_state, data), &script_state->World());
 
   String message_for_console = ExtractMessageForConsole(isolate, data);
@@ -224,12 +225,13 @@
     context->AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>(
         mojom::ConsoleMessageSource::kJavaScript,
         MessageLevelFromNonFatalErrorLevel(message->ErrorLevel()),
-        ToCoreStringWithNullCheck(message->Get()), std::move(location)));
+        ToCoreStringWithNullCheck(isolate, message->Get()),
+        std::move(location)));
     return;
   }
 
   ErrorEvent* event = ErrorEvent::Create(
-      ToCoreStringWithNullCheck(message->Get()), std::move(location),
+      ToCoreStringWithNullCheck(isolate, message->Get()), std::move(location),
       ScriptValue::From(script_state, data), &script_state->World());
 
   const auto sanitize_script_errors = message->IsSharedCrossOrigin()
@@ -284,7 +286,7 @@
       v8::Exception::CreateMessage(isolate, exception);
   if (!message.IsEmpty()) {
     // message->Get() can be empty here. https://crbug.com/450330
-    error_message = ToCoreStringWithNullCheck(message->Get());
+    error_message = ToCoreStringWithNullCheck(isolate, message->Get());
     location = CaptureSourceLocation(isolate, message, context);
     if (message->IsSharedCrossOrigin())
       sanitize_script_errors = SanitizeScriptErrors::kDoNotSanitize;
@@ -642,11 +644,13 @@
     return promise;
   }
 
-  String specifier = ToCoreStringWithNullCheck(v8_specifier);
+  String specifier =
+      ToCoreStringWithNullCheck(script_state->GetIsolate(), v8_specifier);
   KURL referrer_resource_url;
   if (v8_referrer_resource_url->IsString()) {
     String referrer_resource_url_str =
-        ToCoreString(v8::Local<v8::String>::Cast(v8_referrer_resource_url));
+        ToCoreString(script_state->GetIsolate(),
+                     v8::Local<v8::String>::Cast(v8_referrer_resource_url));
     if (!referrer_resource_url_str.empty())
       referrer_resource_url = KURL(NullURL(), referrer_resource_url_str);
   }
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_object_builder_test.cc b/third_party/blink/renderer/bindings/core/v8/v8_object_builder_test.cc
index b1e6208..244a493 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_object_builder_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_object_builder_test.cc
@@ -21,6 +21,7 @@
   EXPECT_TRUE(json_object.IsObject());
 
   String json_string = ToBlinkString<String>(
+      scope.GetIsolate(),
       v8::JSON::Stringify(scope.GetContext(),
                           json_object.V8Value().As<v8::Object>())
           .ToLocalChecked(),
@@ -40,6 +41,7 @@
   EXPECT_TRUE(json_object.IsObject());
 
   String json_string = ToBlinkString<String>(
+      scope.GetIsolate(),
       v8::JSON::Stringify(scope.GetContext(),
                           json_object.V8Value().As<v8::Object>())
           .ToLocalChecked(),
@@ -59,6 +61,7 @@
   EXPECT_TRUE(json_object.IsObject());
 
   String json_string = ToBlinkString<String>(
+      scope.GetIsolate(),
       v8::JSON::Stringify(scope.GetContext(),
                           json_object.V8Value().As<v8::Object>())
           .ToLocalChecked(),
@@ -86,6 +89,7 @@
   EXPECT_TRUE(json_object.IsObject());
 
   String json_string = ToBlinkString<String>(
+      scope.GetIsolate(),
       v8::JSON::Stringify(scope.GetContext(),
                           json_object.V8Value().As<v8::Object>())
           .ToLocalChecked(),
@@ -111,6 +115,7 @@
   EXPECT_TRUE(result_json_object.IsObject());
 
   String json_string = ToBlinkString<String>(
+      scope.GetIsolate(),
       v8::JSON::Stringify(scope.GetContext(),
                           result_json_object.V8Value().As<v8::Object>())
           .ToLocalChecked(),
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
index fc8a0c4..ea4705e 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
@@ -468,7 +468,7 @@
 
     // ToCoreString here should be zero copy due to externalized string
     // unpacked.
-    String url = ToCoreString(script_url);
+    String url = ToCoreString(isolate, script_url);
     probe::ExecuteScript probe(context, isolate->GetCurrentContext(), url,
                                script->GetUnboundScript()->GetId());
     result = script->Run(isolate->GetCurrentContext(), host_defined_options);
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_string_resource.h b/third_party/blink/renderer/bindings/core/v8/v8_string_resource.h
index 158c161..c44432ca 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_string_resource.h
+++ b/third_party/blink/renderer/bindings/core/v8/v8_string_resource.h
@@ -55,13 +55,8 @@
   V8StringResource(const V8StringResource&) = delete;
   V8StringResource& operator=(const V8StringResource&) = delete;
 
-  V8StringResource() : mode_(kExternalize) {}
-
-  V8StringResource(v8::Local<v8::Value> object)
-      : v8_object_(object), mode_(kExternalize) {}
-
-  V8StringResource(const String& string)
-      : mode_(kExternalize), string_(string) {}
+  V8StringResource(v8::Isolate* isolate, v8::Local<v8::Value> object)
+      : isolate_(isolate), v8_object_(object), mode_(kExternalize) {}
 
   void operator=(v8::Local<v8::Value> object) { v8_object_ = object; }
 
@@ -69,8 +64,8 @@
 
   void operator=(std::nullptr_t) { SetString(String()); }
 
-  bool Prepare(v8::Isolate* isolate, ExceptionState& exception_state) {
-    return PrepareFast() || PrepareSlow(isolate, exception_state);
+  bool Prepare(ExceptionState& exception_state) {
+    return PrepareFast() || PrepareSlow(exception_state);
   }
 
   // Implicit conversions needed to make Blink bindings easier to use.
@@ -84,8 +79,8 @@
   // NOLINTNEXTLINE(google-explicit-constructor)
   operator StringView() const {
     if (LIKELY(!v8_object_.IsEmpty())) {
-      return ToBlinkStringView(v8_object_.As<v8::String>(), backing_store_,
-                               mode_);
+      return ToBlinkStringView(isolate_, v8_object_.As<v8::String>(),
+                               backing_store_, mode_);
     }
 
     return string_;
@@ -113,9 +108,9 @@
     return false;
   }
 
-  bool PrepareSlow(v8::Isolate* isolate, ExceptionState& exception_state) {
-    v8::TryCatch try_catch(isolate);
-    if (!v8_object_->ToString(isolate->GetCurrentContext())
+  bool PrepareSlow(ExceptionState& exception_state) {
+    v8::TryCatch try_catch(isolate_);
+    if (!v8_object_->ToString(isolate_->GetCurrentContext())
              .ToLocal(&v8_object_)) {
       exception_state.RethrowV8Exception(try_catch.Exception());
       return false;
@@ -133,12 +128,15 @@
 
   template <class StringType>
   StringType ToString() const {
-    if (LIKELY(!v8_object_.IsEmpty()))
-      return ToBlinkString<StringType>(v8_object_.As<v8::String>(), mode_);
+    if (LIKELY(!v8_object_.IsEmpty())) {
+      return ToBlinkString<StringType>(isolate_, v8_object_.As<v8::String>(),
+                                       mode_);
+    }
 
     return StringType(string_);
   }
 
+  v8::Isolate* isolate_;
   v8::Local<v8::Value> v8_object_;
   ExternalMode mode_;
   String string_;
diff --git a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules_test.cc b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules_test.cc
index c81f6395..24dd02d504 100644
--- a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules_test.cc
+++ b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules_test.cc
@@ -1896,9 +1896,9 @@
       V8ScriptValueSerializerForModules(script_state, serialize_options)
           .Serialize(v8_ab, exception_state));
   EXPECT_TRUE(exception_state.HadException());
-  EXPECT_THAT(ToCoreString(exception_state.GetException()
-                               ->ToString(scope.GetContext())
-                               .ToLocalChecked())
+  EXPECT_THAT(ToCoreString(isolate, exception_state.GetException()
+                                        ->ToString(scope.GetContext())
+                                        .ToLocalChecked())
                   .Ascii(),
               testing::StartsWith("TypeError"));
   EXPECT_FALSE(v8_ab->WasDetached());
diff --git a/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.cc b/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.cc
index 0ba4681c3e..5b4b8d4 100644
--- a/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.cc
+++ b/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.cc
@@ -188,7 +188,7 @@
     return IDBKey::CreateNumber(value.As<v8::Number>()->Value());
 
   if (value->IsString())
-    return IDBKey::CreateString(ToCoreString(value.As<v8::String>()));
+    return IDBKey::CreateString(ToCoreString(isolate, value.As<v8::String>()));
 
   if (value->IsDate() && !std::isnan(value.As<v8::Date>()->ValueOf()))
     return IDBKey::CreateDate(value.As<v8::Date>()->ValueOf());
@@ -799,9 +799,10 @@
     return SQLValue();
   if (value->IsNumber())
     return SQLValue(value.As<v8::Number>()->Value());
-  V8StringResource<> string_value(value);
-  if (!string_value.Prepare(isolate, exception_state))
+  V8StringResource<> string_value(isolate, value);
+  if (!string_value.Prepare(exception_state)) {
     return SQLValue();
+  }
   return SQLValue(string_value);
 }
 
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 8347432..6e0ada3 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
@@ -762,8 +762,9 @@
         # A key point of this fast path is that it doesn't require an
         # ExceptionState.
         fast_path_cond = "LIKELY({}->IsString())".format(v8_value_expr)
-        fast_path_body_text = "{}.Init({}.As<v8::String>());".format(
-            blink_var_name, v8_value_expr)
+        fast_path_body_text = _format(
+            "{}.Init(${isolate}, {}.As<v8::String>());", blink_var_name,
+            v8_value_expr)
     elif idl_type.unwrap(typedef=True).is_callback_function:
         # A key point of this fast path is that it doesn't require an
         # ExceptionState.
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py b/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
index f1fda368..adcf53d 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
@@ -299,7 +299,7 @@
     local_vars.extend([
         S("blink_property_name",
           ("const AtomicString& ${blink_property_name} = "
-           "ToCoreAtomicString(${v8_property_name});")),
+           "ToCoreAtomicString(${isolate}, ${v8_property_name});")),
         S("blink_property_index",
           ("const AtomicString& ${blink_property_index} = "
            "AtomicString::Number(${index});")),
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index 0a90c0c..de2ed80 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -160,7 +160,7 @@
     "//services/service_manager/public/cpp",
     "//skia",
     "//third_party/blink/public/mojom:color_scheme_mojo_bindings",
-    "//third_party/blink/public/mojom:mojom_broadcastchannel_bindings_blink",
+    "//third_party/blink/public/mojom:mojom_core_blink",
     "//third_party/blink/renderer/bindings/core/v8:generated",
     "//third_party/blink/renderer/core/animation:buildflags",
     "//third_party/blink/renderer/core/inspector:generated",
@@ -318,7 +318,6 @@
     ":core_hot",
     "//cc",
     "//skia",
-    "//third_party/blink/public/mojom:mojom_broadcastchannel_bindings_blink",
     "//third_party/blink/public/mojom:mojom_core_blink",
     "//third_party/blink/renderer/bindings:buildflags",
     "//third_party/blink/renderer/bindings/core/v8",
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc
index 566c30a4..655bbe5 100644
--- a/third_party/blink/renderer/core/animation/animation.cc
+++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -747,6 +747,8 @@
     // ::before
     // other pseudo-elements (ordered by selector)
     // ::after
+    // TODO(bokan): ::view-transition ordering should probably also be explicit:
+    // https://github.com/w3c/csswg-drafts/issues/9588.
     const PseudoId pseudo1 = owning_element1->GetPseudoId();
     const PseudoId pseudo2 = owning_element2->GetPseudoId();
     PseudoPriority priority1 = ConvertPseudoIdtoPriority(pseudo1);
@@ -755,9 +757,11 @@
     if (priority1 != priority2)
       return priority1 < priority2;
 
-    // The following if statement is not reachable, but the implementation
-    // matches the specification for composite ordering
     if (priority1 == PseudoPriority::kOther && pseudo1 != pseudo2) {
+      // TODO(bokan): This can happen with child pseudos in the
+      // ::view-transition subtree but we may want to sort them based on their
+      // actual composite order.
+      // https://github.com/w3c/csswg-drafts/issues/9588.
       return CodeUnitCompareLessThan(
           PseudoElement::PseudoElementNameForEvents(owning_element1),
           PseudoElement::PseudoElementNameForEvents(owning_element2));
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc
index 3ed1561..0dd8caa 100644
--- a/third_party/blink/renderer/core/dom/node.cc
+++ b/third_party/blink/renderer/core/dom/node.cc
@@ -369,7 +369,18 @@
   if (!parent || HasPreviousSibling()) {
     return previousSibling();
   }
+
+  // Note the [[fallthrough]] attributes, the order of the cases matters and
+  // corresponds to the ordering of pseudo elements in a traversal:
+  // ::marker, ::before, non-pseudo Elements, ::after, ::view-transition.
+  // The fallthroughs ensure this ordering by checking for each kind of node
+  // in-turn.
   switch (GetPseudoId()) {
+    case kPseudoIdViewTransition:
+      if (Node* previous = parent->GetPseudoElement(kPseudoIdAfter)) {
+        return previous;
+      }
+      [[fallthrough]];
     case kPseudoIdAfter:
       if (Node* previous = parent->lastChild())
         return previous;
@@ -379,15 +390,42 @@
         return previous;
       [[fallthrough]];
     case kPseudoIdBefore:
-      if (Node* previous = parent->GetPseudoElement(kPseudoIdMarker))
+      if (Node* previous = parent->GetPseudoElement(kPseudoIdMarker)) {
         return previous;
+      }
       [[fallthrough]];
     case kPseudoIdMarker:
-      break;
+      return nullptr;
+    // The pseudos of the view transition subtree have a known structure and
+    // cannot create other pseudos so these are handled separately of the above
+    // fallthrough cases. For details on view-transition pseudo ordering, see
+    // https://chromium.googlesource.com/chromium/src/+/main/third_party/blink/renderer/core/view_transition/README.md#pseudo-element-traversal
+    case kPseudoIdViewTransitionNew:
+      CHECK_EQ(parent->GetPseudoId(), kPseudoIdViewTransitionImagePair);
+      return parent->GetPseudoElement(
+          kPseudoIdViewTransitionOld,
+          To<PseudoElement>(this)->view_transition_name());
+    case kPseudoIdViewTransitionGroup: {
+      const Vector<AtomicString>& names =
+          GetDocument().GetStyleEngine().ViewTransitionTags();
+      wtf_size_t found_index =
+          names.Find(To<PseudoElement>(this)->view_transition_name());
+      CHECK_NE(found_index, kNotFound);
+      if (found_index == 0) {
+        return nullptr;
+      }
+
+      CHECK_EQ(parent->GetPseudoId(), kPseudoIdViewTransition);
+      return parent->GetPseudoElement(kPseudoIdViewTransitionGroup,
+                                      names[found_index - 1]);
+    }
+    case kPseudoIdViewTransitionImagePair:
+    case kPseudoIdViewTransitionOld:
+      return nullptr;
     default:
       NOTREACHED();
+      return nullptr;
   }
-  return nullptr;
 }
 
 Node* Node::PseudoAwareNextSibling() const {
@@ -395,6 +433,8 @@
   if (!parent || HasNextSibling()) {
     return nextSibling();
   }
+
+  // See comments in PseudoAwarePreviousSibling.
   switch (GetPseudoId()) {
     case kPseudoIdMarker:
       if (Node* next = parent->GetPseudoElement(kPseudoIdBefore))
@@ -409,22 +449,79 @@
         return next;
       [[fallthrough]];
     case kPseudoIdAfter:
-      break;
+      if (Node* next = parent->GetPseudoElement(kPseudoIdViewTransition)) {
+        return next;
+      }
+      [[fallthrough]];
+    case kPseudoIdViewTransition:
+      return nullptr;
+    case kPseudoIdViewTransitionOld:
+      CHECK_EQ(parent->GetPseudoId(), kPseudoIdViewTransitionImagePair);
+      return parent->GetPseudoElement(
+          kPseudoIdViewTransitionNew,
+          To<PseudoElement>(this)->view_transition_name());
+    case kPseudoIdViewTransitionGroup: {
+      const Vector<AtomicString>& names =
+          GetDocument().GetStyleEngine().ViewTransitionTags();
+      wtf_size_t found_index =
+          names.Find(To<PseudoElement>(this)->view_transition_name());
+      CHECK_NE(found_index, kNotFound);
+      if (found_index == names.size() - 1) {
+        return nullptr;
+      }
+
+      CHECK_EQ(parent->GetPseudoId(), kPseudoIdViewTransition);
+      return parent->GetPseudoElement(kPseudoIdViewTransitionGroup,
+                                      names[found_index + 1]);
+    }
+    case kPseudoIdViewTransitionImagePair:
+    case kPseudoIdViewTransitionNew:
+      return nullptr;
     default:
       NOTREACHED();
+      return nullptr;
   }
-  return nullptr;
 }
 
 Node* Node::PseudoAwareFirstChild() const {
   if (const auto* current_element = DynamicTo<Element>(this)) {
+    // See comments in PseudoAwarePreviousSibling for details on view-transition
+    // pseudo traversal.
+    if (GetPseudoId() == kPseudoIdViewTransition) {
+      const Vector<AtomicString>& names =
+          GetDocument().GetStyleEngine().ViewTransitionTags();
+      if (names.empty()) {
+        return nullptr;
+      }
+      return current_element->GetPseudoElement(kPseudoIdViewTransitionGroup,
+                                               names.front());
+    }
+    if (GetPseudoId() == kPseudoIdViewTransitionGroup) {
+      return current_element->GetPseudoElement(
+          kPseudoIdViewTransitionImagePair,
+          To<PseudoElement>(this)->view_transition_name());
+    }
+    if (GetPseudoId() == kPseudoIdViewTransitionImagePair) {
+      const AtomicString& name =
+          To<PseudoElement>(this)->view_transition_name();
+      if (Node* first = current_element->GetPseudoElement(
+              kPseudoIdViewTransitionOld, name)) {
+        return first;
+      }
+
+      return current_element->GetPseudoElement(kPseudoIdViewTransitionNew,
+                                               name);
+    }
     if (Node* first = current_element->GetPseudoElement(kPseudoIdMarker))
       return first;
     if (Node* first = current_element->GetPseudoElement(kPseudoIdBefore))
       return first;
     if (Node* first = current_element->firstChild())
       return first;
-    return current_element->GetPseudoElement(kPseudoIdAfter);
+    if (Node* first = current_element->GetPseudoElement(kPseudoIdAfter)) {
+      return first;
+    }
+    return current_element->GetPseudoElement(kPseudoIdViewTransition);
   }
 
   return firstChild();
@@ -432,6 +529,37 @@
 
 Node* Node::PseudoAwareLastChild() const {
   if (const auto* current_element = DynamicTo<Element>(this)) {
+    // See comments in PseudoAwarePreviousSibling for details on view-transition
+    // pseudo traversal.
+    if (GetPseudoId() == kPseudoIdViewTransition) {
+      const Vector<AtomicString>& names =
+          GetDocument().GetStyleEngine().ViewTransitionTags();
+      if (names.empty()) {
+        return nullptr;
+      }
+      return current_element->GetPseudoElement(kPseudoIdViewTransitionGroup,
+                                               names.back());
+    }
+    if (GetPseudoId() == kPseudoIdViewTransitionGroup) {
+      return current_element->GetPseudoElement(
+          kPseudoIdViewTransitionImagePair,
+          To<PseudoElement>(this)->view_transition_name());
+    }
+    if (GetPseudoId() == kPseudoIdViewTransitionImagePair) {
+      const AtomicString& name =
+          To<PseudoElement>(this)->view_transition_name();
+      if (Node* last = current_element->GetPseudoElement(
+              kPseudoIdViewTransitionNew, name)) {
+        return last;
+      }
+
+      return current_element->GetPseudoElement(kPseudoIdViewTransitionOld,
+                                               name);
+    }
+    if (Node* last =
+            current_element->GetPseudoElement(kPseudoIdViewTransition)) {
+      return last;
+    }
     if (Node* last = current_element->GetPseudoElement(kPseudoIdAfter))
       return last;
     if (Node* last = current_element->lastChild())
@@ -1992,15 +2120,17 @@
         return Node::kDocumentPositionPreceding | connection;
       }
 
-      if (!child2->nextSibling())
+      if (!child2->PseudoAwareNextSibling()) {
         return kDocumentPositionFollowing | connection;
-      if (!child1->nextSibling())
+      }
+      if (!child1->PseudoAwareNextSibling()) {
         return kDocumentPositionPreceding | connection;
+      }
 
       // Otherwise we need to see which node occurs first.  Crawl backwards from
       // child2 looking for child1.
-      for (const Node* child = child2->previousSibling(); child;
-           child = child->previousSibling()) {
+      for (const Node* child = child2->PseudoAwarePreviousSibling(); child;
+           child = child->PseudoAwarePreviousSibling()) {
         if (child == child1)
           return kDocumentPositionFollowing | connection;
       }
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
index f45f3354..86d771e8 100644
--- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
+++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
@@ -56,9 +56,6 @@
 #include "third_party/blink/renderer/core/editing/position.h"
 #include "third_party/blink/renderer/core/editing/visible_position.h"
 #include "third_party/blink/renderer/core/editing/visible_units.h"
-#include "third_party/blink/renderer/core/frame/local_dom_window.h"
-#include "third_party/blink/renderer/core/frame/local_frame_view.h"
-#include "third_party/blink/renderer/core/highlight/highlight_registry.h"
 #include "third_party/blink/renderer/core/highlight/highlight_style_utils.h"
 #include "third_party/blink/renderer/core/layout/layout_object.h"
 #include "third_party/blink/renderer/core/layout/layout_text.h"
@@ -856,33 +853,10 @@
 
 DocumentMarkerVector DocumentMarkerController::ComputeMarkersToPaint(
     const Text& text) const {
-  HighlightRegistry* highlight_registry =
-      document_->domWindow()->Supplementable<LocalDOMWindow>::
-          RequireSupplement<HighlightRegistry>();
   DocumentMarker::MarkerTypes excluded_highlight_pseudos =
-      RuntimeEnabledFeatures::HighlightOverlayPaintingEnabled()
-          ? DocumentMarker::MarkerTypes::HighlightPseudos()
-          : DocumentMarker::MarkerTypes();
+      DocumentMarker::MarkerTypes::HighlightPseudos();
   DocumentMarkerVector markers_to_paint{};
 
-  if (!RuntimeEnabledFeatures::HighlightOverlayPaintingEnabled()) {
-    DocumentMarkerVector custom_highlight_markers = MarkersFor(
-        text, DocumentMarker::MarkerTypes(DocumentMarker::kCustomHighlight));
-    std::sort(custom_highlight_markers.begin(), custom_highlight_markers.end(),
-              [highlight_registry](const Member<DocumentMarker>& marker1,
-                                   const Member<DocumentMarker>& marker2) {
-                auto* custom1 = To<CustomHighlightMarker>(marker1.Get());
-                auto* custom2 = To<CustomHighlightMarker>(marker2.Get());
-                return highlight_registry->CompareOverlayStackingPosition(
-                           custom1->GetHighlightName(), custom1->GetHighlight(),
-                           custom2->GetHighlightName(),
-                           custom2->GetHighlight()) ==
-                       HighlightRegistry::OverlayStackingPosition::
-                           kOverlayStackingPositionBelow;
-              });
-    markers_to_paint = custom_highlight_markers;
-  }
-
   // We don't render composition or spelling markers that overlap suggestion
   // markers.
   // Note: DocumentMarkerController::MarkersFor() returns markers sorted by
diff --git a/third_party/blink/renderer/core/fetch/body_stream_buffer_test.cc b/third_party/blink/renderer/core/fetch/body_stream_buffer_test.cc
index 6a49b17e..dc0c8fc 100644
--- a/third_party/blink/renderer/core/fetch/body_stream_buffer_test.cc
+++ b/third_party/blink/renderer/core/fetch/body_stream_buffer_test.cc
@@ -79,7 +79,8 @@
     v8::TryCatch block(script_state->GetIsolate());
     ScriptValue r = Eval(script_state, s);
     if (block.HasCaught()) {
-      ADD_FAILURE() << ToCoreString(block.Exception()
+      ADD_FAILURE() << ToCoreString(script_state->GetIsolate(),
+                                    block.Exception()
                                         ->ToString(script_state->GetContext())
                                         .ToLocalChecked())
                            .Utf8();
diff --git a/third_party/blink/renderer/core/fetch/response.cc b/third_party/blink/renderer/core/fetch/response.cc
index a34da12..dd144c2 100644
--- a/third_party/blink/renderer/core/fetch/response.cc
+++ b/third_party/blink/renderer/core/fetch/response.cc
@@ -388,7 +388,8 @@
     return nullptr;
   }
 
-  String string = ToBlinkString<String>(v8_string, kDoNotExternalize);
+  String string = ToBlinkString<String>(script_state->GetIsolate(), v8_string,
+                                        kDoNotExternalize);
 
   // JSON.stringify can fail to produce a string value in one of two ways: it
   // can throw an exception (as with unserializable objects), or it can return
diff --git a/third_party/blink/renderer/core/fileapi/OWNERS b/third_party/blink/renderer/core/fileapi/OWNERS
index 8617e22..85322b60 100644
--- a/third_party/blink/renderer/core/fileapi/OWNERS
+++ b/third_party/blink/renderer/core/fileapi/OWNERS
@@ -1,6 +1 @@
-# Primary
-asully@chromium.org
-
-# Secondary
-ayui@chromium.org
-jsbell@chromium.org
+file://storage/browser/blob/OWNERS
diff --git a/third_party/blink/renderer/core/frame/ad_tracker.cc b/third_party/blink/renderer/core/frame/ad_tracker.cc
index 9ce790697..59ad941 100644
--- a/third_party/blink/renderer/core/frame/ad_tracker.cc
+++ b/third_party/blink/renderer/core/frame/ad_tracker.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/compiler_specific.h"
 #include "base/feature_list.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
@@ -101,8 +102,10 @@
   // CurrentStackTrace is 10x faster than CaptureStackTrace if all that you need
   // is the url of the script at the top of the stack. See crbug.com/1057211 for
   // more detail.
-  v8::Isolate* isolate = v8::Isolate::GetCurrent();
-  DCHECK(isolate);
+  v8::Isolate* isolate = v8::Isolate::TryGetCurrent();
+  if (UNLIKELY(!isolate)) {
+    return String();
+  }
 
   v8::Local<v8::StackTrace> stack_trace =
       v8::StackTrace::CurrentStackTrace(isolate, /*frame_limit=*/1);
@@ -114,12 +117,15 @@
   if (script_name.IsEmpty() || !script_name->Length())
     return GenerateFakeUrlFromScriptId(frame->GetScriptId());
 
-  return ToCoreString(script_name);
+  return ToCoreString(isolate, script_name);
 }
 
 ExecutionContext* AdTracker::GetCurrentExecutionContext() {
   // Determine the current ExecutionContext.
-  v8::Isolate* isolate = v8::Isolate::GetCurrent();
+  v8::Isolate* isolate = v8::Isolate::TryGetCurrent();
+  if (!isolate) {
+    return nullptr;
+  }
   v8::Local<v8::Context> context = isolate->GetCurrentContext();
   return context.IsEmpty() ? nullptr : ToExecutionContext(context);
 }
@@ -205,12 +211,13 @@
       probe.function->GetScriptOrigin().ResourceName();
   String script_url;
   if (!resource_name.IsEmpty()) {
+    v8::Isolate* isolate = ToIsolate(local_root_);
     v8::MaybeLocal<v8::String> resource_name_string =
-        resource_name->ToString(ToIsolate(local_root_)->GetCurrentContext());
+        resource_name->ToString(isolate->GetCurrentContext());
     // Rarely, ToString() can return an empty result, even if |resource_name|
     // isn't empty (crbug.com/1086832).
     if (!resource_name_string.IsEmpty())
-      script_url = ToCoreString(resource_name_string.ToLocalChecked());
+      script_url = ToCoreString(isolate, resource_name_string.ToLocalChecked());
   }
   WillExecuteScript(probe.context, probe.v8_context, script_url,
                     probe.function->ScriptId());
diff --git a/third_party/blink/renderer/core/frame/animation_frame_timing_monitor.cc b/third_party/blink/renderer/core/frame/animation_frame_timing_monitor.cc
index 059a109..d4061527 100644
--- a/third_party/blink/renderer/core/frame/animation_frame_timing_monitor.cc
+++ b/third_party/blink/renderer/core/frame/animation_frame_timing_monitor.cc
@@ -517,6 +517,7 @@
 namespace {
 
 ScriptTimingInfo::ScriptSourceLocation CaptureScriptSourceLocation(
+    v8::Isolate* isolate,
     v8::MaybeLocal<v8::Value> maybe_value) {
   v8::Local<v8::Value> value;
 
@@ -537,9 +538,9 @@
   if (function->IsFunction()) {
     return ScriptTimingInfo::ScriptSourceLocation{
         .url = ToCoreStringWithUndefinedOrNullCheck(
-            function->GetScriptOrigin().ResourceName()),
+            isolate, function->GetScriptOrigin().ResourceName()),
         .function_name =
-            ToCoreStringWithUndefinedOrNullCheck(function->GetName()),
+            ToCoreStringWithUndefinedOrNullCheck(isolate, function->GetName()),
         .start_position = function->GetScriptStartPosition()};
   }
 
@@ -575,6 +576,7 @@
       .execution_start_time = probe_data.CaptureStartTime(),
       .property_like_name = probe_data.name,
       .source_location = CaptureScriptSourceLocation(
+          probe_data.context->GetIsolate(),
           probe_data.callback ? probe_data.callback->CallbackObject()
                               : probe_data.function)};
 }
@@ -638,6 +640,7 @@
 
   v8::HandleScope handle_scope(probe_data.context->GetIsolate());
   info->SetSourceLocation(CaptureScriptSourceLocation(
+      probe_data.context->GetIsolate(),
       To<JSBasedEventListener>(probe_data.listener)
           ->GetListenerObject(*probe_data.event_target)));
 }
diff --git a/third_party/blink/renderer/core/frame/dactyloscoper.cc b/third_party/blink/renderer/core/frame/dactyloscoper.cc
index b8539e57..72906dd 100644
--- a/third_party/blink/renderer/core/frame/dactyloscoper.cc
+++ b/third_party/blink/renderer/core/frame/dactyloscoper.cc
@@ -89,7 +89,7 @@
     return String("");
   }
 
-  return ToBlinkString<String>(v8_string, kDoNotExternalize);
+  return ToBlinkString<String>(isolate, v8_string, kDoNotExternalize);
 }
 
 FontLookupType ToTypeProto(Dactyloscoper::FontLookupType lookup_type) {
diff --git a/third_party/blink/renderer/core/frame/deprecation/deprecation_report_body_test.cc b/third_party/blink/renderer/core/frame/deprecation/deprecation_report_body_test.cc
index af37a489..c26b0d2 100644
--- a/third_party/blink/renderer/core/frame/deprecation/deprecation_report_body_test.cc
+++ b/third_party/blink/renderer/core/frame/deprecation/deprecation_report_body_test.cc
@@ -21,6 +21,7 @@
   EXPECT_TRUE(json_object.IsObject());
 
   String json_string = ToBlinkString<String>(
+      scope.GetIsolate(),
       v8::JSON::Stringify(scope.GetContext(),
                           json_object.V8Value().As<v8::Object>())
           .ToLocalChecked(),
@@ -44,6 +45,7 @@
   EXPECT_TRUE(json_object.IsObject());
 
   String json_string = ToBlinkString<String>(
+      scope.GetIsolate(),
       v8::JSON::Stringify(scope.GetContext(),
                           json_object.V8Value().As<v8::Object>())
           .ToLocalChecked(),
diff --git a/third_party/blink/renderer/core/frame/performance_monitor.cc b/third_party/blink/renderer/core/frame/performance_monitor.cc
index 060ac0b9..9bae166a 100644
--- a/third_party/blink/renderer/core/frame/performance_monitor.cc
+++ b/third_party/blink/renderer/core/frame/performance_monitor.cc
@@ -238,8 +238,9 @@
                                     : String(user_callback->atomic_name);
   String text = String::Format("'%s' handler took %" PRId64 "ms",
                                name.Utf8().c_str(), duration.InMilliseconds());
-  InnerReportGenericViolation(probe.context, handler_type, text, duration,
-                              CaptureSourceLocation(probe.function));
+  InnerReportGenericViolation(
+      probe.context, handler_type, text, duration,
+      CaptureSourceLocation(probe.context->GetIsolate(), probe.function));
 }
 
 void PerformanceMonitor::Will(const probe::V8Compile& probe) {
diff --git a/third_party/blink/renderer/core/frame/web_frame_test.cc b/third_party/blink/renderer/core/frame/web_frame_test.cc
index 400871b0..fb98382 100644
--- a/third_party/blink/renderer/core/frame/web_frame_test.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_test.cc
@@ -9895,7 +9895,8 @@
     EXPECT_EQ(
         "SecurityError: Blocked a frame with origin \"http://internal.test\" "
         "from accessing a cross-origin frame.",
-        ToCoreString(exception
+        ToCoreString(isolate,
+                     exception
                          ->ToString(ToScriptStateForMainWorld(
                                         WebView()->MainFrameImpl()->GetFrame())
                                         ->GetContext())
@@ -11629,14 +11630,16 @@
   helper.Initialize(nullptr, nullptr, EnableGlobalReuseForUnownedMainFrames);
 
   WebLocalFrame* main_frame = helper.LocalMainFrame();
-  v8::HandleScope scope(helper.GetAgentGroupScheduler().Isolate());
+  v8::Isolate* isolate = helper.GetAgentGroupScheduler().Isolate();
+  v8::HandleScope scope(isolate);
   main_frame->ExecuteScript(WebScriptSource("hello = 'world';"));
   frame_test_helpers::LoadFrame(main_frame, "data:text/html,new page");
   v8::Local<v8::Value> result =
       main_frame->ExecuteScriptAndReturnValue(WebScriptSource("hello"));
   ASSERT_TRUE(result->IsString());
   EXPECT_EQ("world",
-            ToCoreString(result->ToString(main_frame->MainWorldScriptContext())
+            ToCoreString(isolate,
+                         result->ToString(main_frame->MainWorldScriptContext())
                              .ToLocalChecked()));
 }
 
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
index cee33cf..46076e1 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -1307,22 +1307,25 @@
   }
 }
 
-void WebFrameWidgetImpl::SendScrollEndEventFromImplSide(
+void WebFrameWidgetImpl::SendEndOfScrollEvents(
     bool affects_outer_viewport,
     cc::ElementId scroll_latched_element_id) {
-  if (!RuntimeEnabledFeatures::ScrollEndEventsEnabled())
-    return;
-
   Node* target_node = View()->FindNodeFromScrollableCompositorElementId(
       scroll_latched_element_id);
-  bool target_is_root_scroller = false;
-  if (View()->MainFrameImpl()) {
-    Node* document_node = View()->MainFrameImpl()->GetDocument();
-    if (target_node == document_node) {
-      target_is_root_scroller = true;
-    }
+  if (!target_node) {
+    return;
   }
-  if (target_node) {
+  if (ScrollableArea* scrollable_area =
+          ScrollableArea::GetForScrolling(target_node->GetLayoutBox())) {
+    scrollable_area->UpdateSnappedTargetsAndEnqueueSnapChanged();
+  }
+
+  if (RuntimeEnabledFeatures::ScrollEndEventsEnabled()) {
+    bool target_is_root_scroller = false;
+    if (View()->MainFrameImpl()) {
+      Node* document_node = View()->MainFrameImpl()->GetDocument();
+      target_is_root_scroller = target_node == document_node;
+    }
     // Scrolls consumed entirely by the VisualViewport and not the
     // LayoutViewport should not trigger scrollends on the document. The
     // VisualViewport currently handles scroll but not scrollends. If that
@@ -1354,7 +1357,7 @@
   // dispatch the scroll end to the latter (still-scrolling) element.
   // https://crbug.com/1116780.
   if (commit_data.scroll_end_data.scroll_gesture_did_end) {
-    SendScrollEndEventFromImplSide(
+    SendEndOfScrollEvents(
         commit_data.scroll_end_data.gesture_affects_outer_viewport_scroll,
         commit_data.scroll_latched_element_id);
   }
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
index e8393bf..dcb7c4e 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
@@ -890,9 +890,8 @@
 
   void SendOverscrollEventFromImplSide(const gfx::Vector2dF& overscroll_delta,
                                        cc::ElementId scroll_latched_element_id);
-  void SendScrollEndEventFromImplSide(bool affects_outer_viewport,
-                                      cc::ElementId scroll_latched_element_id);
-
+  void SendEndOfScrollEvents(bool affects_outer_viewport,
+                             cc::ElementId scroll_latched_element_id);
   void RecordManipulationTypeCounts(cc::ManipulationInfo info);
 
   enum DragAction { kDragEnter, kDragOver };
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
index 0971d0a..461a6a8 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -92,6 +92,7 @@
 #include <numeric>
 #include <utility>
 
+#include "base/compiler_specific.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/task/single_thread_task_runner.h"
@@ -711,8 +712,11 @@
 }
 
 WebLocalFrame* WebLocalFrame::FrameForCurrentContext() {
-  v8::Local<v8::Context> context =
-      v8::Isolate::GetCurrent()->GetCurrentContext();
+  v8::Isolate* isolate = v8::Isolate::TryGetCurrent();
+  if (UNLIKELY(!isolate)) {
+    return nullptr;
+  }
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
   if (context.IsEmpty())
     return nullptr;
   return FrameForContext(context);
diff --git a/third_party/blink/renderer/core/highlight/highlight_style_utils.cc b/third_party/blink/renderer/core/highlight/highlight_style_utils.cc
index 77fa4ac..497bbbc 100644
--- a/third_party/blink/renderer/core/highlight/highlight_style_utils.cc
+++ b/third_party/blink/renderer/core/highlight/highlight_style_utils.cc
@@ -43,8 +43,7 @@
 
 Color PreviousLayerColor(const ComputedStyle& originating_style,
                          absl::optional<Color> previous_layer_color) {
-  if (previous_layer_color &&
-      RuntimeEnabledFeatures::HighlightOverlayPaintingEnabled()) {
+  if (previous_layer_color) {
     return *previous_layer_color;
   }
   return originating_style.VisitedDependentColor(GetCSSPropertyColor());
@@ -122,20 +121,10 @@
     const Document& document,
     PseudoId pseudo,
     mojom::blink::ColorScheme color_scheme) {
-  // TODO(crbug.com/1295264): unstyled custom highlights should not change
-  // the foreground color, but for now the best we can do is defaulting to
-  // transparent (pre-HighlightOverlayPainting with double painting). The
-  // correct behaviour is to use the ‘color’ of the next topmost active
-  // highlight (equivalent to 'currentColor').
-  absl::optional<Color> previous_layer_color =
-      RuntimeEnabledFeatures::HighlightOverlayPaintingEnabled()
-          ? absl::nullopt
-          : absl::make_optional(Color::kTransparent);
-
   switch (pseudo) {
     case kPseudoIdSelection:
       if (!LayoutTheme::GetTheme().SupportsSelectionForegroundColors()) {
-        return previous_layer_color;
+        return absl::nullopt;
       }
       if (document.GetFrame()->Selection().FrameIsFocusedAndActive()) {
         return LayoutTheme::GetTheme().ActiveSelectionForegroundColor(
@@ -149,7 +138,7 @@
     case kPseudoIdSpellingError:
     case kPseudoIdGrammarError:
     case kPseudoIdHighlight:
-      return previous_layer_color;
+      return absl::nullopt;
     default:
       NOTREACHED();
       return absl::nullopt;
@@ -521,9 +510,7 @@
   const ComputedStyle* pseudo_style = nullptr;
   switch (type) {
     case DocumentMarker::kTextFragment:
-      if (RuntimeEnabledFeatures::HighlightOverlayPaintingEnabled()) {
-        pseudo_style = style->HighlightData().TargetText();
-      }
+      pseudo_style = style->HighlightData().TargetText();
       break;
 
     case DocumentMarker::kSpelling:
diff --git a/third_party/blink/renderer/core/html/html_frame_owner_element.cc b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
index 3d51f67b..ae8fb41 100644
--- a/third_party/blink/renderer/core/html/html_frame_owner_element.cc
+++ b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
@@ -101,10 +101,6 @@
                          const KURL& url,
                          bool is_loading_attr_lazy,
                          bool should_lazy_load_children) {
-  if (!RuntimeEnabledFeatures::LazyFrameLoadingEnabled()) {
-    return false;
-  }
-
   // Only http:// or https:// URLs are eligible for lazy loading, excluding
   // URLs like invalid or empty URLs, "about:blank", local file URLs, etc.
   // that it doesn't make sense to lazily load.
@@ -162,8 +158,7 @@
                                            bool is_eligible_for_lazy_ads,
                                            bool record_uma) {
   DCHECK(document.GetSettings());
-  if (!RuntimeEnabledFeatures::LazyFrameLoadingEnabled() ||
-      !document.GetSettings()->GetLazyLoadEnabled()) {
+  if (!document.GetSettings()->GetLazyLoadEnabled()) {
     return false;
   }
 
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.idl b/third_party/blink/renderer/core/html/html_iframe_element.idl
index 5b483d3..2fbb5d1 100644
--- a/third_party/blink/renderer/core/html/html_iframe_element.idl
+++ b/third_party/blink/renderer/core/html/html_iframe_element.idl
@@ -51,7 +51,7 @@
     // Document Policy
     [RuntimeEnabled=DocumentPolicyNegotiation, CEReactions, Reflect] attribute DOMString policy;
 
-    [RuntimeEnabled=LazyFrameLoading, CEReactions, Reflect, ReflectOnly=("lazy", "eager", "auto"), ReflectMissing="auto", ReflectInvalid="auto"] attribute DOMString loading;
+    [CEReactions, Reflect, ReflectOnly=("lazy", "eager", "auto"), ReflectMissing="auto", ReflectInvalid="auto"] attribute DOMString loading;
 
     // Trust Tokens request parameters (https://github.com/wicg/trust-token-api)
     [RuntimeEnabled=PrivateStateTokens, SecureContext, Reflect, MeasureAs=TrustTokenIframe] attribute DOMString privateToken;
diff --git a/third_party/blink/renderer/core/html/lazy_load_frame_observer_test.cc b/third_party/blink/renderer/core/html/lazy_load_frame_observer_test.cc
index e4910a1..66f2dfb6 100644
--- a/third_party/blink/renderer/core/html/lazy_load_frame_observer_test.cc
+++ b/third_party/blink/renderer/core/html/lazy_load_frame_observer_test.cc
@@ -36,24 +36,17 @@
 // tuple parameters in the parameterized tests below, e.g. so that
 // std::get<LazyFrameLoadingFeatureStatus>(GetParam()) can be used instead of
 // std::get<0>(GetParam()) if they were just booleans.
-enum class LazyFrameLoadingFeatureStatus { kDisabled, kEnabled };
 enum class LazyFrameVisibleLoadTimeFeatureStatus { kDisabled, kEnabled };
 
 class LazyLoadFramesParamsTest
     : public SimTest,
       public ::testing::WithParamInterface<
-          std::tuple<LazyFrameLoadingFeatureStatus,
-                     LazyFrameVisibleLoadTimeFeatureStatus,
+          std::tuple<LazyFrameVisibleLoadTimeFeatureStatus,
                      WebEffectiveConnectionType>> {
  public:
   static constexpr int kViewportWidth = 800;
   static constexpr int kViewportHeight = 600;
 
-  LazyLoadFramesParamsTest()
-      : scoped_lazy_frame_loading_for_test_(
-            std::get<LazyFrameLoadingFeatureStatus>(GetParam()) ==
-            LazyFrameLoadingFeatureStatus::kEnabled) {}
-
   void SetUp() override {
     WebEffectiveConnectionType ect =
         std::get<WebEffectiveConnectionType>(GetParam());
@@ -75,8 +68,7 @@
     settings.SetLazyFrameLoadingDistanceThresholdPx2G(500);
     settings.SetLazyFrameLoadingDistanceThresholdPx3G(600);
     settings.SetLazyFrameLoadingDistanceThresholdPx4G(700);
-    settings.SetLazyLoadEnabled(
-        RuntimeEnabledFeatures::LazyFrameLoadingEnabled());
+    settings.SetLazyLoadEnabled(true);
   }
 
   int GetLoadingDistanceThreshold() const {
@@ -92,14 +84,6 @@
     SimRequest main_resource("https://example.com/", "text/html");
     std::unique_ptr<SimRequest> child_frame_resource;
 
-    if (!RuntimeEnabledFeatures::LazyFrameLoadingEnabled()) {
-      // This SimRequest needs to be created now if the frame won't actually be
-      // lazily loaded. Otherwise, it'll be defined later to ensure that the
-      // subframe resource isn't requested until the page is scrolled down.
-      child_frame_resource = std::make_unique<SimRequest>(
-          "https://crossorigin.com/subframe.html", "text/html");
-    }
-
     LoadURL("https://example.com/");
 
     main_resource.Complete(String::Format(
@@ -117,8 +101,7 @@
 
     // If the child frame is being lazy loaded, then the body's load event
     // should have already fired.
-    EXPECT_EQ(RuntimeEnabledFeatures::LazyFrameLoadingEnabled(),
-              ConsoleMessages().Contains("main body onload"));
+    EXPECT_TRUE(ConsoleMessages().Contains("main body onload"));
     EXPECT_FALSE(ConsoleMessages().Contains("child frame element onload"));
 
     if (!child_frame_resource) {
@@ -128,9 +111,6 @@
 
     return child_frame_resource;
   }
-
- private:
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test_;
 };
 
 TEST_P(LazyLoadFramesParamsTest, SameOriginFrame) {
@@ -230,15 +210,12 @@
   std::unique_ptr<SimRequest> child_frame_resource =
       LoadPageWithCrossOriginFrameFarFromViewport();
 
-  if (RuntimeEnabledFeatures::LazyFrameLoadingEnabled()) {
-    // If LazyFrameLoading is enabled, then scroll down near the child frame to
-    // cause the child frame to start loading.
-    GetDocument().View()->LayoutViewport()->SetScrollOffset(
-        ScrollOffset(0, 150), mojom::blink::ScrollType::kProgrammatic);
+  // Scroll down near the child frame to cause the child frame to start loading.
+  GetDocument().View()->LayoutViewport()->SetScrollOffset(
+      ScrollOffset(0, 150), mojom::blink::ScrollType::kProgrammatic);
 
-    Compositor().BeginFrame();
-    test::RunPendingTasks();
-  }
+  Compositor().BeginFrame();
+  test::RunPendingTasks();
 
   EXPECT_FALSE(ConsoleMessages().Contains("child frame element onload"));
 
@@ -290,15 +267,11 @@
   std::unique_ptr<SimRequest> child_frame_resource =
       LoadPageWithCrossOriginFrameFarFromViewport();
 
-  if (RuntimeEnabledFeatures::LazyFrameLoadingEnabled()) {
-    // If LazyFrameLoading is enabled, then scroll down near the child frame to
-    // cause the child frame to start loading.
-    GetDocument().View()->LayoutViewport()->SetScrollOffset(
-        ScrollOffset(0, 150), mojom::blink::ScrollType::kProgrammatic);
+  GetDocument().View()->LayoutViewport()->SetScrollOffset(
+      ScrollOffset(0, 150), mojom::blink::ScrollType::kProgrammatic);
 
-    Compositor().BeginFrame();
-    test::RunPendingTasks();
-  }
+  Compositor().BeginFrame();
+  test::RunPendingTasks();
 
   // There's another nested cross origin iframe inside the first child frame,
   // even further down such that it's not near the viewport. It should start
@@ -352,15 +325,12 @@
   EXPECT_EQ(1, static_cast<int>(base::ranges::count(
                    ConsoleMessages(), "child frame element onload")));
 
-  if (RuntimeEnabledFeatures::LazyFrameLoadingEnabled()) {
-    // If LazyFrameLoading is enabled, then scroll down near the child frame to
-    // cause the child frame to start loading.
-    GetDocument().View()->LayoutViewport()->SetScrollOffset(
-        ScrollOffset(0, 150), mojom::blink::ScrollType::kProgrammatic);
+  // Scroll down near the child frame to cause the child frame to start loading.
+  GetDocument().View()->LayoutViewport()->SetScrollOffset(
+      ScrollOffset(0, 150), mojom::blink::ScrollType::kProgrammatic);
 
-    Compositor().BeginFrame();
-    test::RunPendingTasks();
-  }
+  Compositor().BeginFrame();
+  test::RunPendingTasks();
 
   child_frame_resource.Complete("");
 
@@ -431,14 +401,6 @@
   SimRequest main_resource("https://example.com/", "text/html");
   absl::optional<SimRequest> child_frame_resource;
 
-  if (!RuntimeEnabledFeatures::LazyFrameLoadingEnabled()) {
-    // This SimRequest needs to be created now if the frame won't actually be
-    // lazily loaded. Otherwise, it'll be defined later to ensure that the
-    // subframe resource isn't requested until the page is scrolled down.
-    child_frame_resource.emplace("https://example.com/subframe.html",
-                                 "text/html");
-  }
-
   LoadURL("https://example.com/");
 
   main_resource.Complete(String::Format(
@@ -456,8 +418,7 @@
 
   // If the child frame is being lazy loaded, then the body's load event
   // should have already fired.
-  EXPECT_EQ(RuntimeEnabledFeatures::LazyFrameLoadingEnabled(),
-            ConsoleMessages().Contains("main body onload"));
+  EXPECT_TRUE(ConsoleMessages().Contains("main body onload"));
   EXPECT_FALSE(ConsoleMessages().Contains("child frame element onload"));
   EXPECT_TRUE(GetDocument().IsUseCounted(
       WebFeature::kLazyLoadFrameLoadingAttributeLazy));
@@ -469,15 +430,12 @@
                                  "text/html");
   }
 
-  if (RuntimeEnabledFeatures::LazyFrameLoadingEnabled()) {
-    // If LazyFrameLoading is enabled, then scroll down near the child frame to
-    // cause the child frame to start loading.
-    GetDocument().View()->LayoutViewport()->SetScrollOffset(
-        ScrollOffset(0, 150), mojom::blink::ScrollType::kProgrammatic);
+  // Scroll down near the child frame to cause the child frame to start loading.
+  GetDocument().View()->LayoutViewport()->SetScrollOffset(
+      ScrollOffset(0, 150), mojom::blink::ScrollType::kProgrammatic);
 
-    Compositor().BeginFrame();
-    test::RunPendingTasks();
-  }
+  Compositor().BeginFrame();
+  test::RunPendingTasks();
 
   EXPECT_FALSE(ConsoleMessages().Contains("child frame element onload"));
 
@@ -506,14 +464,6 @@
   SimRequest main_resource("https://example.com/", "text/html");
   absl::optional<SimRequest> child_frame_resource;
 
-  if (!RuntimeEnabledFeatures::LazyFrameLoadingEnabled()) {
-    // This SimRequest needs to be created now if the frame won't actually be
-    // lazily loaded. Otherwise, it'll be defined later to ensure that the
-    // subframe resource isn't requested until the page is scrolled down.
-    child_frame_resource.emplace("https://crossorigin.com/subframe.html",
-                                 "text/html");
-  }
-
   LoadURL("https://example.com/");
 
   main_resource.Complete(String::Format(
@@ -531,8 +481,7 @@
 
   // If the child frame is being lazy loaded, then the body's load event
   // should have already fired.
-  EXPECT_EQ(RuntimeEnabledFeatures::LazyFrameLoadingEnabled(),
-            ConsoleMessages().Contains("main body onload"));
+  EXPECT_TRUE(ConsoleMessages().Contains("main body onload"));
   EXPECT_FALSE(ConsoleMessages().Contains("child frame element onload"));
 
   if (!child_frame_resource) {
@@ -564,23 +513,12 @@
   std::unique_ptr<SimRequest> child_frame_resource =
       LoadPageWithCrossOriginFrameFarFromViewport();
 
-  if (RuntimeEnabledFeatures::LazyFrameLoadingEnabled()) {
-    // If LazyFrameLoading is enabled, then scroll down near the child frame to
-    // cause the child frame to start loading.
-    GetDocument().View()->LayoutViewport()->SetScrollOffset(
-        ScrollOffset(0, 150), mojom::blink::ScrollType::kProgrammatic);
+  // Scroll down near the child frame to cause the child frame to start loading.
+  GetDocument().View()->LayoutViewport()->SetScrollOffset(
+      ScrollOffset(0, 150), mojom::blink::ScrollType::kProgrammatic);
 
-    Compositor().BeginFrame();
-    test::RunPendingTasks();
-  }
-
-  // There's another nested cross origin iframe inside the first child frame,
-  // even further down such that it's not near the viewport. If LazyLoad is
-  // enabled, it should be deferred even though it's nested inside a frame that
-  // was previously deferred, because it has the attribute loading=lazy.
-  absl::optional<SimRequest> nested_frame_resource;
-  if (!RuntimeEnabledFeatures::LazyFrameLoadingEnabled())
-    nested_frame_resource.emplace("https://test.com/", "text/html");
+  Compositor().BeginFrame();
+  test::RunPendingTasks();
 
   child_frame_resource->Complete(
       String::Format("<div style='height: %dpx;'></div>"
@@ -592,13 +530,6 @@
   Compositor().BeginFrame();
   test::RunPendingTasks();
 
-  if (!RuntimeEnabledFeatures::LazyFrameLoadingEnabled()) {
-    nested_frame_resource->Complete("");
-
-    Compositor().BeginFrame();
-    test::RunPendingTasks();
-  }
-
   EXPECT_TRUE(ConsoleMessages().Contains("main body onload"));
   EXPECT_TRUE(ConsoleMessages().Contains("child frame element onload"));
 }
@@ -628,15 +559,6 @@
   EXPECT_TRUE(GetDocument().IsUseCounted(
       WebFeature::kLazyLoadFrameLoadingAttributeEager));
 
-  // There's another nested cross origin iframe inside the first child frame,
-  // even further down such that it's not near the viewport. If LazyLoad is
-  // enabled, it should be deferred because it has the attribute loading=lazy,
-  // even though it's nested inside a frame that has the attribute
-  // loading=eager.
-  absl::optional<SimRequest> nested_frame_resource;
-  if (!RuntimeEnabledFeatures::LazyFrameLoadingEnabled())
-    nested_frame_resource.emplace("https://test.com/", "text/html");
-
   child_frame_resource.Complete(
       String::Format("<div style='height: %dpx;'></div>"
                      "<iframe src='https://test.com/' loading='lazy'"
@@ -647,13 +569,6 @@
   Compositor().BeginFrame();
   test::RunPendingTasks();
 
-  if (!RuntimeEnabledFeatures::LazyFrameLoadingEnabled()) {
-    nested_frame_resource->Complete("");
-
-    Compositor().BeginFrame();
-    test::RunPendingTasks();
-  }
-
   EXPECT_TRUE(ConsoleMessages().Contains("main body onload"));
   EXPECT_TRUE(ConsoleMessages().Contains("child frame element onload"));
 }
@@ -713,8 +628,6 @@
     LazyFrameLoading,
     LazyLoadFramesParamsTest,
     ::testing::Combine(
-        ::testing::Values(LazyFrameLoadingFeatureStatus::kDisabled,
-                          LazyFrameLoadingFeatureStatus::kEnabled),
         ::testing::Values(LazyFrameVisibleLoadTimeFeatureStatus::kDisabled,
                           LazyFrameVisibleLoadTimeFeatureStatus::kEnabled),
         ::testing::Values(WebEffectiveConnectionType::kTypeUnknown,
@@ -886,7 +799,6 @@
     LazyEmbeds,
     LazyEmbedsTest,
     ::testing::Combine(
-        ::testing::Values(LazyFrameLoadingFeatureStatus::kEnabled),
         ::testing::Values(LazyFrameVisibleLoadTimeFeatureStatus::kEnabled),
         ::testing::Values(WebEffectiveConnectionType::kType4G)));
 
@@ -1046,8 +958,6 @@
 };
 
 TEST_F(LazyLoadFramesTest, LazyLoadFrameUnsetLoadingAttributeWithoutAutomatic) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(true);
-
   SimRequest main_resource("https://example.com/", "text/html");
   LoadURL("https://example.com/");
 
@@ -1088,19 +998,7 @@
   EXPECT_TRUE(ConsoleMessages().Contains("child frame element onload"));
 }
 
-TEST_F(LazyLoadFramesTest, LazyLoadWhenDisabledAndAttrLazy) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(false);
-
-  TestCrossOriginFrameIsImmediatelyLoaded("loading='lazy'");
-  EXPECT_TRUE(GetDocument().IsUseCounted(
-      WebFeature::kLazyLoadFrameLoadingAttributeLazy));
-  EXPECT_FALSE(GetDocument().IsUseCounted(
-      WebFeature::kLazyLoadFrameLoadingAttributeEager));
-}
-
 TEST_F(LazyLoadFramesTest, LazyLoadWhenAttrLazy) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(true);
-
   TestCrossOriginFrameIsLazilyLoaded("loading='lazy'");
   EXPECT_TRUE(GetDocument().IsUseCounted(
       WebFeature::kLazyLoadFrameLoadingAttributeLazy));
@@ -1109,8 +1007,6 @@
 }
 
 TEST_F(LazyLoadFramesTest, LazyLoadWhenAttrEager) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(true);
-
   TestCrossOriginFrameIsImmediatelyLoaded("loading='eager'");
   EXPECT_FALSE(GetDocument().IsUseCounted(
       WebFeature::kLazyLoadFrameLoadingAttributeLazy));
@@ -1119,15 +1015,11 @@
 }
 
 TEST_F(LazyLoadFramesTest, LazyLoadWhenAutomaticDisabled) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(true);
-
   TestCrossOriginFrameIsImmediatelyLoaded("");
 }
 
 // Frames with loading=lazy should be deferred.
 TEST_F(LazyLoadFramesTest, DeferredForAttributeLazy) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(true);
-
   TestCrossOriginFrameIsLazilyLoaded("loading='lazy'");
   TestLazyLoadUsedInPageReload("loading='lazy'", true);
 }
diff --git a/third_party/blink/renderer/core/html/lazy_load_image_observer_test.cc b/third_party/blink/renderer/core/html/lazy_load_image_observer_test.cc
index 6a31518..5fd6dfc 100644
--- a/third_party/blink/renderer/core/html/lazy_load_image_observer_test.cc
+++ b/third_party/blink/renderer/core/html/lazy_load_image_observer_test.cc
@@ -612,8 +612,6 @@
 }
 
 TEST_F(LazyLoadImagesTest, ImageInsideLazyLoadedFrame) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(true);
-
   SimRequest main_resource("https://example.com/", "text/html");
   LoadURL("https://example.com/");
   main_resource.Complete(String::Format(
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
index 805da1c..a76c5cec 100644
--- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -1506,7 +1506,8 @@
 
 String InspectorOverlayAgent::EvaluateInOverlayForTest(const String& script) {
   ScriptForbiddenScope::AllowUserAgentScript allow_script;
-  v8::HandleScope handle_scope(ToIsolate(OverlayMainFrame()));
+  v8::Isolate* isolate = ToIsolate(OverlayMainFrame());
+  v8::HandleScope handle_scope(isolate);
   v8::Local<v8::Value> string =
       ClassicScript::CreateUnspecifiedScript(
           script, ScriptSourceLocationType::kInspector)
@@ -1514,7 +1515,7 @@
               To<LocalFrame>(OverlayMainFrame())->DomWindow(),
               ExecuteScriptPolicy::kExecuteScriptWhenScriptsDisabled)
           .GetSuccessValueOrEmpty();
-  return ToCoreStringWithUndefinedOrNullCheck(string);
+  return ToCoreStringWithUndefinedOrNullCheck(isolate, string);
 }
 
 void InspectorOverlayAgent::OnResizeTimer(TimerBase*) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
index 9b6e074..4ff9fc1 100644
--- a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
@@ -1293,10 +1293,11 @@
   v8::Local<v8::Function> original_function = GetBoundFunction(function);
   v8::Local<v8::Value> function_name = original_function->GetDebugName();
   if (!function_name.IsEmpty() && function_name->IsString()) {
-    dict.Add("functionName", ToCoreString(function_name.As<v8::String>()));
+    dict.Add("functionName", ToCoreString(context->GetIsolate(),
+                                          function_name.As<v8::String>()));
   }
   std::unique_ptr<SourceLocation> location =
-      CaptureSourceLocation(original_function);
+      CaptureSourceLocation(context->GetIsolate(), original_function);
   dict.Add("scriptId", String::Number(location->ScriptId()));
   dict.Add("url", location->Url());
   dict.Add("lineNumber", location->LineNumber());
diff --git a/third_party/blink/renderer/core/inspector/main_thread_debugger.cc b/third_party/blink/renderer/core/inspector/main_thread_debugger.cc
index a97fd7d2..bc13d609 100644
--- a/third_party/blink/renderer/core/inspector/main_thread_debugger.cc
+++ b/third_party/blink/renderer/core/inspector/main_thread_debugger.cc
@@ -448,7 +448,8 @@
     const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() < 1)
     return;
-  String selector = ToCoreStringWithUndefinedOrNullCheck(info[0]);
+  const String& selector =
+      ToCoreStringWithUndefinedOrNullCheck(info.GetIsolate(), info[0]);
   if (selector.empty())
     return;
   auto* container_node = DynamicTo<ContainerNode>(SecondArgumentAsNode(info));
@@ -471,7 +472,8 @@
     const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() < 1)
     return;
-  String selector = ToCoreStringWithUndefinedOrNullCheck(info[0]);
+  const String& selector =
+      ToCoreStringWithUndefinedOrNullCheck(info.GetIsolate(), info[0]);
   if (selector.empty())
     return;
   auto* container_node = DynamicTo<ContainerNode>(SecondArgumentAsNode(info));
@@ -503,7 +505,8 @@
     const v8::FunctionCallbackInfo<v8::Value>& info) {
   if (info.Length() < 1)
     return;
-  String selector = ToCoreStringWithUndefinedOrNullCheck(info[0]);
+  const String& selector =
+      ToCoreStringWithUndefinedOrNullCheck(info.GetIsolate(), info[0]);
   if (selector.empty())
     return;
   Node* node = SecondArgumentAsNode(info);
diff --git a/third_party/blink/renderer/core/inspector/thread_debugger_common_impl.cc b/third_party/blink/renderer/core/inspector/thread_debugger_common_impl.cc
index 93055773..03af221 100644
--- a/third_party/blink/renderer/core/inspector/thread_debugger_common_impl.cc
+++ b/third_party/blink/renderer/core/inspector/thread_debugger_common_impl.cc
@@ -393,25 +393,24 @@
 
 std::unique_ptr<v8_inspector::DeepSerializedValue> DeepSerializeNode(
     Node* node,
-    v8::Isolate* isolate_,
+    v8::Isolate* isolate,
     int max_node_depth,
     ShadowTreeSerialization include_shadow_tree) {
   v8::Local<v8::Object> node_v8_object = SerializeNodeToV8Object(
-      node, isolate_, max_node_depth, include_shadow_tree);
+      node, isolate, max_node_depth, include_shadow_tree);
 
   v8::Local<v8::Value> value_v8_object =
-      node_v8_object
-          ->Get(isolate_->GetCurrentContext(), ValueStringKey(isolate_))
+      node_v8_object->Get(isolate->GetCurrentContext(), ValueStringKey(isolate))
           .ToLocalChecked();
 
   // Safely get `type` from object value.
-  v8::MaybeLocal<v8::Value> maybe_type_v8_value = node_v8_object->Get(
-      isolate_->GetCurrentContext(), TypeStringKey(isolate_));
+  v8::MaybeLocal<v8::Value> maybe_type_v8_value =
+      node_v8_object->Get(isolate->GetCurrentContext(), TypeStringKey(isolate));
   DCHECK(!maybe_type_v8_value.IsEmpty());
   v8::Local<v8::Value> type_v8_value = maybe_type_v8_value.ToLocalChecked();
   DCHECK(type_v8_value->IsString());
   v8::Local<v8::String> type_v8_string = type_v8_value.As<v8::String>();
-  String type_string = ToCoreString(type_v8_string);
+  String type_string = ToCoreString(isolate, type_v8_string);
   StringView type_string_view = StringView(type_string);
   std::unique_ptr<v8_inspector::StringBuffer> type_string_buffer =
       ToV8InspectorStringBuffer(type_string_view);
@@ -477,8 +476,8 @@
                    " should be of type string."));
         return false;
       }
-      String include_shadow_tree_string =
-          ToCoreString(include_shadow_tree_value.As<v8::String>());
+      String include_shadow_tree_string = ToCoreString(
+          context->GetIsolate(), include_shadow_tree_value.As<v8::String>());
 
       if (include_shadow_tree_string == kIncludeShadowTreeValueNone) {
         include_shadow_tree = ShadowTreeSerialization::kNone;
@@ -786,17 +785,20 @@
 static Vector<String> NormalizeEventTypes(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
   Vector<String> types;
+  v8::Isolate* isolate = info.GetIsolate();
   if (info.Length() > 1 && info[1]->IsString())
-    types.push_back(ToCoreString(info[1].As<v8::String>()));
+    types.push_back(ToCoreString(isolate, info[1].As<v8::String>()));
   if (info.Length() > 1 && info[1]->IsArray()) {
     v8::Local<v8::Array> types_array = v8::Local<v8::Array>::Cast(info[1]);
     for (wtf_size_t i = 0; i < types_array->Length(); ++i) {
       v8::Local<v8::Value> type_value;
-      if (!types_array->Get(info.GetIsolate()->GetCurrentContext(), i)
+      if (!types_array->Get(isolate->GetCurrentContext(), i)
                .ToLocal(&type_value) ||
-          !type_value->IsString())
+          !type_value->IsString()) {
         continue;
-      types.push_back(ToCoreString(v8::Local<v8::String>::Cast(type_value)));
+      }
+      types.push_back(
+          ToCoreString(isolate, v8::Local<v8::String>::Cast(type_value)));
     }
   }
   if (info.Length() == 1)
diff --git a/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.cc b/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.cc
index 4a714d8..976699f4 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_ink_overflow.cc
@@ -559,69 +559,61 @@
     }
   }
 
-  bool do_highlights =
-      RuntimeEnabledFeatures::HighlightOverlayPaintingEnabled();
   bool do_spelling_grammar =
       RuntimeEnabledFeatures::CSSSpellingGrammarErrorsEnabled() ||
       RuntimeEnabledFeatures::CSSPaintingForSpellingGrammarErrorsEnabled();
 
-  if (do_highlights || do_spelling_grammar) {
-    // To extract decorations due to markers, we need a fragment item and a
-    // node. Ideally we would use cursor.Current().GetNode() but that's const
-    // and the style functions we need to access pseudo styles take non-const
-    // nodes.
-    const FragmentItem* fragment_item = cursor.CurrentItem();
-    if (!fragment_item->IsText() || fragment_item->IsGeneratedText()) {
-      return accumulated_bound;
-    }
-    const LayoutObject* layout_object = cursor.CurrentMutableLayoutObject();
-    DCHECK(layout_object);
-    Text* text_node = DynamicTo<Text>(layout_object->GetNode());
-    // ::first-letter passes the IsGeneratedText check but has no text node.
-    if (!text_node) {
-      return accumulated_bound;
+  // To extract decorations due to markers, we need a fragment item and a
+  // node. Ideally we would use cursor.Current().GetNode() but that's const
+  // and the style functions we need to access pseudo styles take non-const
+  // nodes.
+  const FragmentItem* fragment_item = cursor.CurrentItem();
+  if (!fragment_item->IsText() || fragment_item->IsGeneratedText()) {
+    return accumulated_bound;
+  }
+  const LayoutObject* layout_object = cursor.CurrentMutableLayoutObject();
+  DCHECK(layout_object);
+  Text* text_node = DynamicTo<Text>(layout_object->GetNode());
+  // ::first-letter passes the IsGeneratedText check but has no text node.
+  if (!text_node) {
+    return accumulated_bound;
+  }
+
+  DocumentMarkerController& controller = text_node->GetDocument().Markers();
+
+  DocumentMarkerVector target_markers = controller.MarkersFor(
+      *text_node, DocumentMarker::MarkerTypes::TextFragment());
+  if (!target_markers.empty()) {
+    LogicalRect target_bound = ComputeMarkerOverflow(
+        target_markers, DocumentMarker::kTextFragment, fragment_item, text_node,
+        style, scaled_font, container_offset, ink_overflow, inline_context);
+    accumulated_bound.Unite(target_bound);
+  }
+  DocumentMarkerVector custom_markers = controller.MarkersFor(
+      *text_node, DocumentMarker::MarkerTypes::CustomHighlight());
+  if (!custom_markers.empty()) {
+    LogicalRect custom_bound = ComputeCustomHighlightOverflow(
+        custom_markers, fragment_item, text_node, style, scaled_font,
+        container_offset, ink_overflow, inline_context);
+    accumulated_bound.Unite(custom_bound);
+  }
+  if (do_spelling_grammar) {
+    DocumentMarkerVector spelling_markers = controller.MarkersFor(
+        *text_node, DocumentMarker::MarkerTypes::Spelling());
+    if (!spelling_markers.empty()) {
+      LogicalRect spelling_bound = ComputeMarkerOverflow(
+          spelling_markers, DocumentMarker::kSpelling, fragment_item, text_node,
+          style, scaled_font, container_offset, ink_overflow, inline_context);
+      accumulated_bound.Unite(spelling_bound);
     }
 
-    DocumentMarkerController& controller = text_node->GetDocument().Markers();
-
-    if (do_highlights) {
-      DocumentMarkerVector target_markers = controller.MarkersFor(
-          *text_node, DocumentMarker::MarkerTypes::TextFragment());
-      if (!target_markers.empty()) {
-        LogicalRect target_bound = ComputeMarkerOverflow(
-            target_markers, DocumentMarker::kTextFragment, fragment_item,
-            text_node, style, scaled_font, container_offset, ink_overflow,
-            inline_context);
-        accumulated_bound.Unite(target_bound);
-      }
-      DocumentMarkerVector custom_markers = controller.MarkersFor(
-          *text_node, DocumentMarker::MarkerTypes::CustomHighlight());
-      if (!custom_markers.empty()) {
-        LogicalRect custom_bound = ComputeCustomHighlightOverflow(
-            custom_markers, fragment_item, text_node, style, scaled_font,
-            container_offset, ink_overflow, inline_context);
-        accumulated_bound.Unite(custom_bound);
-      }
-    }
-    if (do_spelling_grammar) {
-      DocumentMarkerVector spelling_markers = controller.MarkersFor(
-          *text_node, DocumentMarker::MarkerTypes::Spelling());
-      if (!spelling_markers.empty()) {
-        LogicalRect spelling_bound = ComputeMarkerOverflow(
-            spelling_markers, DocumentMarker::kSpelling, fragment_item,
-            text_node, style, scaled_font, container_offset, ink_overflow,
-            inline_context);
-        accumulated_bound.Unite(spelling_bound);
-      }
-
-      DocumentMarkerVector grammar_markers = controller.MarkersFor(
-          *text_node, DocumentMarker::MarkerTypes::Grammar());
-      if (!grammar_markers.empty()) {
-        LogicalRect grammar_bound = ComputeMarkerOverflow(
-            grammar_markers, DocumentMarker::kGrammar, fragment_item, text_node,
-            style, scaled_font, container_offset, ink_overflow, inline_context);
-        accumulated_bound.Unite(grammar_bound);
-      }
+    DocumentMarkerVector grammar_markers = controller.MarkersFor(
+        *text_node, DocumentMarker::MarkerTypes::Grammar());
+    if (!grammar_markers.empty()) {
+      LogicalRect grammar_bound = ComputeMarkerOverflow(
+          grammar_markers, DocumentMarker::kGrammar, fragment_item, text_node,
+          style, scaled_font, container_offset, ink_overflow, inline_context);
+      accumulated_bound.Unite(grammar_bound);
     }
   }
   return accumulated_bound;
diff --git a/third_party/blink/renderer/core/lcp_critical_path_predictor/lcp_script_observer.cc b/third_party/blink/renderer/core/lcp_critical_path_predictor/lcp_script_observer.cc
index e63bf86..43dde3f 100644
--- a/third_party/blink/renderer/core/lcp_critical_path_predictor/lcp_script_observer.cc
+++ b/third_party/blink/renderer/core/lcp_critical_path_predictor/lcp_script_observer.cc
@@ -32,8 +32,7 @@
 
   // Gather (promise) microtasks in execution. This is required as Probes
   // do not yet have an implementation that covers microtasks.
-  v8::Isolate* isolate = v8::Isolate::GetCurrent();
-  DCHECK(isolate);
+  v8::Isolate* isolate = v8::Isolate::TryGetCurrent();
   auto v8_stack_urls = GetScriptUrlsFromCurrentStack(isolate, 0);
   for (auto& url : v8_stack_urls) {
     if (url.empty()) {
@@ -56,10 +55,11 @@
       probe->function->GetScriptOrigin().ResourceName();
   String script_url;
   if (!resource_name.IsEmpty()) {
+    v8::Isolate* isolate = ToIsolate(local_root_);
     v8::MaybeLocal<v8::String> resource_name_string =
-        resource_name->ToString(ToIsolate(local_root_)->GetCurrentContext());
+        resource_name->ToString(isolate->GetCurrentContext());
     if (!resource_name_string.IsEmpty()) {
-      script_url = ToCoreString(resource_name_string.ToLocalChecked());
+      script_url = ToCoreString(isolate, resource_name_string.ToLocalChecked());
     }
   }
   return script_url;
diff --git a/third_party/blink/renderer/core/navigation_api/navigation_api.cc b/third_party/blink/renderer/core/navigation_api/navigation_api.cc
index 3e7d9a9..071adac 100644
--- a/third_party/blink/renderer/core/navigation_api/navigation_api.cc
+++ b/third_party/blink/renderer/core/navigation_api/navigation_api.cc
@@ -939,8 +939,8 @@
   std::unique_ptr<SourceLocation> location =
       blink::CaptureSourceLocation(isolate, message, window_);
   ErrorEvent* event = ErrorEvent::Create(
-      ToCoreStringWithNullCheck(message->Get()), std::move(location), value,
-      &DOMWrapperWorld::MainWorld());
+      ToCoreStringWithNullCheck(isolate, message->Get()), std::move(location),
+      value, &DOMWrapperWorld::MainWorld());
   event->SetType(event_type_names::kNavigateerror);
   DispatchEvent(*event);
 
diff --git a/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay.cc b/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay.cc
index d778c67..c46db2ed 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay.cc
@@ -233,8 +233,6 @@
     const DocumentMarkerVector& grammar,
     const DocumentMarkerVector& spelling,
     const DocumentMarkerVector& target) {
-  DCHECK(RuntimeEnabledFeatures::HighlightOverlayPaintingEnabled());
-
   Vector<HighlightLayer> result{};
   result.emplace_back(HighlightLayerType::kOriginating);
 
@@ -272,8 +270,6 @@
     const DocumentMarkerVector& grammar,
     const DocumentMarkerVector& spelling,
     const DocumentMarkerVector& target) {
-  DCHECK(RuntimeEnabledFeatures::HighlightOverlayPaintingEnabled());
-
   Vector<HighlightEdge> result{};
 
   if (selection) {
@@ -398,7 +394,6 @@
     const NGTextFragmentPaintInfo& content_offsets,
     const Vector<HighlightLayer>& layers,
     const Vector<HighlightEdge>& edges) {
-  DCHECK(RuntimeEnabledFeatures::HighlightOverlayPaintingEnabled());
   const HighlightLayer originating_layer{HighlightLayerType::kOriginating};
   const HighlightDecoration originating_decoration{
       originating_layer, {content_offsets.from, content_offsets.to}};
diff --git a/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay_test.cc b/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay_test.cc
index 15b0f931..e5f74779 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay_test.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_highlight_overlay_test.cc
@@ -30,10 +30,9 @@
 
 }  // namespace
 
-class NGHighlightOverlayTest : public PageTestBase,
-                               private ScopedHighlightOverlayPaintingForTest {
+class NGHighlightOverlayTest : public PageTestBase {
  public:
-  NGHighlightOverlayTest() : ScopedHighlightOverlayPaintingForTest(true) {}
+  NGHighlightOverlayTest() : PageTestBase() {}
 };
 
 TEST_F(NGHighlightOverlayTest, ComputeLayers) {
diff --git a/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.cc
index a34d530..2a4c2a12 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.cc
@@ -361,16 +361,14 @@
     if (text_node) {
       DocumentMarkerController& controller = node_->GetDocument().Markers();
       markers_ = controller.ComputeMarkersToPaint(*text_node);
-      if (RuntimeEnabledFeatures::HighlightOverlayPaintingEnabled()) {
-        target_ = controller.MarkersFor(
-            *text_node, DocumentMarker::MarkerTypes::TextFragment());
-        spelling_ = controller.MarkersFor(
-            *text_node, DocumentMarker::MarkerTypes::Spelling());
-        grammar_ = controller.MarkersFor(
-            *text_node, DocumentMarker::MarkerTypes::Grammar());
-        custom_ = controller.MarkersFor(
-            *text_node, DocumentMarker::MarkerTypes::CustomHighlight());
-      }
+      target_ = controller.MarkersFor(
+          *text_node, DocumentMarker::MarkerTypes::TextFragment());
+      spelling_ = controller.MarkersFor(
+          *text_node, DocumentMarker::MarkerTypes::Spelling());
+      grammar_ = controller.MarkersFor(*text_node,
+                                       DocumentMarker::MarkerTypes::Grammar());
+      custom_ = controller.MarkersFor(
+          *text_node, DocumentMarker::MarkerTypes::CustomHighlight());
       // Check if there are any markers too, as required by NGOffsetMappingTest.
       if (selection || !markers_.empty() || !target_.empty() ||
           !spelling_.empty() || !grammar_.empty() || !custom_.empty()) {
@@ -459,10 +457,8 @@
     const unsigned paint_start_offset = marker_offsets->start;
     const unsigned paint_end_offset = marker_offsets->end;
 
-    if (RuntimeEnabledFeatures::HighlightOverlayPaintingEnabled()) {
-      DCHECK(!DocumentMarker::MarkerTypes::HighlightPseudos().Contains(
-          marker->GetType()));
-    }
+    DCHECK(!DocumentMarker::MarkerTypes::HighlightPseudos().Contains(
+        marker->GetType()));
 
     switch (marker->GetType()) {
       case DocumentMarker::kSpelling:
@@ -591,9 +587,6 @@
   if (selection_ && selection_->ShouldPaintSelectedTextOnly())
     return kSelectionOnly;
 
-  if (!RuntimeEnabledFeatures::HighlightOverlayPaintingEnabled())
-    return selection_ ? kOldSelection : kNoHighlights;
-
   // This can yield false positives (weakening the optimisations below) if all
   // non-spelling/grammar/selection highlights are outside the text fragment.
   if (!target_.empty() || !custom_.empty())
diff --git a/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.h b/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.h
index e501f573..1238d5b 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.h
+++ b/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.h
@@ -142,7 +142,7 @@
   enum Phase { kBackground, kForeground };
 
   // Paints backgrounds or foregrounds for markers that are not exposed as CSS
-  // highlight pseudos, or all markers if HighlightOverlayPainting is off.
+  // highlight pseudos.
   void Paint(Phase phase);
 
   // Indicates the way this painter should be used by the caller, aside from
@@ -153,26 +153,19 @@
   // decorations that are required to paint under decorations from earlier
   // layers (e.g. ::target-text underline with originating overline).
   enum Case {
-    // Caller should not use this painter.
-    // This happens if nothing is highlighted, or HighlightOverlayPainting is
-    // off and nothing is selected.
+    // Caller should not use this painter. This happens if nothing is
+    // highlighted.
     kNoHighlights,
     // Caller should use PaintOriginatingText and PaintHighlightOverlays.
-    // This happens if HighlightOverlayPainting is on and there are highlights
-    // that may involve the text fragment, except in some situations with only
-    // spelling/grammar (kFastSpellingGrammar) or selection (kFastSelection).
+    // This happens if there are highlights that may involve the text
+    // fragment, except in some situations with only spelling/grammar
+    // (kFastSpellingGrammar) or selection (kFastSelection).
     kOverlay,
     // Caller should use PaintSelectedText only.
     // This happens if ShouldPaintSelectedTextOnly is true, such as when
     // painting the ::selection drag image.
     kSelectionOnly,
     // Caller should use PaintSuppressingTextProperWhereSelected,
-    // PaintSelectionBackground, PaintSelectedText, and NGTextDecorationPainter
-    // (which paints highlight decorations incorrectly).
-    // This happens if HighlightOverlayPainting is off and the text fragment
-    // is selected.
-    kOldSelection,
-    // Caller should use PaintSuppressingTextProperWhereSelected,
     // PaintSelectionBackground, and PaintSelectedText.
     // This happens if the only highlight that may involve the text fragment
     // is a selection, and neither the selection nor the originating content
diff --git a/third_party/blink/renderer/core/paint/ng/ng_highlight_painter_test.cc b/third_party/blink/renderer/core/paint/ng/ng_highlight_painter_test.cc
index 355456a..f7e42e36 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_highlight_painter_test.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_highlight_painter_test.cc
@@ -20,13 +20,11 @@
 
 namespace blink {
 
-class NGHighlightPainterTest : public PaintControllerPaintTest,
-                               private ScopedHighlightOverlayPaintingForTest {
+class NGHighlightPainterTest : public PaintControllerPaintTest {
  public:
   explicit NGHighlightPainterTest(
       LocalFrameClient* local_frame_client = nullptr)
-      : PaintControllerPaintTest(local_frame_client),
-        ScopedHighlightOverlayPaintingForTest(true) {}
+      : PaintControllerPaintTest(local_frame_client) {}
 };
 
 INSTANTIATE_PAINT_TEST_SUITE_P(NGHighlightPainterTest);
diff --git a/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc
index fb6c510..c0cd6f6 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc
@@ -533,15 +533,6 @@
       highlight_painter.PaintHighlightOverlays(
           text_style, node_id, paint_marker_backgrounds, rotation);
       break;
-    case NGHighlightPainter::kOldSelection:
-      // Slow path: paint suppressing text proper where ::selection active.
-      decoration_painter.Begin(NGTextDecorationPainter::kOriginating);
-      decoration_painter.PaintExceptLineThrough(fragment_paint_info);
-      highlight_painter.Selection()->PaintSuppressingTextProperWhereSelected(
-          text_painter, fragment_paint_info, text_style, node_id,
-          auto_dark_mode);
-      decoration_painter.PaintOnlyLineThrough();
-      break;
     case NGHighlightPainter::kSelectionOnly:
       // Do nothing, and paint the selection later.
       break;
@@ -549,8 +540,7 @@
 
   // Paint ::selection background.
   if (UNLIKELY(highlight_painter.Selection() && paint_marker_backgrounds)) {
-    if (highlight_case == NGHighlightPainter::kFastSelection ||
-        highlight_case == NGHighlightPainter::kOldSelection) {
+    if (highlight_case == NGHighlightPainter::kFastSelection) {
       highlight_painter.Selection()->PaintSelectionBackground(
           context, node, document, style, rotation);
     }
@@ -571,7 +561,6 @@
             auto_dark_mode);
         break;
       case NGHighlightPainter::kSelectionOnly:
-      case NGHighlightPainter::kOldSelection:
         decoration_painter.Begin(NGTextDecorationPainter::kSelection);
         decoration_painter.PaintExceptLineThrough(fragment_paint_info);
         highlight_painter.Selection()->PaintSelectedText(
diff --git a/third_party/blink/renderer/core/script/detect_javascript_frameworks.cc b/third_party/blink/renderer/core/script/detect_javascript_frameworks.cc
index ca572c8..4589a09d 100644
--- a/third_party/blink/renderer/core/script/detect_javascript_frameworks.cc
+++ b/third_party/blink/renderer/core/script/detect_javascript_frameworks.cc
@@ -119,7 +119,7 @@
     if (!property_names->Get(context, i).ToLocal(&key) || !key->IsString()) {
       continue;
     }
-    AtomicString key_value = ToCoreAtomicString(key.As<v8::String>());
+    AtomicString key_value = ToCoreAtomicString(isolate, key.As<v8::String>());
     if (key_value == vue_string || key_value == vue_app_string) {
       result.detected_versions[JavaScriptFramework::kVue] =
           kNoFrameworkVersionDetected;
diff --git a/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc b/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc
index a33fd4e..1a17539cb 100644
--- a/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc
+++ b/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc
@@ -143,8 +143,8 @@
     v8::Local<v8::Value> exported_value =
         module_namespace->Get(context, V8String(isolate, export_name_))
             .ToLocalChecked();
-    captured_value_ =
-        ToCoreString(exported_value->ToString(context).ToLocalChecked());
+    captured_value_ = ToCoreString(
+        isolate, exported_value->ToString(context).ToLocalChecked());
 
     return ScriptValue();
   }
@@ -176,11 +176,12 @@
 
     v8::Local<v8::Value> name =
         error_object->Get(context, V8String(isolate, "name")).ToLocalChecked();
-    name_ = ToCoreString(name->ToString(context).ToLocalChecked());
+    name_ = ToCoreString(isolate, name->ToString(context).ToLocalChecked());
     v8::Local<v8::Value> message =
         error_object->Get(context, V8String(isolate, "message"))
             .ToLocalChecked();
-    message_ = ToCoreString(message->ToString(context).ToLocalChecked());
+    message_ =
+        ToCoreString(isolate, message->ToString(context).ToLocalChecked());
 
     return ScriptValue();
   }
diff --git a/third_party/blink/renderer/core/streams/readable_stream_test.cc b/third_party/blink/renderer/core/streams/readable_stream_test.cc
index a03cc04..ff35b09 100644
--- a/third_party/blink/renderer/core/streams/readable_stream_test.cc
+++ b/third_party/blink/renderer/core/streams/readable_stream_test.cc
@@ -94,7 +94,7 @@
       }
       if (!result->IsUndefined()) {
         DCHECK(result->IsString());
-        return ToCoreString(result.As<v8::String>());
+        return ToCoreString(isolate, result.As<v8::String>());
       }
 
       // Need to run the event loop for the Serialize test to pass messages
@@ -735,7 +735,8 @@
                ->Get(script_state->GetContext(),
                      V8AtomicString(script_state->GetIsolate(), key))
                .ToLocal(&actual) &&
-           ToCoreStringWithUndefinedOrNullCheck(actual) == value;
+           ToCoreStringWithUndefinedOrNullCheck(script_state->GetIsolate(),
+                                                actual) == value;
   };
 
   return Has("name", "TypeError") && Has("message", message);
diff --git a/third_party/blink/renderer/core/streams/test_utils.cc b/third_party/blink/renderer/core/streams/test_utils.cc
index 1448685..20f2ba8 100644
--- a/third_party/blink/renderer/core/streams/test_utils.cc
+++ b/third_party/blink/renderer/core/streams/test_utils.cc
@@ -41,6 +41,7 @@
   ScriptValue r = Eval(scope, script);
   if (block.HasCaught()) {
     ADD_FAILURE() << ToCoreString(
+        scope->GetIsolate(),
         block.Exception()->ToString(scope->GetContext()).ToLocalChecked());
     block.ReThrow();
   }
diff --git a/third_party/blink/renderer/core/streams/transform_stream_test.cc b/third_party/blink/renderer/core/streams/transform_stream_test.cc
index ede985e..b9ee4746 100644
--- a/third_party/blink/renderer/core/streams/transform_stream_test.cc
+++ b/third_party/blink/renderer/core/streams/transform_stream_test.cc
@@ -230,7 +230,8 @@
   }
   if (done)
     return false;
-  return ToCoreStringWithUndefinedOrNullCheck(chunk) == expected;
+  return ToCoreStringWithUndefinedOrNullCheck(script_state->GetIsolate(),
+                                              chunk) == expected;
 }
 
 bool IsTypeError(ScriptState* script_state,
@@ -250,7 +251,8 @@
                ->Get(script_state->GetContext(),
                      V8AtomicString(script_state->GetIsolate(), key))
                .ToLocal(&actual) &&
-           ToCoreStringWithUndefinedOrNullCheck(actual) == value;
+           ToCoreStringWithUndefinedOrNullCheck(script_state->GetIsolate(),
+                                                actual) == value;
   };
 
   return Has("name", "TypeError") && Has("message", message);
diff --git a/third_party/blink/renderer/core/streams/writable_stream_test.cc b/third_party/blink/renderer/core/streams/writable_stream_test.cc
index 1d96555..404ceb7 100644
--- a/third_party/blink/renderer/core/streams/writable_stream_test.cc
+++ b/third_party/blink/renderer/core/streams/writable_stream_test.cc
@@ -95,7 +95,7 @@
                   ->Get(context, V8String(isolate, "result"))
                   .ToLocal(&result));
   ASSERT_TRUE(result->IsString());
-  EXPECT_EQ(ToCoreString(result.As<v8::String>()), "a");
+  EXPECT_EQ(ToCoreString(scope.GetIsolate(), result.As<v8::String>()), "a");
 }
 
 }  // namespace
diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc
index 9b471654..f0ba611e 100644
--- a/third_party/blink/renderer/core/testing/internals.cc
+++ b/third_party/blink/renderer/core/testing/internals.cc
@@ -492,7 +492,8 @@
                       ExceptionState&) override {
     DCHECK(internal_sink_);
     internal_sink_->Append(
-        ToCoreString(chunk.V8Value()
+        ToCoreString(script_state->GetIsolate(),
+                     chunk.V8Value()
                          ->ToString(script_state->GetContext())
                          .ToLocalChecked())
             .Utf8());
diff --git a/third_party/blink/renderer/core/testing/mock_function_scope.cc b/third_party/blink/renderer/core/testing/mock_function_scope.cc
index 0757ad52..d4033a7 100644
--- a/third_party/blink/renderer/core/testing/mock_function_scope.cc
+++ b/third_party/blink/renderer/core/testing/mock_function_scope.cc
@@ -49,6 +49,7 @@
 
 ACTION_P2(SaveValueIn, script_state, captor) {
   *captor = ToCoreString(
+      script_state->GetIsolate(),
       arg1.V8Value()->ToString(script_state->GetContext()).ToLocalChecked());
 }
 
diff --git a/third_party/blink/renderer/core/timing/performance_mark_test.cc b/third_party/blink/renderer/core/timing/performance_mark_test.cc
index 59ae4b92..6f64097 100644
--- a/third_party/blink/renderer/core/timing/performance_mark_test.cc
+++ b/third_party/blink/renderer/core/timing/performance_mark_test.cc
@@ -95,6 +95,7 @@
   EXPECT_TRUE(json_object.IsObject());
 
   String json_string = ToBlinkString<String>(
+      scope.GetIsolate(),
       v8::JSON::Stringify(scope.GetContext(),
                           json_object.V8Value().As<v8::Object>())
           .ToLocalChecked(),
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc
index 191d75d..256cdf9 100644
--- a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc
+++ b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc
@@ -627,7 +627,7 @@
         first_value->IsString()) {
       v8::Local<v8::String> first_value_as_string =
           v8::Local<v8::String>::Cast(first_value);
-      return ToCoreString(first_value_as_string);
+      return ToCoreString(script_state->GetIsolate(), first_value_as_string);
     }
   }
 
diff --git a/third_party/blink/renderer/core/view_transition/README.md b/third_party/blink/renderer/core/view_transition/README.md
index b7b011af..7695f1aa 100644
--- a/third_party/blink/renderer/core/view_transition/README.md
+++ b/third_party/blink/renderer/core/view_transition/README.md
@@ -78,6 +78,32 @@
 generated pseudo elements in UA and developer stylesheets. This string is
 tracked on the PseudoElement class.
 
+### Pseudo-element traversal
+
+Pseudo elements are not considered part of tree structure of the ordinary DOM
+tree and thus have no sibling or child pointers like ordinary nodes. However, an
+ordering is defined via special "PseudoAware" methods for child and sibling
+operations.
+
+Within the ::view-transition subtree, view-transition-group siblings are ordered
+based on ordering of the view-transition-name, which is sorted by the paint
+order of the elements they represent, see
+[ViewTransitionStyleTracker::AddTransitionElementsFromCSSRecursive](https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc;l=559;drc=7172fffc3c545134d5c88af8ab07b04fcb1d628e).
+::view-transition-old always precedes ::view-transition-new.
+
+In terms of ordering, only ::view-transition is relevant in relation to non-VT
+elements and pseudos, since VT-pseudos can only appear within ::view-transition and
+no other elements can. ::view-transition is placed after ::after:
+
+```
+  Element
+    ::marker
+    ::before
+    Ordinary Elements
+    ::after
+    ::view-transition
+```
+
 ## ViewTransitionElementResourceId
 ViewTransitionElementResourceId is an identifier used to tag the rendered output (called
 a snapshot) of transition elements and the root stacking context generated by the
diff --git a/third_party/blink/renderer/core/view_transition/view_transition_test.cc b/third_party/blink/renderer/core/view_transition/view_transition_test.cc
index e9eac8ec..f85e87d 100644
--- a/third_party/blink/renderer/core/view_transition/view_transition_test.cc
+++ b/third_party/blink/renderer/core/view_transition/view_transition_test.cc
@@ -18,11 +18,13 @@
 #include "third_party/blink/renderer/core/css/style_engine.h"
 #include "third_party/blink/renderer/core/dom/abort_signal.h"
 #include "third_party/blink/renderer/core/dom/document.h"
+#include "third_party/blink/renderer/core/dom/dom_token_list.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/node_computed_style.h"
 #include "third_party/blink/renderer/core/dom/pseudo_element.h"
 #include "third_party/blink/renderer/core/frame/frame_test_helpers.h"
 #include "third_party/blink/renderer/core/html/html_element.h"
+#include "third_party/blink/renderer/core/html/html_head_element.h"
 #include "third_party/blink/renderer/core/inspector/inspector_style_resolver.h"
 #include "third_party/blink/renderer/core/layout/layout_shift_tracker.h"
 #include "third_party/blink/renderer/core/layout/layout_view.h"
@@ -956,4 +958,334 @@
           *GetDocument().GetLayoutView()));
 }
 
+TEST_P(ViewTransitionTest, PseudoAwareChildTraversal) {
+  SetHtmlInnerHTML(R"HTML(
+    <style>
+      :root {
+        view-transition-name: none;
+      }
+      :root.transitioned {
+        view-transition-name: root;
+      }
+      #foo {
+        view-transition-name: foo;
+      }
+      #bar {
+        view-transition-name: bar;
+      }
+      .transitioned #bar {
+        view-transition-name: none;
+      }
+    </style>
+    <div id="foo"></div>
+    <div id="bar"></div>
+  )HTML");
+
+  UpdateAllLifecyclePhasesForTest();
+
+  V8TestingScope v8_scope;
+  ScriptState* script_state = v8_scope.GetScriptState();
+  ExceptionState& exception_state = v8_scope.GetExceptionState();
+
+  auto start_setup_lambda =
+      [](const v8::FunctionCallbackInfo<v8::Value>& info) {
+        auto* document =
+            static_cast<Document*>(info.Data().As<v8::External>()->Value());
+        document->documentElement()->classList().Add(
+            AtomicString("transitioned"));
+      };
+
+  // This callback sets the elements for the start phase of the transition.
+  auto start_setup_callback =
+      v8::Function::New(
+          v8_scope.GetContext(), start_setup_lambda,
+          v8::External::New(v8_scope.GetIsolate(), &GetDocument()))
+          .ToLocalChecked();
+
+  ViewTransitionSupplement::startViewTransition(
+      script_state, GetDocument(),
+      V8ViewTransitionCallback::Create(start_setup_callback), exception_state);
+  ASSERT_FALSE(exception_state.HadException());
+
+  UpdateAllLifecyclePhasesAndFinishDirectives();
+  test::RunPendingTasks();
+  UpdateAllLifecyclePhasesAndFinishDirectives();
+
+  auto* transition_pseudo = GetDocument().documentElement()->GetPseudoElement(
+      kPseudoIdViewTransition);
+  ASSERT_TRUE(transition_pseudo);
+
+  EXPECT_EQ(GetDocument().documentElement()->PseudoAwareFirstChild(),
+            static_cast<Node*>(GetDocument().head()));
+  EXPECT_EQ(GetDocument().documentElement()->PseudoAwareLastChild(),
+            transition_pseudo);
+
+  // Root is last since it doesn't appear until encountered in the new view.
+  auto* foo_group_pseudo = transition_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionGroup, AtomicString("foo"));
+  auto* bar_group_pseudo = transition_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionGroup, AtomicString("bar"));
+  auto* root_group_pseudo = transition_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionGroup, AtomicString("root"));
+
+  EXPECT_EQ(transition_pseudo->PseudoAwareFirstChild(), foo_group_pseudo);
+  EXPECT_EQ(transition_pseudo->PseudoAwareLastChild(), root_group_pseudo);
+
+  auto* root_image_pair_pseudo = root_group_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionImagePair, AtomicString("root"));
+  auto* foo_image_pair_pseudo = foo_group_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionImagePair, AtomicString("foo"));
+  auto* bar_image_pair_pseudo = bar_group_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionImagePair, AtomicString("bar"));
+
+  EXPECT_EQ(foo_group_pseudo->PseudoAwareFirstChild(), foo_image_pair_pseudo);
+  EXPECT_EQ(foo_group_pseudo->PseudoAwareLastChild(), foo_image_pair_pseudo);
+
+  auto* foo_old_pseudo = foo_image_pair_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionOld, AtomicString("foo"));
+  auto* foo_new_pseudo = foo_image_pair_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionNew, AtomicString("foo"));
+
+  EXPECT_EQ(foo_image_pair_pseudo->PseudoAwareFirstChild(), foo_old_pseudo);
+  EXPECT_EQ(foo_image_pair_pseudo->PseudoAwareLastChild(), foo_new_pseudo);
+
+  auto* bar_old_pseudo = bar_image_pair_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionOld, AtomicString("bar"));
+  EXPECT_EQ(bar_image_pair_pseudo->PseudoAwareFirstChild(), bar_old_pseudo);
+  EXPECT_EQ(bar_image_pair_pseudo->PseudoAwareLastChild(), bar_old_pseudo);
+
+  auto* root_new_pseudo = root_image_pair_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionNew, AtomicString("root"));
+  EXPECT_EQ(root_image_pair_pseudo->PseudoAwareFirstChild(), root_new_pseudo);
+  EXPECT_EQ(root_image_pair_pseudo->PseudoAwareLastChild(), root_new_pseudo);
+}
+
+TEST_P(ViewTransitionTest, PseudoAwareSiblingTraversal) {
+  SetHtmlInnerHTML(R"HTML(
+    <style>
+      #foo {
+        view-transition-name: foo;
+      }
+      #bar {
+        view-transition-name: bar;
+      }
+    </style>
+    <div id="foo"></div>
+    <div id="bar"></div>
+  )HTML");
+
+  UpdateAllLifecyclePhasesForTest();
+
+  V8TestingScope v8_scope;
+  ScriptState* script_state = v8_scope.GetScriptState();
+  ExceptionState& exception_state = v8_scope.GetExceptionState();
+
+  auto start_setup_lambda =
+      [](const v8::FunctionCallbackInfo<v8::Value>& info) {};
+
+  // This callback sets the elements for the start phase of the transition.
+  auto start_setup_callback =
+      v8::Function::New(v8_scope.GetContext(), start_setup_lambda, {})
+          .ToLocalChecked();
+
+  ViewTransitionSupplement::startViewTransition(
+      script_state, GetDocument(),
+      V8ViewTransitionCallback::Create(start_setup_callback), exception_state);
+  ASSERT_FALSE(exception_state.HadException());
+
+  UpdateAllLifecyclePhasesAndFinishDirectives();
+  test::RunPendingTasks();
+  UpdateAllLifecyclePhasesAndFinishDirectives();
+
+  auto* transition_pseudo = GetDocument().documentElement()->GetPseudoElement(
+      kPseudoIdViewTransition);
+  ASSERT_TRUE(transition_pseudo);
+
+  EXPECT_FALSE(transition_pseudo->PseudoAwareNextSibling());
+  EXPECT_EQ(transition_pseudo->PseudoAwarePreviousSibling(),
+            GetDocument().QuerySelector(AtomicString("body")));
+
+  auto* foo_group_pseudo = transition_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionGroup, AtomicString("foo"));
+  auto* bar_group_pseudo = transition_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionGroup, AtomicString("bar"));
+  auto* root_group_pseudo = transition_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionGroup, AtomicString("root"));
+
+  EXPECT_EQ(root_group_pseudo->PseudoAwareNextSibling(), foo_group_pseudo);
+  EXPECT_EQ(root_group_pseudo->PseudoAwarePreviousSibling(), nullptr);
+
+  EXPECT_EQ(foo_group_pseudo->PseudoAwareNextSibling(), bar_group_pseudo);
+  EXPECT_EQ(foo_group_pseudo->PseudoAwarePreviousSibling(), root_group_pseudo);
+
+  EXPECT_EQ(bar_group_pseudo->PseudoAwareNextSibling(), nullptr);
+  EXPECT_EQ(bar_group_pseudo->PseudoAwarePreviousSibling(), foo_group_pseudo);
+
+  auto* foo_image_pair_pseudo = foo_group_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionImagePair, AtomicString("foo"));
+  auto* bar_image_pair_pseudo = bar_group_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionImagePair, AtomicString("bar"));
+
+  EXPECT_FALSE(foo_image_pair_pseudo->PseudoAwareNextSibling());
+  EXPECT_FALSE(foo_image_pair_pseudo->PseudoAwarePreviousSibling());
+  EXPECT_FALSE(bar_image_pair_pseudo->PseudoAwareNextSibling());
+  EXPECT_FALSE(bar_image_pair_pseudo->PseudoAwarePreviousSibling());
+
+  auto* foo_old_pseudo = foo_image_pair_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionOld, AtomicString("foo"));
+  auto* foo_new_pseudo = foo_image_pair_pseudo->GetPseudoElement(
+      kPseudoIdViewTransitionNew, AtomicString("foo"));
+
+  EXPECT_EQ(foo_old_pseudo->PseudoAwareNextSibling(), foo_new_pseudo);
+  EXPECT_EQ(foo_old_pseudo->PseudoAwarePreviousSibling(), nullptr);
+  EXPECT_EQ(foo_new_pseudo->PseudoAwareNextSibling(), nullptr);
+  EXPECT_EQ(foo_new_pseudo->PseudoAwarePreviousSibling(), foo_old_pseudo);
+}
+
+TEST_P(ViewTransitionTest, IncludingPseudoTraversal) {
+  SetHtmlInnerHTML(R"HTML(
+  <style>
+    html { display: list-item; }
+    html::marker {}
+    html::before { content: ''}
+    html::after { content: '' }
+  </style>
+  <div id="foo"></div>
+  )HTML");
+
+  UpdateAllLifecyclePhasesForTest();
+
+  V8TestingScope v8_scope;
+  ScriptState* script_state = v8_scope.GetScriptState();
+  ExceptionState& exception_state = v8_scope.GetExceptionState();
+
+  auto start_setup_lambda =
+      [](const v8::FunctionCallbackInfo<v8::Value>& info) {};
+
+  // This callback sets the elements for the start phase of the transition.
+  auto start_setup_callback =
+      v8::Function::New(v8_scope.GetContext(), start_setup_lambda, {})
+          .ToLocalChecked();
+
+  ViewTransitionSupplement::startViewTransition(
+      script_state, GetDocument(),
+      V8ViewTransitionCallback::Create(start_setup_callback), exception_state);
+  ASSERT_FALSE(exception_state.HadException());
+
+  UpdateAllLifecyclePhasesAndFinishDirectives();
+  test::RunPendingTasks();
+  UpdateAllLifecyclePhasesAndFinishDirectives();
+
+  Node* root = &GetDocument();
+  Element* html = GetDocument().QuerySelector(AtomicString("html"));
+  PseudoElement* vt = html->GetPseudoElement(kPseudoIdViewTransition);
+  PseudoElement* vt_group =
+      vt->GetPseudoElement(kPseudoIdViewTransitionGroup, AtomicString("root"));
+  PseudoElement* vt_image_pair = vt_group->GetPseudoElement(
+      kPseudoIdViewTransitionImagePair, AtomicString("root"));
+  PseudoElement* vt_old = vt_image_pair->GetPseudoElement(
+      kPseudoIdViewTransitionOld, AtomicString("root"));
+  PseudoElement* vt_new = vt_image_pair->GetPseudoElement(
+      kPseudoIdViewTransitionNew, AtomicString("root"));
+
+  PseudoElement* marker = html->GetPseudoElement(kPseudoIdMarker);
+  PseudoElement* before = html->GetPseudoElement(kPseudoIdBefore);
+  PseudoElement* after = html->GetPseudoElement(kPseudoIdAfter);
+
+  Element* head = GetDocument().QuerySelector(AtomicString("head"));
+  Element* style = GetDocument().QuerySelector(AtomicString("style"));
+  Element* body = GetDocument().QuerySelector(AtomicString("body"));
+  Element* foo = GetDocument().QuerySelector(AtomicString("#foo"));
+
+  HeapVector<Member<Node>> preorder_traversal = {
+      root, html,  marker, before,   head,          body,   style,
+      foo,  after, vt,     vt_group, vt_image_pair, vt_old, vt_new};
+
+  HeapVector<Member<Node>> forward_traversal;
+  for (Node* cur = preorder_traversal.front(); cur;
+       cur = NodeTraversal::NextIncludingPseudo(*cur)) {
+    // Simplify the test by ignoring whitespace.
+    if (cur->IsTextNode()) {
+      continue;
+    }
+    forward_traversal.push_back(cur);
+  }
+  EXPECT_EQ(preorder_traversal, forward_traversal);
+
+  HeapVector<Member<Node>> backward_traversal;
+  for (Node* cur = preorder_traversal.back(); cur;
+       cur = NodeTraversal::PreviousIncludingPseudo(*cur)) {
+    if (cur->IsTextNode()) {
+      continue;
+    }
+    backward_traversal.push_back(cur);
+  }
+
+  preorder_traversal.Reverse();
+  EXPECT_EQ(preorder_traversal, backward_traversal);
+}
+
+// This test was added because of a crash in getAnimations. The crash would
+// occur because getAnimations attempts to sort the animations into compositing
+// order. The comparator used uses tree order in some situations which requires
+// pseudo elements to implement tree traversal methods. The crash occurred only
+// on Android, probably due to differences in the std::sort implementation.
+TEST_P(ViewTransitionTest, GetAnimationsCrashTest) {
+  SetHtmlInnerHTML(R"HTML(
+    <style>
+      #a {
+        view-transition-name: a;
+      }
+      #b {
+        view-transition-name: b;
+      }
+      #c {
+        view-transition-name: c;
+      }
+      #d {
+        view-transition-name: d;
+      }
+      #e {
+        view-transition-name: e;
+      }
+      #f {
+        view-transition-name: f;
+      }
+    </style>
+    <div id="a"></div>
+    <div id="b"></div>
+    <div id="c"></div>
+    <div id="d"></div>
+    <div id="e"></div>
+    <div id="f"></div>
+  )HTML");
+
+  UpdateAllLifecyclePhasesForTest();
+
+  V8TestingScope v8_scope;
+  ScriptState* script_state = v8_scope.GetScriptState();
+  ExceptionState& exception_state = v8_scope.GetExceptionState();
+
+  auto start_setup_lambda =
+      [](const v8::FunctionCallbackInfo<v8::Value>& info) {};
+
+  // This callback sets the elements for the start phase of the transition.
+  auto start_setup_callback =
+      v8::Function::New(v8_scope.GetContext(), start_setup_lambda, {})
+          .ToLocalChecked();
+
+  ViewTransitionSupplement::startViewTransition(
+      script_state, GetDocument(),
+      V8ViewTransitionCallback::Create(start_setup_callback), exception_state);
+  ASSERT_FALSE(exception_state.HadException());
+
+  UpdateAllLifecyclePhasesAndFinishDirectives();
+  test::RunPendingTasks();
+  UpdateAllLifecyclePhasesAndFinishDirectives();
+
+  // This test passes if getAnimations() doesn't crash while trying to sort the
+  // view-transitions animations.
+  ASSERT_GT(GetDocument().getAnimations().size(), 0ul);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
index 4398d02..60718b1 100644
--- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
+++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
@@ -450,7 +450,7 @@
     return false;
   }
 
-  output = ToCoreString(v8_string);
+  output = ToCoreString(script_state.GetIsolate(), v8_string);
   // JSON.stringify can fail to produce a string value in one of two ways: it
   // can throw an exception (as with unserializable objects), or it can return
   // `undefined` (as with e.g. passing a function). If JSON.stringify returns
@@ -3799,7 +3799,7 @@
     } else {
       // TODO(morlovich): It would probably be better to wire something more
       // precise.
-      resolver->Reject(
+      resolver->RejectWithTypeError(
           "Promise argument rejected or resolved to invalid value.");
     }
   } else if (result_config) {
diff --git a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc
index 23eaf68..dbff5ba 100644
--- a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc
+++ b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc
@@ -198,6 +198,30 @@
                        mojo::NullAssociatedRemote()) {}
 
 BroadcastChannel::BroadcastChannel(
+    base::PassKey<StorageAccessHandle>,
+    ExecutionContext* execution_context,
+    const String& name,
+    mojom::blink::BroadcastChannelProvider* provider)
+    : ActiveScriptWrappable<BroadcastChannel>({}),
+      ExecutionContextLifecycleObserver(execution_context),
+      name_(name),
+      receiver_(this, execution_context),
+      remote_client_(execution_context),
+      feature_handle_for_scheduler_(
+          execution_context->GetScheduler()->RegisterFeature(
+              SchedulingPolicy::Feature::kBroadcastChannel,
+              {SchedulingPolicy::DisableBackForwardCache()})),
+      associated_remote_(execution_context) {
+  provider->ConnectToChannel(
+      name_,
+      receiver_.BindNewEndpointAndPassRemote(
+          execution_context->GetTaskRunner(TaskType::kInternalDefault)),
+      remote_client_.BindNewEndpointAndPassReceiver(
+          execution_context->GetTaskRunner(TaskType::kInternalDefault)));
+  SetupDisconnectHandlers();
+}
+
+BroadcastChannel::BroadcastChannel(
     base::PassKey<BroadcastChannelTester>,
     ExecutionContext* execution_context,
     const String& name,
@@ -280,6 +304,10 @@
     NOTREACHED();
   }
 
+  SetupDisconnectHandlers();
+}
+
+void BroadcastChannel::SetupDisconnectHandlers() {
   receiver_.set_disconnect_handler(
       WTF::BindOnce(&BroadcastChannel::OnError, WrapWeakPersistent(this)));
   remote_client_.set_disconnect_handler(
diff --git a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h
index 45215a98..45320f0e 100644
--- a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h
+++ b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h
@@ -19,6 +19,7 @@
 
 class BroadcastChannelTester;
 class ScriptValue;
+class StorageAccessHandle;
 
 class MODULES_EXPORT BroadcastChannel final
     : public EventTarget,
@@ -34,6 +35,10 @@
                                   ExceptionState&);
 
   BroadcastChannel(ExecutionContext*, const String& name);
+  BroadcastChannel(base::PassKey<StorageAccessHandle>,
+                   ExecutionContext* execution_context,
+                   const String& name,
+                   mojom::blink::BroadcastChannelProvider* provider);
   BroadcastChannel(
       base::PassKey<BroadcastChannelTester>,
       ExecutionContext*,
@@ -79,6 +84,8 @@
       mojo::PendingAssociatedRemote<mojom::blink::BroadcastChannelClient>
           remote);
 
+  void SetupDisconnectHandlers();
+
   void PostMessageInternal(
       scoped_refptr<SerializedScriptValue> value,
       scoped_refptr<SecurityOrigin> sender_origin,
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_test.cc b/third_party/blink/renderer/modules/cache_storage/cache_test.cc
index cbac531c..39b536b 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache_test.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache_test.cc
@@ -351,6 +351,7 @@
   std::string GetRejectString(ScriptPromise& promise) {
     ScriptValue on_reject = GetRejectValue(promise);
     return ToCoreString(
+               GetIsolate(),
                on_reject.V8Value()->ToString(GetContext()).ToLocalChecked())
         .Ascii()
         .data();
@@ -366,6 +367,7 @@
   std::string GetResolveString(ScriptPromise& promise) {
     ScriptValue on_resolve = GetResolveValue(promise);
     return ToCoreString(
+               GetIsolate(),
                on_resolve.V8Value()->ToString(GetContext()).ToLocalChecked())
         .Ascii()
         .data();
diff --git a/third_party/blink/renderer/modules/encoding/text_encoder_stream.cc b/third_party/blink/renderer/modules/encoding/text_encoder_stream.cc
index cb31fbd..3c6c763 100644
--- a/third_party/blink/renderer/modules/encoding/text_encoder_stream.cc
+++ b/third_party/blink/renderer/modules/encoding/text_encoder_stream.cc
@@ -41,9 +41,10 @@
   ScriptPromise Transform(v8::Local<v8::Value> chunk,
                           TransformStreamDefaultController* controller,
                           ExceptionState& exception_state) override {
-    V8StringResource<> input_resource{chunk};
-    if (!input_resource.Prepare(script_state_->GetIsolate(), exception_state))
+    V8StringResource<> input_resource{script_state_->GetIsolate(), chunk};
+    if (!input_resource.Prepare(exception_state)) {
       return ScriptPromise();
+    }
     const String input = input_resource;
     if (input.empty())
       return ScriptPromise::CastUndefined(script_state_.Get());
diff --git a/third_party/blink/renderer/modules/imagecapture/image_capture_test.cc b/third_party/blink/renderer/modules/imagecapture/image_capture_test.cc
index fa13f62..9c1e942 100644
--- a/third_party/blink/renderer/modules/imagecapture/image_capture_test.cc
+++ b/third_party/blink/renderer/modules/imagecapture/image_capture_test.cc
@@ -85,15 +85,17 @@
 
     v8::Local<v8::Value> name =
         error_object->Get(context, V8String(isolate, "name")).ToLocalChecked();
-    name_ = ToCoreString(name->ToString(context).ToLocalChecked());
+    name_ = ToCoreString(isolate, name->ToString(context).ToLocalChecked());
     v8::Local<v8::Value> message =
         error_object->Get(context, V8String(isolate, "message"))
             .ToLocalChecked();
-    message_ = ToCoreString(message->ToString(context).ToLocalChecked());
+    message_ =
+        ToCoreString(isolate, message->ToString(context).ToLocalChecked());
     v8::Local<v8::Value> constraint =
         error_object->Get(context, V8String(isolate, "constraint"))
             .ToLocalChecked();
-    constraint_ = ToCoreString(constraint->ToString(context).ToLocalChecked());
+    constraint_ =
+        ToCoreString(isolate, constraint->ToString(context).ToLocalChecked());
 
     return ScriptValue();
   }
diff --git a/third_party/blink/renderer/modules/payments/payment_event_data_conversion_test.cc b/third_party/blink/renderer/modules/payments/payment_event_data_conversion_test.cc
index 2ea3950..727b7748 100644
--- a/third_party/blink/renderer/modules/payments/payment_event_data_conversion_test.cc
+++ b/third_party/blink/renderer/modules/payments/payment_event_data_conversion_test.cc
@@ -107,6 +107,7 @@
   ASSERT_TRUE(data->methodData().front()->hasData());
   ASSERT_TRUE(data->methodData().front()->data().IsObject());
   String stringified_data = ToBlinkString<String>(
+      scope.GetIsolate(),
       v8::JSON::Stringify(
           scope.GetContext(),
           data->methodData().front()->data().V8Value().As<v8::Object>())
@@ -139,6 +140,7 @@
   ASSERT_TRUE(data->methodData().front()->hasData());
   ASSERT_TRUE(data->methodData().front()->data().IsObject());
   String stringified_data = ToBlinkString<String>(
+      scope.GetIsolate(),
       v8::JSON::Stringify(
           scope.GetContext(),
           data->methodData().front()->data().V8Value().As<v8::Object>())
diff --git a/third_party/blink/renderer/modules/payments/payment_request_for_invalid_origin_or_ssl_test.cc b/third_party/blink/renderer/modules/payments/payment_request_for_invalid_origin_or_ssl_test.cc
index 5b1902e..628557a 100644
--- a/third_party/blink/renderer/modules/payments/payment_request_for_invalid_origin_or_ssl_test.cc
+++ b/third_party/blink/renderer/modules/payments/payment_request_for_invalid_origin_or_ssl_test.cc
@@ -85,7 +85,8 @@
   std::string GetRejectString(ScriptState* script_state,
                               ScriptPromise& promise) {
     ScriptValue on_reject = GetRejectValue(script_state, promise);
-    return ToCoreString(on_reject.V8Value()
+    return ToCoreString(script_state->GetIsolate(),
+                        on_reject.V8Value()
                             ->ToString(script_state->GetContext())
                             .ToLocalChecked())
         .Ascii()
diff --git a/third_party/blink/renderer/modules/payments/payment_request_respond_with_observer.cc b/third_party/blink/renderer/modules/payments/payment_request_respond_with_observer.cc
index 78e02c50..322c78e 100644
--- a/third_party/blink/renderer/modules/payments/payment_request_respond_with_observer.cc
+++ b/third_party/blink/renderer/modules/payments/payment_request_respond_with_observer.cc
@@ -107,7 +107,7 @@
     return;
   }
 
-  String details = ToCoreString(details_value);
+  String details = ToCoreString(script_state->GetIsolate(), details_value);
   DCHECK(!details.empty());
 
   String payer_name = response->hasPayerName() ? response->payerName() : "";
diff --git a/third_party/blink/renderer/modules/payments/payment_response_test.cc b/third_party/blink/renderer/modules/payments/payment_response_test.cc
index 684324f1..66646a2 100644
--- a/third_party/blink/renderer/modules/payments/payment_response_test.cc
+++ b/third_party/blink/renderer/modules/payments/payment_response_test.cc
@@ -190,6 +190,7 @@
   ASSERT_TRUE(details.V8Value()->IsObject());
 
   String stringified_details = ToBlinkString<String>(
+      scope.GetIsolate(),
       v8::JSON::Stringify(scope.GetContext(),
                           details.V8Value().As<v8::Object>())
           .ToLocalChecked(),
@@ -277,6 +278,7 @@
   EXPECT_TRUE(json_object.IsObject());
 
   String json_string = ToBlinkString<String>(
+      scope.GetIsolate(),
       v8::JSON::Stringify(scope.GetContext(),
                           json_object.V8Value().As<v8::Object>())
           .ToLocalChecked(),
diff --git a/third_party/blink/renderer/modules/payments/payments_validators.cc b/third_party/blink/renderer/modules/payments/payments_validators.cc
index 478552a..b71ce3b5 100644
--- a/third_party/blink/renderer/modules/payments/payments_validators.cc
+++ b/third_party/blink/renderer/modules/payments/payments_validators.cc
@@ -184,7 +184,7 @@
     return;
   }
 
-  output = ToBlinkString<String>(value, kDoNotExternalize);
+  output = ToBlinkString<String>(isolate, value, kDoNotExternalize);
 
   // Implementation defined constant controlling the allowed JSON length.
   static constexpr size_t kMaxJSONStringLength = 1024 * 1024;
diff --git a/third_party/blink/renderer/modules/payments/update_payment_details_function.cc b/third_party/blink/renderer/modules/payments/update_payment_details_function.cc
index 5e35a44..7e213ba 100644
--- a/third_party/blink/renderer/modules/payments/update_payment_details_function.cc
+++ b/third_party/blink/renderer/modules/payments/update_payment_details_function.cc
@@ -31,10 +31,10 @@
       delegate_->OnUpdatePaymentDetails(value);
       break;
     case ResolveType::kReject:
-      delegate_->OnUpdatePaymentDetailsFailure(
-          ToCoreString(value.V8Value()
-                           ->ToString(script_state->GetContext())
-                           .ToLocalChecked()));
+      delegate_->OnUpdatePaymentDetailsFailure(ToCoreString(
+          script_state->GetIsolate(), value.V8Value()
+                                          ->ToString(script_state->GetContext())
+                                          .ToLocalChecked()));
       break;
   }
   delegate_ = nullptr;
diff --git a/third_party/blink/renderer/modules/push_messaging/push_subscription_test.cc b/third_party/blink/renderer/modules/push_messaging/push_subscription_test.cc
index 533304b8a..b318b5f5 100644
--- a/third_party/blink/renderer/modules/push_messaging/push_subscription_test.cc
+++ b/third_party/blink/renderer/modules/push_messaging/push_subscription_test.cc
@@ -43,6 +43,7 @@
   EXPECT_TRUE(json_object.IsObject());
 
   String json_string = ToBlinkString<String>(
+      v8_testing_scope.GetIsolate(),
       v8::JSON::Stringify(v8_testing_scope.GetContext(),
                           json_object.V8Value().As<v8::Object>())
           .ToLocalChecked(),
diff --git a/third_party/blink/renderer/modules/remote_objects/remote_object.cc b/third_party/blink/renderer/modules/remote_objects/remote_object.cc
index 68d89aae..cad632b 100644
--- a/third_party/blink/renderer/modules/remote_objects/remote_object.cc
+++ b/third_party/blink/renderer/modules/remote_objects/remote_object.cc
@@ -77,7 +77,7 @@
 
   if (js_value->IsString()) {
     return mojom::blink::RemoteInvocationArgument::NewStringValue(
-        ToCoreString(js_value.As<v8::String>()));
+        ToCoreString(isolate, js_value.As<v8::String>()));
   }
 
   if (js_value->IsNull()) {
@@ -332,7 +332,7 @@
     return;
   }
 
-  String method_name = ToCoreString(info.Data().As<v8::String>());
+  String method_name = ToCoreString(isolate, info.Data().As<v8::String>());
 
   v8::Local<v8::Object> method_cache = GetMethodCache(
       isolate, remote_object->GetWrapper(isolate).ToLocalChecked());
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_container_test.cc b/third_party/blink/renderer/modules/service_worker/service_worker_container_test.cc
index 1235380..2848b6dda 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_container_test.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_container_test.cc
@@ -146,9 +146,10 @@
             .ToLocalChecked();
 
     EXPECT_EQ("TypeError",
-              ToCoreString(name->ToString(context).ToLocalChecked()));
-    EXPECT_EQ(expected_message_,
-              ToCoreString(message->ToString(context).ToLocalChecked()));
+              ToCoreString(isolate, name->ToString(context).ToLocalChecked()));
+    EXPECT_EQ(
+        expected_message_,
+        ToCoreString(isolate, message->ToString(context).ToLocalChecked()));
   }
 
  private:
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
index b3624fc..848ede94 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
@@ -2594,7 +2594,8 @@
     if (try_catch.Message().IsEmpty() || try_catch.Message()->Get().IsEmpty()) {
       exception_string = "Unknown exception while executing script.";
     } else {
-      exception_string = ToCoreStringWithNullCheck(try_catch.Message()->Get());
+      exception_string =
+          ToCoreStringWithNullCheck(isolate, try_catch.Message()->Get());
     }
     std::move(callback).Run(base::Value(), std::move(exception_string));
     return;
diff --git a/third_party/blink/renderer/modules/storage_access/BUILD.gn b/third_party/blink/renderer/modules/storage_access/BUILD.gn
index 9d5b9fd5..94ac832c 100644
--- a/third_party/blink/renderer/modules/storage_access/BUILD.gn
+++ b/third_party/blink/renderer/modules/storage_access/BUILD.gn
@@ -13,6 +13,7 @@
   ]
 
   deps = [
+    "//third_party/blink/renderer/modules/broadcastchannel",
     "//third_party/blink/renderer/modules/cache_storage",
     "//third_party/blink/renderer/modules/file_system_access",
     "//third_party/blink/renderer/modules/indexeddb",
diff --git a/third_party/blink/renderer/modules/storage_access/storage_access_handle.cc b/third_party/blink/renderer/modules/storage_access/storage_access_handle.cc
index 82c0335b..cf19c2e 100644
--- a/third_party/blink/renderer/modules/storage_access/storage_access_handle.cc
+++ b/third_party/blink/renderer/modules/storage_access/storage_access_handle.cc
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/core/fileapi/blob.h"
 #include "third_party/blink/renderer/core/frame/navigator.h"
 #include "third_party/blink/renderer/core/frame/settings.h"
+#include "third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h"
 #include "third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.h"
 #include "third_party/blink/renderer/modules/storage/storage_controller.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
@@ -62,6 +63,11 @@
     "The revokeObjectURL function for Blob Stoage was not requested when "
     "storage access handle was initialized.";
 
+// static
+const char StorageAccessHandle::kBroadcastChannelNotRequested[] =
+    "Broadcast Channel was not requested when storage access handle was "
+    "initialized.";
+
 namespace {
 
 void EstimateImplAfterRemoteEstimate(ScriptPromiseResolver* resolver,
@@ -95,7 +101,8 @@
     const StorageAccessTypes* storage_access_types)
     : Supplement<LocalDOMWindow>(window),
       storage_access_types_(storage_access_types),
-      remote_(window.GetExecutionContext()) {
+      remote_(window.GetExecutionContext()),
+      broadcast_channel_(window.GetExecutionContext()) {
   window.CountUse(
       WebFeature::kStorageAccessAPI_requestStorageAccess_BeyondCookies);
   if (storage_access_types_->all()) {
@@ -146,6 +153,11 @@
         WebFeature::
             kStorageAccessAPI_requestStorageAccess_BeyondCookies_revokeObjectURL);
   }
+  if (storage_access_types_->broadcastChannel()) {
+    window.CountUse(
+        WebFeature::
+            kStorageAccessAPI_requestStorageAccess_BeyondCookies_BroadcastChannel);
+  }
   if (storage_access_types_->all() || storage_access_types_->sessionStorage()) {
     InitSessionStorage();
   }
@@ -172,6 +184,10 @@
       storage_access_types_->revokeObjectURL()) {
     InitBlobStorage();
   }
+  if (storage_access_types_->all() ||
+      storage_access_types_->broadcastChannel()) {
+    InitBroadcastChannel();
+  }
 }
 
 void StorageAccessHandle::Trace(Visitor* visitor) const {
@@ -183,6 +199,7 @@
   visitor->Trace(locks_);
   visitor->Trace(caches_);
   visitor->Trace(blob_storage_);
+  visitor->Trace(broadcast_channel_);
   ScriptWrappable::Trace(visitor);
   Supplement<LocalDOMWindow>::Trace(visitor);
 }
@@ -359,6 +376,22 @@
   blob_storage_->Revoke(resolved_url);
 }
 
+BroadcastChannel* StorageAccessHandle::BroadcastChannel(
+    ExecutionContext* execution_context,
+    const String& name,
+    ExceptionState& exception_state) const {
+  if (!storage_access_types_->all() &&
+      !storage_access_types_->broadcastChannel()) {
+    exception_state.ThrowSecurityError(kBroadcastChannelNotRequested);
+    return nullptr;
+  }
+  GetSupplementable()->CountUse(
+      WebFeature::
+          kStorageAccessAPI_requestStorageAccess_BeyondCookies_BroadcastChannel_Use);
+  return MakeGarbageCollected<blink::BroadcastChannel>(
+      PassKey(), execution_context, name, broadcast_channel_.get());
+}
+
 void StorageAccessHandle::InitSessionStorage() {
   LocalDOMWindow* window = GetSupplementable();
   if (!window->GetSecurityOrigin()->CanAccessSessionStorage()) {
@@ -484,4 +517,17 @@
       std::move(blob_storage_remote));
 }
 
+void StorageAccessHandle::InitBroadcastChannel() {
+  if (GetSupplementable()->GetSecurityOrigin()->IsOpaque()) {
+    return;
+  }
+  if (!InitRemote()) {
+    return;
+  }
+  remote_->BindBroadcastChannel(
+      broadcast_channel_.BindNewEndpointAndPassReceiver(
+          GetSupplementable()->GetExecutionContext()->GetTaskRunner(
+              TaskType::kInternalDefault)));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/storage_access/storage_access_handle.h b/third_party/blink/renderer/modules/storage_access/storage_access_handle.h
index 04648773..d6a36d0 100644
--- a/third_party/blink/renderer/modules/storage_access/storage_access_handle.h
+++ b/third_party/blink/renderer/modules/storage_access/storage_access_handle.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_STORAGE_ACCESS_STORAGE_ACCESS_HANDLE_H_
 
 #include "mojo/public/cpp/bindings/pending_remote.h"
+#include "third_party/blink/public/mojom/broadcastchannel/broadcast_channel.mojom-blink.h"
 #include "third_party/blink/public/mojom/storage_access/storage_access_handle.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_storage_access_types.h"
 #include "third_party/blink/renderer/core/fileapi/public_url_manager.h"
@@ -23,6 +24,7 @@
 namespace blink {
 
 class Blob;
+class BroadcastChannel;
 class ExceptionState;
 
 class MODULES_EXPORT StorageAccessHandle final
@@ -41,6 +43,7 @@
   static const char kEstimateNotRequested[];
   static const char kCreateObjectURLNotRequested[];
   static const char kRevokeObjectURLNotRequested[];
+  static const char kBroadcastChannelNotRequested[];
 
   explicit StorageAccessHandle(LocalDOMWindow& window,
                                const StorageAccessTypes* storage_access_types);
@@ -58,6 +61,9 @@
   String createObjectURL(Blob* blob, ExceptionState& exception_state) const;
   void revokeObjectURL(const String& url,
                        ExceptionState& exception_state) const;
+  BroadcastChannel* BroadcastChannel(ExecutionContext* execution_context,
+                                     const String& name,
+                                     ExceptionState& exception_state) const;
 
  private:
   void InitSessionStorage();
@@ -69,6 +75,7 @@
   void InitGetDirectory();
   void InitQuota();
   void InitBlobStorage();
+  void InitBroadcastChannel();
 
   void GetDirectoryImpl(ScriptPromiseResolver* resolver) const;
 
@@ -80,6 +87,8 @@
   Member<LockManager> locks_;
   Member<CacheStorage> caches_;
   Member<PublicURLManager> blob_storage_;
+  HeapMojoAssociatedRemote<mojom::blink::BroadcastChannelProvider>
+      broadcast_channel_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/storage_access/storage_access_handle.idl b/third_party/blink/renderer/modules/storage_access/storage_access_handle.idl
index 8f6fae6..6690cd48 100644
--- a/third_party/blink/renderer/modules/storage_access/storage_access_handle.idl
+++ b/third_party/blink/renderer/modules/storage_access/storage_access_handle.idl
@@ -13,6 +13,6 @@
     [CallWith=ScriptState, LogActivity, RaisesException] Promise<StorageEstimate> estimate();
     [LogActivity, RaisesException] DOMString createObjectURL(Blob blob);
     [LogActivity, RaisesException] void revokeObjectURL(DOMString url);
-    // TODO(crbug.com/1484966): Add broadcast channel
+    [CallWith=ExecutionContext, LogActivity, RaisesException] BroadcastChannel BroadcastChannel(DOMString name);
     // TODO(crbug.com/1484966): Add shared worker
 };
\ No newline at end of file
diff --git a/third_party/blink/renderer/modules/storage_access/storage_access_handle_test.cc b/third_party/blink/renderer/modules/storage_access/storage_access_handle_test.cc
index e55e778..b6af595c 100644
--- a/third_party/blink/renderer/modules/storage_access/storage_access_handle_test.cc
+++ b/third_party/blink/renderer/modules/storage_access/storage_access_handle_test.cc
@@ -17,17 +17,21 @@
 
 namespace blink {
 
-class StorageAccessHandleTest
-    : public testing::TestWithParam<testing::tuple<bool,
-                                                   bool,
-                                                   bool,
-                                                   bool,
-                                                   bool,
-                                                   bool,
-                                                   bool,
-                                                   bool,
-                                                   bool,
-                                                   bool>> {
+namespace {
+
+using TestParams = std::
+    tuple<bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool>;
+
+template <size_t N>
+TestParams MakeParamsWithSetBit() {
+  TestParams params;
+  std::get<N>(params) = true;
+  return params;
+}
+
+}  // namespace
+
+class StorageAccessHandleTest : public testing::TestWithParam<TestParams> {
  public:
   bool all() { return std::get<0>(GetParam()); }
   bool sessionStorage() { return std::get<1>(GetParam()); }
@@ -39,6 +43,7 @@
   bool estimate() { return std::get<7>(GetParam()); }
   bool createObjectURL() { return std::get<8>(GetParam()); }
   bool revokeObjectURL() { return std::get<9>(GetParam()); }
+  bool BroadcastChannel() { return std::get<10>(GetParam()); }
 
   LocalDOMWindow* getLocalDOMWindow() {
     test::ScopedMockedURLLoad scoped_mocked_url_load_root(
@@ -68,6 +73,7 @@
   storage_access_types->setEstimate(estimate());
   storage_access_types->setCreateObjectURL(createObjectURL());
   storage_access_types->setRevokeObjectURL(revokeObjectURL());
+  storage_access_types->setBroadcastChannel(BroadcastChannel());
   StorageAccessHandle* storage_access_handle =
       MakeGarbageCollected<StorageAccessHandle>(*window, storage_access_types);
   EXPECT_TRUE(window->document()->IsUseCounted(
@@ -120,6 +126,11 @@
           WebFeature::
               kStorageAccessAPI_requestStorageAccess_BeyondCookies_revokeObjectURL),
       revokeObjectURL());
+  EXPECT_EQ(
+      window->document()->IsUseCounted(
+          WebFeature::
+              kStorageAccessAPI_requestStorageAccess_BeyondCookies_BroadcastChannel),
+      BroadcastChannel());
   EXPECT_FALSE(window->document()->IsUseCounted(
       WebFeature::
           kStorageAccessAPI_requestStorageAccess_BeyondCookies_sessionStorage_Use));
@@ -147,6 +158,9 @@
   EXPECT_FALSE(window->document()->IsUseCounted(
       WebFeature::
           kStorageAccessAPI_requestStorageAccess_BeyondCookies_revokeObjectURL_Use));
+  EXPECT_FALSE(window->document()->IsUseCounted(
+      WebFeature::
+          kStorageAccessAPI_requestStorageAccess_BeyondCookies_BroadcastChannel_Use));
   {
     V8TestingScope scope;
     storage_access_handle->sessionStorage(scope.GetExceptionState());
@@ -258,6 +272,18 @@
                   ? nullptr
                   : StorageAccessHandle::kRevokeObjectURLNotRequested);
   }
+  {
+    V8TestingScope scope;
+    storage_access_handle->BroadcastChannel(scope.GetExecutionContext(), "",
+                                            scope.GetExceptionState());
+    EXPECT_EQ(scope.GetExceptionState().CodeAs<DOMExceptionCode>(),
+              (all() || BroadcastChannel()) ? DOMExceptionCode::kNoError
+                                            : DOMExceptionCode::kSecurityError);
+    EXPECT_EQ(scope.GetExceptionState().Message(),
+              (all() || BroadcastChannel())
+                  ? nullptr
+                  : StorageAccessHandle::kBroadcastChannelNotRequested);
+  }
   EXPECT_EQ(
       window->document()->IsUseCounted(
           WebFeature::
@@ -303,44 +329,42 @@
           WebFeature::
               kStorageAccessAPI_requestStorageAccess_BeyondCookies_revokeObjectURL_Use),
       all() || revokeObjectURL());
+  EXPECT_EQ(
+      window->document()->IsUseCounted(
+          WebFeature::
+              kStorageAccessAPI_requestStorageAccess_BeyondCookies_BroadcastChannel_Use),
+      all() || BroadcastChannel());
 }
 
 // Test all handles.
 INSTANTIATE_TEST_SUITE_P(
     /*no prefix*/,
     StorageAccessHandleTest,
-    testing::ValuesIn(std::vector<std::tuple<bool,
-                                             bool,
-                                             bool,
-                                             bool,
-                                             bool,
-                                             bool,
-                                             bool,
-                                             bool,
-                                             bool,
-                                             bool>>{
+    testing::ValuesIn(std::vector<TestParams>{
         // Nothing:
-        {false, false, false, false, false, false, false, false, false, false},
+        TestParams(),
         // All:
-        {true, false, false, false, false, false, false, false, false, false},
+        MakeParamsWithSetBit<0>(),
         // Session Storage:
-        {false, true, false, false, false, false, false, false, false, false},
+        MakeParamsWithSetBit<1>(),
         // Local Storage:
-        {false, false, true, false, false, false, false, false, false, false},
+        MakeParamsWithSetBit<2>(),
         // IndexedDB:
-        {false, false, false, true, false, false, false, false, false, false},
+        MakeParamsWithSetBit<3>(),
         // Web Locks:
-        {false, false, false, false, true, false, false, false, false, false},
+        MakeParamsWithSetBit<4>(),
         // Cache Storage:
-        {false, false, false, false, false, true, false, false, false, false},
+        MakeParamsWithSetBit<5>(),
         // Origin Private File System:
-        {false, false, false, false, false, false, true, false, false, false},
+        MakeParamsWithSetBit<6>(),
         // Quota:
-        {false, false, false, false, false, false, false, true, false, false},
+        MakeParamsWithSetBit<7>(),
         // createObjectURL:
-        {false, false, false, false, false, false, false, false, true, false},
+        MakeParamsWithSetBit<8>(),
         // revokeObjectURL:
-        {false, false, false, false, false, false, false, false, false, true},
+        MakeParamsWithSetBit<9>(),
+        // BroadcastChannel:
+        MakeParamsWithSetBit<10>(),
     }));
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/storage_access/storage_access_types.idl b/third_party/blink/renderer/modules/storage_access/storage_access_types.idl
index 78c69ade..97d2adbb 100644
--- a/third_party/blink/renderer/modules/storage_access/storage_access_types.idl
+++ b/third_party/blink/renderer/modules/storage_access/storage_access_types.idl
@@ -13,6 +13,6 @@
     boolean estimate = false;
     boolean createObjectURL = false;
     boolean revokeObjectURL = false;
-    // TODO(crbug.com/1484966): Add broadcast channel
+    boolean BroadcastChannel = false;
     // TODO(crbug.com/1484966): Add shared worker
 };
diff --git a/third_party/blink/renderer/modules/webtransport/web_transport_error_test.cc b/third_party/blink/renderer/modules/webtransport/web_transport_error_test.cc
index da7620ef..bef3d29 100644
--- a/third_party/blink/renderer/modules/webtransport/web_transport_error_test.cc
+++ b/third_party/blink/renderer/modules/webtransport/web_transport_error_test.cc
@@ -55,7 +55,7 @@
   // Explicitly convert it to a string just in case.
   v8::Local<v8::String> stack_as_v8string;
   ASSERT_TRUE(stack->ToString(context).ToLocal(&stack_as_v8string));
-  String stack_string = ToCoreString(stack_as_v8string);
+  String stack_string = ToCoreString(isolate, stack_as_v8string);
   EXPECT_TRUE(stack_string.Contains("badness"));
 
   WebTransportError* error = V8WebTransportError::ToWrappable(isolate, v8value);
diff --git a/third_party/blink/renderer/modules/webtransport/web_transport_test.cc b/third_party/blink/renderer/modules/webtransport/web_transport_test.cc
index 6f83758..da7ecdd 100644
--- a/third_party/blink/renderer/modules/webtransport/web_transport_test.cc
+++ b/third_party/blink/renderer/modules/webtransport/web_transport_test.cc
@@ -1035,7 +1035,8 @@
                ->Get(script_state->GetContext(),
                      V8AtomicString(script_state->GetIsolate(), key))
                .ToLocal(&actual) &&
-           ToCoreStringWithUndefinedOrNullCheck(actual) == value;
+           ToCoreStringWithUndefinedOrNullCheck(script_state->GetIsolate(),
+                                                actual) == value;
   };
 
   return Has("name", "RangeError") && Has("message", message);
diff --git a/third_party/blink/renderer/platform/bindings/source_location.cc b/third_party/blink/renderer/platform/bindings/source_location.cc
index d515e85..d6f8a65 100644
--- a/third_party/blink/renderer/platform/bindings/source_location.cc
+++ b/third_party/blink/renderer/platform/bindings/source_location.cc
@@ -51,7 +51,7 @@
 // static
 std::unique_ptr<v8_inspector::V8StackTrace>
 SourceLocation::CaptureStackTraceInternal(bool full) {
-  v8::Isolate* isolate = v8::Isolate::GetCurrent();
+  v8::Isolate* isolate = v8::Isolate::TryGetCurrent();
   ThreadDebugger* debugger = ThreadDebugger::From(isolate);
   if (!debugger || !isolate->InContext())
     return nullptr;
@@ -217,12 +217,13 @@
 }
 
 std::unique_ptr<SourceLocation> CaptureSourceLocation(
+    v8::Isolate* isolate,
     v8::Local<v8::Function> function) {
   if (!function.IsEmpty())
     return std::make_unique<SourceLocation>(
         ToCoreStringWithUndefinedOrNullCheck(
-            function->GetScriptOrigin().ResourceName()),
-        ToCoreStringWithUndefinedOrNullCheck(function->GetName()),
+            isolate, function->GetScriptOrigin().ResourceName()),
+        ToCoreStringWithUndefinedOrNullCheck(isolate, function->GetName()),
         function->GetScriptLineNumber() + 1,
         function->GetScriptColumnNumber() + 1, nullptr, function->ScriptId());
   return std::make_unique<SourceLocation>(String(), String(), 0, 0, nullptr, 0);
diff --git a/third_party/blink/renderer/platform/bindings/source_location.h b/third_party/blink/renderer/platform/bindings/source_location.h
index eefd10f..c861df84 100644
--- a/third_party/blink/renderer/platform/bindings/source_location.h
+++ b/third_party/blink/renderer/platform/bindings/source_location.h
@@ -115,6 +115,7 @@
 
 // Captures current stack trace from function.
 PLATFORM_EXPORT std::unique_ptr<SourceLocation> CaptureSourceLocation(
+    v8::Isolate* isolate,
     v8::Local<v8::Function>);
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/bindings/to_blink_string.cc b/third_party/blink/renderer/platform/bindings/to_blink_string.cc
index 4de6efb..5afae8c 100644
--- a/third_party/blink/renderer/platform/bindings/to_blink_string.cc
+++ b/third_party/blink/renderer/platform/bindings/to_blink_string.cc
@@ -180,7 +180,9 @@
 }  // namespace
 
 template <typename StringType>
-StringType ToBlinkString(v8::Local<v8::String> v8_string, ExternalMode mode) {
+StringType ToBlinkString(v8::Isolate* isolate,
+                         v8::Local<v8::String> v8_string,
+                         ExternalMode mode) {
   // Be very careful in this code to ensure it is RVO friendly. Accidentally
   // breaking RVO will degrade some of the blink_perf benchmarks by a few
   // percent. This includes moving the StringTraits<>::FromStringResource() call
@@ -203,21 +205,23 @@
   // calls will recreate the string.
   bool was_externalized;
   const bool is_one_byte = v8_string->IsOneByte();
-  // TODO(ajwong): Avoid v8::Isolate::GetCurrent() call.
   return ConvertAndExternalizeString<StringType>(
-      v8::Isolate::GetCurrent(), v8_string,
-      CanExternalize(v8_string, mode, is_one_byte), is_one_byte,
-      &was_externalized);
+      isolate, v8_string, CanExternalize(v8_string, mode, is_one_byte),
+      is_one_byte, &was_externalized);
 }
 
 // Explicitly instantiate the above template with the expected
 // parameterizations, to ensure the compiler generates the code; otherwise link
 // errors can result in GCC 4.4.
-template String ToBlinkString<String>(v8::Local<v8::String>, ExternalMode);
-template AtomicString ToBlinkString<AtomicString>(v8::Local<v8::String>,
+template String ToBlinkString<String>(v8::Isolate* isolate,
+                                      v8::Local<v8::String>,
+                                      ExternalMode);
+template AtomicString ToBlinkString<AtomicString>(v8::Isolate* isolate,
+                                                  v8::Local<v8::String>,
                                                   ExternalMode);
 
-StringView ToBlinkStringView(v8::Local<v8::String> v8_string,
+StringView ToBlinkStringView(v8::Isolate* isolate,
+                             v8::Local<v8::String> v8_string,
                              StringView::StackBackingStore& backing_store,
                              ExternalMode mode) {
   // Be very careful in this code to ensure it is RVO friendly. Accidentally
@@ -238,13 +242,8 @@
   // there is no attempt to create either an AtomicString or an String. This
   // can very likely avoid a heap allocation and definitely avoids refcount
   // churn which can be significantly faster in some hot paths.
-  //
-  // TODO(ajwong): Pass in isolate to avoid extra TLS lookups? Especially with
-  // small identifiers on 64-bit platforms, externalizations are less frequent
-  // so this path is hotter.
   const bool is_one_byte = v8_string->IsOneByte();
   bool can_externalize = CanExternalize(v8_string, mode, is_one_byte);
-  v8::Isolate* isolate = v8::Isolate::GetCurrent();
   if (LIKELY(can_externalize)) {
     bool was_externalized;
     // An AtomicString is always used here for externalization. Using a String
diff --git a/third_party/blink/renderer/platform/bindings/to_blink_string.h b/third_party/blink/renderer/platform/bindings/to_blink_string.h
index cc3c196..9e4d467 100644
--- a/third_party/blink/renderer/platform/bindings/to_blink_string.h
+++ b/third_party/blink/renderer/platform/bindings/to_blink_string.h
@@ -15,7 +15,9 @@
 enum ExternalMode { kExternalize, kDoNotExternalize };
 
 template <typename StringType>
-PLATFORM_EXPORT StringType ToBlinkString(v8::Local<v8::String>, ExternalMode);
+PLATFORM_EXPORT StringType ToBlinkString(v8::Isolate* isolate,
+                                         v8::Local<v8::String>,
+                                         ExternalMode);
 
 PLATFORM_EXPORT String ToBlinkString(int value);
 
@@ -28,7 +30,8 @@
 // The returned StringView is guaranteed to be valid as long as `backing_store`
 // and `v8_string` are alive.
 PLATFORM_EXPORT StringView
-ToBlinkStringView(v8::Local<v8::String> v8_string,
+ToBlinkStringView(v8::Isolate* isolate,
+                  v8::Local<v8::String> v8_string,
                   StringView::StackBackingStore& backing_store,
                   ExternalMode external);
 
diff --git a/third_party/blink/renderer/platform/bindings/v8_binding.cc b/third_party/blink/renderer/platform/bindings/v8_binding.cc
index 73e52af..d48481d 100644
--- a/third_party/blink/renderer/platform/bindings/v8_binding.cc
+++ b/third_party/blink/renderer/platform/bindings/v8_binding.cc
@@ -58,16 +58,16 @@
 
   v8::Local<v8::String> script_name =
       v8::StackTrace::CurrentScriptNameOrSourceURL(isolate);
-  return ToCoreStringWithNullCheck(script_name);
+  return ToCoreStringWithNullCheck(isolate, script_name);
 }
 
 Vector<String> GetScriptUrlsFromCurrentStack(v8::Isolate* isolate,
                                              wtf_size_t unique_url_count) {
   Vector<String> unique_urls;
 
-  DCHECK(isolate);
-  if (!isolate->InContext())
+  if (!isolate || !isolate->InContext()) {
     return unique_urls;
+  }
 
   // CurrentStackTrace is 10x faster than CaptureStackTrace if all that you
   // need is the url of the script at the top of the stack. See
@@ -83,7 +83,7 @@
     v8::Local<v8::String> script_name = frame->GetScriptName();
     if (script_name.IsEmpty() || !script_name->Length())
       continue;
-    String url = ToCoreString(script_name);
+    String url = ToCoreString(isolate, script_name);
     if (!unique_urls.Contains(url)) {
       unique_urls.push_back(std::move(url));
     }
diff --git a/third_party/blink/renderer/platform/bindings/v8_binding.h b/third_party/blink/renderer/platform/bindings/v8_binding.h
index 92d19ff..f35d41b 100644
--- a/third_party/blink/renderer/platform/bindings/v8_binding.h
+++ b/third_party/blink/renderer/platform/bindings/v8_binding.h
@@ -188,45 +188,51 @@
 // Convert v8::String to a WTF::String. If the V8 string is not already
 // an external string then it is transformed into an external string at this
 // point to avoid repeated conversions.
-inline String ToCoreString(v8::Local<v8::String> value) {
-  return ToBlinkString<String>(value, kExternalize);
+inline String ToCoreString(v8::Isolate* isolate, v8::Local<v8::String> value) {
+  return ToBlinkString<String>(isolate, value, kExternalize);
 }
 
-inline String ToCoreStringWithNullCheck(v8::Local<v8::String> value) {
+inline String ToCoreStringWithNullCheck(v8::Isolate* isolate,
+                                        v8::Local<v8::String> value) {
   if (value.IsEmpty() || value->IsNull())
     return String();
-  return ToCoreString(value);
+  return ToCoreString(isolate, value);
 }
 
 inline String ToCoreStringWithUndefinedOrNullCheck(
+    v8::Isolate* isolate,
     v8::Local<v8::String> value) {
   if (value.IsEmpty())
     return String();
-  return ToCoreString(value);
+  return ToCoreString(isolate, value);
 }
 
-inline AtomicString ToCoreAtomicString(v8::Local<v8::String> value) {
-  return ToBlinkString<AtomicString>(value, kExternalize);
+inline AtomicString ToCoreAtomicString(v8::Isolate* isolate,
+                                       v8::Local<v8::String> value) {
+  return ToBlinkString<AtomicString>(isolate, value, kExternalize);
 }
 
-inline AtomicString ToCoreAtomicString(v8::Local<v8::Name> value) {
+inline AtomicString ToCoreAtomicString(v8::Isolate* isolate,
+                                       v8::Local<v8::Name> value) {
   DCHECK(!value.IsEmpty());
   // TODO(crbug.com/1476064): Support converting `value` when it is a symbol
   // instead of a string.
   if (!value->IsString()) {
     return AtomicString();
   }
-  return ToBlinkString<AtomicString>(value.As<v8::String>(), kExternalize);
+  return ToBlinkString<AtomicString>(isolate, value.As<v8::String>(),
+                                     kExternalize);
 }
 
 // This method will return a null String if the v8::Value does not contain a
 // v8::String.  It will not call ToString() on the v8::Value. If you want
 // ToString() to be called, please use the TONATIVE_FOR_V8STRINGRESOURCE_*()
 // macros instead.
-inline String ToCoreStringWithUndefinedOrNullCheck(v8::Local<v8::Value> value) {
+inline String ToCoreStringWithUndefinedOrNullCheck(v8::Isolate* isolate,
+                                                   v8::Local<v8::Value> value) {
   if (value.IsEmpty() || !value->IsString())
     return String();
-  return ToCoreString(value.As<v8::String>());
+  return ToCoreString(isolate, value.As<v8::String>());
 }
 
 // Convert a string to a V8 string.
diff --git a/third_party/blink/renderer/platform/blob/OWNERS b/third_party/blink/renderer/platform/blob/OWNERS
index dbfc201..0afd48a 100644
--- a/third_party/blink/renderer/platform/blob/OWNERS
+++ b/third_party/blink/renderer/platform/blob/OWNERS
@@ -1,4 +1,4 @@
-file://storage/OWNERS
+file://storage/browser/blob/OWNERS
 
 per-file *_mojom_traits*.*=set noparent
 per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 49da2b45..84f06fd0 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1964,10 +1964,6 @@
       status: "experimental",
     },
     {
-      name: "HighlightOverlayPainting",
-      status: "stable",
-    },
-    {
       name: "HighlightPointerEvents",
       base_feature: "none",
     },
@@ -2180,12 +2176,6 @@
       base_feature: "none",
     },
     {
-      name: "LazyFrameLoading",
-      public: true,
-      status: "stable",
-      base_feature: "none",
-    },
-    {
       name: "LazyInitializeMediaControls",
       base_feature: "none",
       public: true,
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 92cec56..7b2e9d9 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -5496,8 +5496,6 @@
 crbug.com/1314514 [ Win ] css3/blending/background-blend-mode-crossfade-image-gradient.html [ Failure Pass ]
 crbug.com/1314514 [ Win ] css3/blending/background-blend-mode-gradient-color.html [ Failure Pass ]
 
-# HighlightOverlayPainting: decoration painting hasn’t landed yet.
-
 crbug.com/1316341 virtual/fenced-frame-mparch/external/wpt/fenced-frame/script-focus.https.html [ Failure Pass Timeout ]
 
 # Sheriff 2022-04-18, failing on Mac and WebKit Win10 builders.
@@ -7531,3 +7529,6 @@
 
 # Gardener 2023-11-10
 crbug.com/1486131 [ Debug Linux ] external/wpt/html/browsers/history/the-history-interface/001.html [ Failure Pass ]
+
+# Gardener 2023-11-10
+crbug.com/1501324 [ Mac ] virtual/compute-pressure/external/wpt/compute-pressure/compute_pressure_rate_obfuscation_mitigation_triggered.tentative.https.window.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/resources/common.js b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/resources/common.js
index 68dcab5..3e0fddd 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/resources/common.js
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/resources/common.js
@@ -23,11 +23,11 @@
 
   assertSnapchangedEvent(evt,
       test_data.expected_snap_targets);
-  assert_equals(test_data.scroller.scrollTop,
-    test_data.expected_scroll_offsets.y,
+  assert_approx_equals(test_data.scroller.scrollTop,
+    test_data.expected_scroll_offsets.y, 1,
     "vertical scroll offset mismatch.");
-  assert_equals(test_data.scroller.scrollLeft,
-    test_data.expected_scroll_offsets.x,
+  assert_approx_equals(test_data.scroller.scrollLeft,
+    test_data.expected_scroll_offsets.x, 1,
     "horizontal scroll offset mismatch.");
 }
 
@@ -56,3 +56,11 @@
                         : waitForEventUntil(event_target, "snapchanged",
                                    waitForAnimationFrames(2));
 }
+
+function getScrollbarToScrollerRatio(scroller) {
+  // Ideally we'd subtract the length of the scrollbar thumb from
+  // the dividend but there isn't currently a way to get the
+  // scrollbar thumb length.
+  return scroller.clientHeight /
+      (scroller.scrollHeight - scroller.clientHeight);
+}
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/resources/user-scroll-common.js b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/resources/user-scroll-common.js
new file mode 100644
index 0000000..75f8bf1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/resources/user-scroll-common.js
@@ -0,0 +1,62 @@
+// Helper functions for snapchanged-on-user-* tests.
+
+// This performs a touch scroll on |scroller| using the coordinates provided
+// in |start_pos| and |end_pos|.
+// It is meant for use in snapchanged tests for triggering snapchanged events
+// when touch scrolling from |start_pos| to |end_pos|.
+function snapchanged_touch_scroll_helper(start_pos, end_pos) {
+  return new test_driver.Actions()
+    .addPointer("TestPointer", "touch")
+    .pointerMove(start_pos.x, start_pos.y)
+    .pointerDown()
+    .addTick()
+    .pause(200)
+    .pointerMove(end_pos.x, end_pos.y)
+    .addTick()
+    .pointerUp()
+    .send();
+}
+
+// This drags the provided |scroller|'s scrollbar  vertically by |drag_amt|.
+// Snapchanged tests should provide a |drag_amt| that would result in a
+// snapchanged event being triggered.
+const vertical_offset_into_scrollbar = 30;
+function snapchanged_scrollbar_drag_helper(scroller, scrollbar_width, drag_amt) {
+  let x, y, bounds;
+  if (scroller == document.scrollingElement) {
+    bounds = document.documentElement.getBoundingClientRect();
+    x = window.innerWidth - Math.round(scrollbar_width / 2);
+  } else {
+    bounds = scroller.getBoundingClientRect();
+    x = bounds.right - Math.round(scrollbar_width / 2);
+  }
+  y = bounds.top + vertical_offset_into_scrollbar;
+  return new test_driver.Actions()
+    .addPointer('TestPointer', 'mouse')
+    .pointerMove(x, y)
+    .pointerDown()
+    .pointerMove(x, y + drag_amt)
+    .addTick()
+    .pointerUp()
+    .send();
+}
+
+// This tests that snapchanged doesn't fire for a user (wheel) scroll that
+// snaps back to the same element. snapchanged tests should provide a |delta|
+// small enough that no change in |scroller|'s snap targets occurs at the end of
+// the scroll.
+async function test_no_snapchanged(test, scroller, delta) {
+  const listening_element = scroller == document.scrollingElement
+      ? document : scroller;
+  checkSnapchangedSupport(test);
+  await waitForScrollReset(test, scroller);
+  await waitForCompositorCommit();
+  let snapchanged_promise = waitForSnapChangedEvent(listening_element);
+  // Set the scroll destination to just a little off (0, 0) top so we snap
+  // back to the top box.
+  await new test_driver.Actions().scroll(0, 0, delta, delta).send();
+  let evt = await snapchanged_promise;
+  assert_equals(evt, null, "no snapchanged since scroller is back to top");
+  assert_equals(scroller.scrollTop, 0, "scroller snaps back to the top");
+  assert_equals(scroller.scrollLeft, 0, "scroller snaps back to the left");
+}
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-root-scroll.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-root-scroll.tentative.html
new file mode 100644
index 0000000..18faab45
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-root-scroll.tentative.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <meta charset="utf-8">
+  <title> CSS Scroll Snap 2 Test: snapchanged events</title>
+  <link rel="help" href="https://drafts.csswg.org/css-scroll-snap-2/#snap-events">
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <script src="/resources/testdriver.js"></script>
+  <script src="/resources/testdriver-actions.js"></script>
+  <script src="/resources/testdriver-vendor.js"></script>
+  <script src="resources/common.js"></script>
+  <script src="resources/user-scroll-common.js"></script>
+  <script src="/dom/events/scrolling/scroll_support.js"></script>
+  <script src="/web-animations/testcommon.js"></script>
+</head>
+
+<body>
+  <style type='text/css'>
+    :root {
+      margin: 0px;
+      padding: 0px;
+      scroll-snap-type: both mandatory;
+    }
+
+    div {
+      position: absolute;
+      margin: 0px;
+    }
+
+    #spacer {
+      width: 200vw;
+      height: 200vh;
+    }
+
+    .snap_point {
+      width: 40vw;
+      height: 40vh;
+      scroll-snap-align: start;
+    }
+
+    #snap_point_1 {
+      left: 0px;
+      top: 0px;
+      background-color: red;
+    }
+
+    #snap_point_2 {
+      top: 35vh;
+      left: 35vw;
+      background-color: orange;
+    }
+
+    #snap_point_3 {
+      left: 70vw;
+      top: 70vh;
+      background-color: blue;
+    }
+  </style>
+  <div id="spacer"></div>
+  <div id="snap_point_1" class="snap_point"></div>
+  <div id="snap_point_2" class="snap_point"></div>
+  <div id="snap_point_3" class="snap_point"></div>
+  <script>
+    const scroller = document.scrollingElement;
+    const offset_to_snap_point_2 = {
+      x: snap_point_2.offsetLeft,
+      y: snap_point_2.offsetTop
+    };
+
+    // Touch scroll test.
+    promise_test(async (t) => {
+      await waitForCompositorCommit();
+      const start_pos = {
+        x: scroller.clientWidth / 2,
+        y: scroller.clientHeight / 2,
+      };
+      const end_pos = { x: 0, y: 0 };
+      const test_data = {
+        scroller: scroller,
+        scrolling_function: async () => {
+          await snapchanged_touch_scroll_helper(start_pos, end_pos);
+        },
+        expected_snap_targets: [snap_point_2.id],
+        expected_scroll_offsets: {
+          x: offset_to_snap_point_2.x,
+          y: offset_to_snap_point_2.y,
+        }
+      };
+      await test_snapchanged(t, test_data);
+    }, "snapchanged event fires after snap target changes on touch scroll");
+
+    // Wheel scroll test.
+    promise_test(async (t) => {
+      await waitForCompositorCommit();
+      const test_data = {
+        scroller: scroller,
+        scrolling_function: async () => {
+          await new test_driver.Actions().scroll(0, 0,
+              offset_to_snap_point_2.x,
+              offset_to_snap_point_2.y,
+            { origin: scroller }).send();
+      },
+        expected_snap_targets: [snap_point_2.id],
+        expected_scroll_offsets: {
+          x: offset_to_snap_point_2.x,
+          y: offset_to_snap_point_2.y,
+        }
+      };
+      await test_snapchanged(t, test_data);
+    }, "snapchanged event fires after snap target changes on wheel scroll");
+
+    // Scrollbar drag test.
+    promise_test(async (t) => {
+      await waitForCompositorCommit();
+      // Skip test on platforms that do not have a visible scrollbar (e.g.
+      // overlay scrollbar).
+      const scrollbar_width = window.innerWidth -
+          document.documentElement.clientWidth;
+      if (scrollbar_width == 0) {
+        return;
+      }
+      const test_data = {
+        scroller: scroller,
+        scrolling_function: async () => {
+          const scrollbar_to_scroller_ratio =
+              getScrollbarToScrollerRatio(document.documentElement);
+          // Scroll by just over half of the top box's height.
+          const drag_amt = (offset_to_snap_point_2.y / 2 + 1) *
+              scrollbar_to_scroller_ratio;
+          await snapchanged_scrollbar_drag_helper(scroller, scrollbar_width,
+                                                  drag_amt);
+        },
+        expected_snap_targets: [snap_point_1.id, snap_point_2.id],
+        expected_scroll_offsets: {
+          x: 0,
+          y: offset_to_snap_point_2.y,
+        }
+      };
+      await test_snapchanged(t, test_data);
+    }, "snapchanged event fires after snap target changes on scrollbar drag");
+
+    // Keyboard test.
+    promise_test(async (t) => {
+      const test_data = {
+        scroller: scroller,
+        scrolling_function: async () => {
+          scroller.focus();
+          window.test_driver.send_keys(document.documentElement,
+                                       '\ue015'/*ArrowDown*/);
+        },
+        expected_snap_targets: [snap_point_1.id, snap_point_2.id],
+        expected_scroll_offsets: {
+          x: 0,
+          y: offset_to_snap_point_2.y,
+        }
+      };
+      await test_snapchanged(t, test_data);
+    }, "snapchanged event fires after snap target changes on keydown press");
+
+    promise_test(async (t) => {
+      test_no_snapchanged(t, scroller, /*delta*/10);
+    }, "snapchanged is not fired if snap target doesn't change on user scroll");
+  </script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-scroll.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-scroll.tentative.html
new file mode 100644
index 0000000..8468aa5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-scroll.tentative.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <meta charset="utf-8">
+  <title> CSS Scroll Snap 2 Test: snapchanged events</title>
+  <link rel="help" href="https://drafts.csswg.org/css-scroll-snap-2/#snap-events">
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <script src="/resources/testdriver.js"></script>
+  <script src="/resources/testdriver-actions.js"></script>
+  <script src="/resources/testdriver-vendor.js"></script>
+  <script src="resources/common.js"></script>
+  <script src="resources/user-scroll-common.js"></script>
+  <script src="/dom/events/scrolling/scroll_support.js"></script>
+  <script src="/web-animations/testcommon.js"></script>
+</head>
+
+<body>
+  <style>
+    body {
+      margin: 0px;
+    }
+
+    div {
+      position: absolute;
+      margin: 0px;
+    }
+
+    #spacer {
+      width: 200vw;
+      height: 200vh;
+    }
+
+    .scroller {
+      height: 400px;
+      width: 400px;
+      overflow: scroll;
+      scroll-snap-type: both mandatory;
+    }
+
+    .snap_point {
+      width: 40%;
+      height: 40%;
+      scroll-snap-align: start;
+    }
+
+    #snap_point_1 {
+      left: 0px;
+      top: 0px;
+      background-color: red;
+    }
+
+    #snap_point_2 {
+      top: 35%;
+      left: 35%;
+      background-color: orange;
+    }
+
+    #snap_point_3 {
+      top: 70%;
+      left: 70%;
+      background-color: blue;
+    }
+  </style>
+  <div id="scroller" class="scroller">
+    <div id="spacer"></div>
+    <div id="snap_point_1" class="snap_point"></div>
+    <div id="snap_point_2" class="snap_point"></div>
+    <div id="snap_point_3" class="snap_point"></div>
+  </div>
+  <script>
+    const scroller = document.getElementById("scroller");
+    const offset_to_snap_point_2 = {
+      x: snap_point_2.offsetLeft,
+      y: snap_point_2.offsetTop
+    };
+
+    // Touch scroll test.
+    promise_test(async (t) => {
+      await waitForCompositorCommit();
+      const start_pos = {
+        x: scroller.clientWidth / 2,
+        y: scroller.clientHeight / 2,
+      };
+      const end_pos = { x: 0, y: 0 };
+      const test_data = {
+        scroller: scroller,
+        scrolling_function: async () => {
+          await snapchanged_touch_scroll_helper(start_pos, end_pos);
+        },
+        expected_snap_targets: [snap_point_2.id],
+        expected_scroll_offsets: {
+          x: offset_to_snap_point_2.x,
+          y: offset_to_snap_point_2.y,
+        }
+      };
+      await test_snapchanged(t, test_data);
+    }, "snapchanged event fires after snap target changes on touch scroll");
+
+    // Wheel scroll test.
+    promise_test(async (t) => {
+      await waitForCompositorCommit();
+      const test_data = {
+        scroller: scroller,
+        scrolling_function: async () => {
+          await new test_driver.Actions().scroll(0, 0,
+              offset_to_snap_point_2.x,
+              offset_to_snap_point_2.y,
+              { origin: scroller }).send();
+      },
+        expected_snap_targets: [snap_point_2.id],
+        expected_scroll_offsets: {
+          x: offset_to_snap_point_2.x,
+          y: offset_to_snap_point_2.y,
+        }
+      };
+      await test_snapchanged(t, test_data);
+    }, "snapchanged event fires after snap target changes on wheel scroll");
+
+    // Scrollbar drag test.
+    promise_test(async (t) => {
+      await waitForCompositorCommit();
+      // Skip test on platforms that do not have a visible scrollbar (e.g.
+      // overlay scrollbar).
+      const scrollbar_width = scroller.offsetWidth - scroller.clientWidth;
+      if (scrollbar_width == 0)
+        return;
+      const test_data = {
+        scroller: scroller,
+        scrolling_function: async () => {
+          const scrollbar_to_scroller_ratio =
+              getScrollbarToScrollerRatio(scroller);
+          // Scroll by just over half of the top box's height.
+          const drag_amt = (offset_to_snap_point_2.y / 2 + 1) *
+              scrollbar_to_scroller_ratio;
+          await snapchanged_scrollbar_drag_helper(scroller, scrollbar_width, drag_amt);
+        },
+        expected_snap_targets: [snap_point_1.id, snap_point_2.id],
+        expected_scroll_offsets: {
+          x: 0,
+          y: offset_to_snap_point_2.y,
+        }
+      };
+      await test_snapchanged(t, test_data);
+    }, "snapchanged event fires after snap target changes on scrollbar drag");
+
+    // Keyboard test.
+    promise_test(async (t) => {
+      await waitForCompositorCommit();
+      const test_data = {
+        scroller: scroller,
+        scrolling_function: async () => {
+          scroller.focus();
+          window.test_driver.send_keys(scroller, '\ue015'/*ArrowDown*/);
+        },
+        expected_snap_targets: [snap_point_1.id, snap_point_2.id],
+        expected_scroll_offsets: {
+          x: 0,
+          y: offset_to_snap_point_2.y,
+        }
+      };
+      await test_snapchanged(t, test_data);
+    }, "snapchanged event fires after snap target changes on keydown press");
+
+    promise_test(async (t) => {
+      await test_no_snapchanged(t, scroller, /*delta*/10);
+    }, "snapchanged is not fired if snap target doesn't change on user scroll");
+  </script>
+</body>
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 432be9cb1..efb05fc 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
@@ -94,9 +94,8 @@
 
 const EXPECT_PROMISE_ERROR = auctionResult => {
   assert_not_equals(auctionResult, null, "got null instead of expected error");
-  // TODO(morlovich): I suspect this will end up being spec'd differently.
-  assert_true(typeof auctionResult === "string",
-              "did not get expected error: " + auctionResult);
+  assert_true(auctionResult instanceof TypeError,
+              "did not get expected error type: " + auctionResult);
 }
 
 makeTest({
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/direct-from-seller-signals.https.window.js b/third_party/blink/web_tests/external/wpt/fledge/tentative/direct-from-seller-signals.https.window.js
index 0c40fb5e..5281c81 100644
--- a/third_party/blink/web_tests/external/wpt/fledge/tentative/direct-from-seller-signals.https.window.js
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/direct-from-seller-signals.https.window.js
@@ -11,6 +11,7 @@
 
 "use strict;"
 
+// Subset 1 - 5
 subsetTest(promise_test, async test => {
   const uuid = generateUuid(test);
   await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
@@ -96,6 +97,7 @@
   );
 }, 'Test directFromSellerSignals with sellerSignals, auctionSignals and perBuyerSignals.');
 
+// Subset 6 - 10
 subsetTest(promise_test, async test => {
   const uuid = generateUuid(test);
   await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
@@ -157,8 +159,13 @@
         decisionLogicURL: createDecisionScriptURL(uuid),
         directFromSellerSignalsHeaderAdSlot: adSlot };
 
-  let result = await navigator.runAdAuction(auctionConfig).catch(() => new runAdAuctionRejected());
-  assert_true(result instanceof runAdAuctionRejected);
+  try {
+    await navigator.runAdAuction(auctionConfig);
+  } catch(e) {
+    assert_true(e instanceof TypeError);
+    return;
+  }
+  throw "Exception unexpectedly not thrown.";
 }, 'Test directFromSellerSignals with rejected promise ad slot.');
 
 subsetTest(promise_test, async test => {
@@ -218,6 +225,7 @@
   );
 }, 'Test directFromSellerSignals with mismatched perBuyerSignals.');
 
+// Subset 11 - 15
 subsetTest(promise_test, async test => {
   const uuid = generateUuid(test);
   await fetchDirectFromSellerSignals({ 'Buyer-Origin': '*' });
@@ -297,6 +305,7 @@
   );
 }, 'Test directFromSellerSignals with HTTP error.');
 
+// Subset 16 - 20
 subsetTest(promise_test, async test => {
   const uuid = generateUuid(test);
   await fetchDirectFromSellerSignals({ 'Negative-Test-Option': 'No Ad-Auction-Signals Header' });
@@ -389,17 +398,17 @@
   );
 }, 'Test directFromSellerSignals different interest group owner origin from top frame.');
 
+// Subset 21 - last
 subsetTest(promise_test, async test => {
   const uuid = generateUuid(test);
-  await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
-  let iframe = await createIframe(test, OTHER_ORIGIN1);
+  let iframe = await createIframe(test, OTHER_ORIGIN1, "join-ad-interest-group; run-ad-auction");
+  await fetchDirectFromSellerSignals({ 'Buyer-Origin': OTHER_ORIGIN1 }, OTHER_ORIGIN1);
   await runInFrame(
       test, iframe,
-      `runReportTest(
-          test, "${uuid}",
+      `await runReportTest(
+          test_instance, "${uuid}",
           directFromSellerSignalsValidatorCode(
-              "${uuid}", 'sellerSignals/4',
-              'auctionSignals/4', 'perBuyerSignals/4'),
+              "${uuid}", 'sellerSignals/4', 'auctionSignals/4', 'perBuyerSignals/4'),
           // expectedReportUrls
           [createSellerReportURL("${uuid}"), createBidderReportURL("${uuid}")],
           // renderURLOverride
@@ -410,45 +419,43 @@
 
 subsetTest(promise_test, async test => {
   const uuid = generateUuid(test);
-  let iframe = await createIframe(test, OTHER_ORIGIN1);
+  let iframe = await createIframe(test, OTHER_ORIGIN1, "join-ad-interest-group; run-ad-auction");
   await runInFrame(
       test, iframe,
       `await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
-      runReportTest(
-          test, "${uuid}",
+       await runReportTest(
+          test_instance, "${uuid}",
           directFromSellerSignalsValidatorCode(
               "${uuid}", 'sellerSignals/4',
               'auctionSignals/4', 'perBuyerSignals/4'),
           // expectedReportUrls
-          [createSellerReportURL("${uuid}"), createBidderReportURL("${uuid}", '1', OTHER_ORIGIN1)],
+          [createSellerReportURL("${uuid}"), createBidderReportURL("${uuid}")],
           // renderURLOverride
           null,
           // auctionConfigOverrides
-          { directFromSellerSignalsHeaderAdSlot: 'adSlot/4',
-            interestGroupBuyers: [OTHER_ORIGIN1] })`);
+          { directFromSellerSignalsHeaderAdSlot: 'adSlot/4' })`);
 }, 'Test directFromSellerSignals with fetching and running auction in the same iframe.');
 
 subsetTest(promise_test, async test => {
   const uuid = generateUuid(test);
   let iframe1 = await createIframe(test, OTHER_ORIGIN1);
-  let iframe2 = await createIframe(test, OTHER_ORIGIN2);
+  let iframe2 = await createIframe(test, OTHER_ORIGIN2, "join-ad-interest-group; run-ad-auction");
   await runInFrame(
       test, iframe1,
-      `await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });`);
+      `await fetchDirectFromSellerSignals({ 'Buyer-Origin': OTHER_ORIGIN2 }, OTHER_ORIGIN2);`);
   await runInFrame(
       test, iframe2,
-      `runReportTest(
-          test, "${uuid}",
+      `await runReportTest(
+          test_instance, "${uuid}",
           directFromSellerSignalsValidatorCode(
               "${uuid}", 'sellerSignals/4',
               'auctionSignals/4', 'perBuyerSignals/4'),
           // expectedReportUrls
-          [createSellerReportURL("${uuid}"), createBidderReportURL("${uuid}", '1', OTHER_ORIGIN1)],
+          [createSellerReportURL("${uuid}"), createBidderReportURL("${uuid}")],
           // renderURLOverride
           null,
           // auctionConfigOverrides
-          { directFromSellerSignalsHeaderAdSlot: 'adSlot/4',
-            interestGroupBuyers: [OTHER_ORIGIN1] })`);
+          { directFromSellerSignalsHeaderAdSlot: 'adSlot/4' })`);
 }, 'Test directFromSellerSignals with fetching in iframe 1 and running auction in iframe 2.');
 
 subsetTest(promise_test, async test => {
@@ -456,7 +463,8 @@
   let iframe = await createIframe(test, OTHER_ORIGIN1);
   await runInFrame(
       test, iframe,
-      `await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });`);
+      `await fetchDirectFromSellerSignals(
+          { 'Buyer-Origin': "${window.location.origin}" }, "${window.location.origin}");`);
   await runReportTest(
       test, uuid,
       directFromSellerSignalsValidatorCode(
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.js b/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.js
index 1bf5d01..e6836ab 100644
--- a/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.js
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.js
@@ -364,7 +364,6 @@
       uuid,
       [createSellerReportURL(uuid), createSuccessURL(uuid)]);
 
-  // Check the interest group was not actually left - component ads are not currently
-  // allowed to leave interest groups, even if same origin.
-  await runBasicFledgeTestExpectingWinner(test, uuid);
+  // Check the interest group was left.
+  await runBasicFledgeTestExpectingNoWinner(test, uuid);
 }, 'leaveAdInterestGroup() in component ad fenced frame, no parameters.');
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/fledge-util.sub.js b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/fledge-util.sub.js
index 1e5b75a..91c5c0fa 100644
--- a/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/fledge-util.sub.js
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/resources/fledge-util.sub.js
@@ -264,9 +264,6 @@
   await navigator.leaveAdInterestGroup(interestGroup);
 }
 
-// A type tag to identify a promise is handled correctly when rejected.
-function runAdAuctionRejected() { }
-
 // Runs a FLEDGE auction and returns the result. By default, the seller is the
 // current frame's origin, and the only buyer is as well. The seller script
 // rejects bids for URLs that don't contain "uuid" (to avoid running into issues
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe-iframe.html b/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe-iframe.html
index ecc364c..b33d3b0 100644
--- a/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe-iframe.html
+++ b/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe-iframe.html
@@ -138,6 +138,16 @@
         }
         break;
       }
+      case "BroadcastChannel": {
+        const handle = await document.requestStorageAccess({BroadcastChannel: true});
+        const handle_channel = handle.BroadcastChannel(id);
+        handle_channel.postMessage("Same-origin handle access");
+        handle_channel.close();
+        const local_channel = new BroadcastChannel(id);
+        local_channel.postMessage("Same-origin local access");
+        local_channel.close();
+        break;
+      }
       default: {
         message = "Unexpected type " + type;
         break;
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe.sub.html b/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe.sub.html
index 193ddd2..364e5d7 100644
--- a/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe.sub.html
+++ b/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe.sub.html
@@ -71,6 +71,12 @@
         }
         break;
       }
+      case "BroadcastChannel": {
+        const channel = handle.BroadcastChannel(id);
+        channel.postMessage("Cross-origin handle access");
+        channel.close();
+        break;
+      }
       default: {
         message = "Unexpected type " + type;
         break;
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-beyond-cookies.BroadcastChannel.tentative.sub.https.window.js b/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-beyond-cookies.BroadcastChannel.tentative.sub.https.window.js
new file mode 100644
index 0000000..d709cdc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-beyond-cookies.BroadcastChannel.tentative.sub.https.window.js
@@ -0,0 +1,37 @@
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+
+'use strict';
+
+// Here's the set-up for this test:
+// Step 1 (top-frame) Set up listener for "HasAccess" message.
+// Step 2 (top-frame) Open channel first-party broadcast.
+// Step 3 (top-frame) Embed an iframe that's cross-site with top-frame.
+// Step 4 (sub-frame) Try to use storage access API and send first-party broadcast.
+// Step 5 (sub-frame) Embed an iframe that's same-origin with top-frame.
+// Step 6 (sub-sub-frame) Try to use storage access API and send first-party broadcast.
+// Step 7 (sub-sub-frame) Send "HasAccess for BroadcastChannel" message to top-frame.
+// Step 8 (top-frame) Receive "HasAccess for BroadcastChannel" message and cleanup.
+
+async_test(t => {
+  let broadcasts = [];
+  // Step 1
+  window.addEventListener("message", t.step_func(e => {
+    // Step 8
+    assert_equals(e.data, "HasAccess for BroadcastChannel", "Storage Access API should be accessible and return first-party data");
+    assert_array_equals(broadcasts, ["Same-origin handle access"], "Should have only seen same-origin handle broadcasts");
+    t.done();
+  }));
+
+  // Step 2
+  const id = Date.now();
+  const channel = new BroadcastChannel(id);
+  channel.onmessage = (event) => {
+    broadcasts.push(event.data);
+  };
+
+  // Step 3
+  let iframe = document.createElement("iframe");
+  iframe.src = "https://{{hosts[alt][]}}:{{ports[https][0]}}/storage-access-api/resources/storage-access-beyond-cookies-iframe.sub.html?type=BroadcastChannel&id="+id;
+  document.body.appendChild(iframe);
+}, "Verify StorageAccessAPIBeyondCookies for Broadcast Channel");
diff --git a/third_party/blink/web_tests/virtual/saa-beyond-cookies-disabled/external/wpt/storage-access-api/storage-access-beyond-cookies.BroadcastChannel.tentative.sub.https.window-expected.txt b/third_party/blink/web_tests/virtual/saa-beyond-cookies-disabled/external/wpt/storage-access-api/storage-access-beyond-cookies.BroadcastChannel.tentative.sub.https.window-expected.txt
new file mode 100644
index 0000000..da9659d
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/saa-beyond-cookies-disabled/external/wpt/storage-access-api/storage-access-beyond-cookies.BroadcastChannel.tentative.sub.https.window-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] Verify StorageAccessAPIBeyondCookies for Broadcast Channel
+  assert_equals: Storage Access API should be accessible and return first-party data expected "HasAccess for BroadcastChannel" but got "Unable to load handle in cross-site context for all"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/wpt_internal/storage-access-api/resources/storage-access-origin-trial-iframe.html b/third_party/blink/web_tests/wpt_internal/storage-access-api/resources/storage-access-origin-trial-iframe.html
index 3e589fa..70c35521 100644
--- a/third_party/blink/web_tests/wpt_internal/storage-access-api/resources/storage-access-origin-trial-iframe.html
+++ b/third_party/blink/web_tests/wpt_internal/storage-access-api/resources/storage-access-origin-trial-iframe.html
@@ -24,6 +24,7 @@
     await handle.estimate();
     const url = handle.createObjectURL(new Blob(["TEST"]));
     handle.revokeObjectURL(url);
+    handle.BroadcastChannel("test").close();
   } catch (_) {
     message = "NoAccess";
   }
diff --git a/third_party/dawn b/third_party/dawn
index c36093e..e30eacb 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit c36093e932c33b6269204461ebbf864bd7e717de
+Subproject commit e30eacb0b6e8725e79c283908b7cb0c7f219ac44
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index ed6d18ba..01f68f26 100644
--- a/third_party/freetype/README.chromium
+++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType
 URL: http://www.freetype.org/
-Version: VER-2-13-2-59-g6338f2a68
-Revision: 6338f2a6814b3f50a0bb3a4c563ef30e4561041a
+Version: VER-2-13-2-61-gd5973932d
+Revision: d5973932d0f5e0336c1de6fad3d8029a8bde1957
 CPEPrefix: cpe:/a:freetype:freetype:2.13.2
 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent
          JPEG Group) licenses"
diff --git a/third_party/freetype/src b/third_party/freetype/src
index 6338f2a..d597393 160000
--- a/third_party/freetype/src
+++ b/third_party/freetype/src
@@ -1 +1 @@
-Subproject commit 6338f2a6814b3f50a0bb3a4c563ef30e4561041a
+Subproject commit d5973932d0f5e0336c1de6fad3d8029a8bde1957
diff --git a/third_party/libc++/src b/third_party/libc++/src
index cec6ffa..2a2315e 160000
--- a/third_party/libc++/src
+++ b/third_party/libc++/src
@@ -1 +1 @@
-Subproject commit cec6ffaa620122c200e742b7b0d034ce4e5c40bd
+Subproject commit 2a2315e69ab61cb488c18fbbb1cd502be049c122
diff --git a/third_party/perfetto b/third_party/perfetto
index 9c4d509..11e588e 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit 9c4d5090f6a29c785d4e2a1a1f577bcc17eeb648
+Subproject commit 11e588ed3a8fc568f13a4ae156fa848d00909937
diff --git a/third_party/skia b/third_party/skia
index 65a5cd0..ae6df72 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 65a5cd082bea45d16a7b4a251934acc632e77032
+Subproject commit ae6df7264c6eedbe988e05a12455c619e1a0f242
diff --git a/tools/metrics/actions/extract_actions.py b/tools/metrics/actions/extract_actions.py
index 214d959e..9a39ee6 100755
--- a/tools/metrics/actions/extract_actions.py
+++ b/tools/metrics/actions/extract_actions.py
@@ -329,6 +329,14 @@
   else:
     action_re = USER_METRICS_ACTION_RE
 
+  if os.name == 'nt':
+    # TODO(crbug.com/1500917): Remove when Windows bots have LongPathsEnabled.
+    # Windows APIs limits path names to 260 characters unless the Windows
+    # property LongPathsEnabled is set to 1. As a workaround, the "\\?\"
+    # disables all string parsing by the Windows API and thus allows us to
+    # exceed Windows' path length limit of 260 characters.
+    path = '\\\\?\\' + os.abspath(path)
+
   finder = ActionNameFinder(path,
                             open(path, encoding='utf-8').read(), action_re)
   while True:
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 3830d95..70e9609 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -11688,6 +11688,13 @@
   <int value="2" label="External non-200 HTTP error"/>
 </enum>
 
+<enum name="ConversionRequestSupportHeader">
+  <int value="0" label="Web"/>
+  <int value="1" label="Web and OS"/>
+  <int value="2" label="OS"/>
+  <int value="3" label="None"/>
+</enum>
+
 <enum name="ConversionSourceRegistrationError">
   <int value="0" label="Invalid JSON"/>
   <int value="1" label="Root JSON value has wrong type"/>
@@ -30907,6 +30914,10 @@
       label="StorageAccessAPI_requestStorageAccess_BeyondCookies_revokeObjectURL"/>
   <int value="4728"
       label="StorageAccessAPI_requestStorageAccess_BeyondCookies_revokeObjectURL_Use"/>
+  <int value="4729"
+      label="StorageAccessAPI_requestStorageAccess_BeyondCookies_BroadcastChannel"/>
+  <int value="4730"
+      label="StorageAccessAPI_requestStorageAccess_BeyondCookies_BroadcastChannel_Use"/>
 </enum>
 
 <enum name="FeaturePolicyFeature">
@@ -58783,6 +58794,8 @@
   <int value="8" label="Attestations downloaded, not yet loaded"/>
   <int value="9" label="Attestations file corrupt"/>
   <int value="10" label="Protected Audience joining blocked due to top frame"/>
+  <int value="11"
+      label="Disabled by third-party cookie deprecation experiment"/>
 </enum>
 
 <enum name="PrivacySandboxPrivateAggregationBudgeterBudgetValidityStatus2">
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index 0c40cb53..e0b7514 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -5521,16 +5521,6 @@
   </summary>
 </histogram>
 
-<histogram name="Media.VideoCapture.NumberOfClients" units="units"
-    expires_after="2021-12-12">
-  <owner>fbeaufort@chromium.org</owner>
-  <owner>guidou@chromium.org</owner>
-  <summary>
-    Number of times a video capture device is accessed simultaneously. Recorded
-    when video capturing starts.
-  </summary>
-</histogram>
-
 <histogram name="Media.VideoCapture.ScaleOverride" units="units"
     expires_after="2024-05-05">
   <owner>jophba@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/memory/histograms.xml b/tools/metrics/histograms/metadata/memory/histograms.xml
index 7df9c56..4d3f155 100644
--- a/tools/metrics/histograms/metadata/memory/histograms.xml
+++ b/tools/metrics/histograms/metadata/memory/histograms.xml
@@ -2311,7 +2311,7 @@
 </histogram>
 
 <histogram name="Memory.Total.RendererPrivateMemoryFootprintExcludingWaived"
-    units="MB" expires_after="2023-12-10">
+    units="MB" expires_after="2024-02-11">
   <owner>ckitagawa@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index f88270fb..d7d148c4 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -3033,6 +3033,18 @@
   </summary>
 </histogram>
 
+<histogram name="Conversions.RequestSupportHeader"
+    enum="ConversionRequestSupportHeader" expires_after="2024-05-05">
+  <owner>tquintanilla@chromium.org</owner>
+  <owner>johnidel@chromium.org</owner>
+  <owner>measurement-api-dev+metrics@google.com</owner>
+  <summary>
+    Records the Attribution-Reporting-Support header value of outgoing
+    attribution-eligible requests. This is only recorded when the cross app web
+    feature is enabled.
+  </summary>
+</histogram>
+
 <histogram name="Conversions.SchedulerReportDelay" units="ms"
     expires_after="2024-03-10">
   <owner>linnan@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/variations/histograms.xml b/tools/metrics/histograms/metadata/variations/histograms.xml
index ab8a8b3..02aaa0a9 100644
--- a/tools/metrics/histograms/metadata/variations/histograms.xml
+++ b/tools/metrics/histograms/metadata/variations/histograms.xml
@@ -668,16 +668,6 @@
   </summary>
 </histogram>
 
-<histogram name="Variations.StringsOverridden" units="strings"
-    expires_after="2018-08-30">
-  <owner>asvitkine@chromium.org</owner>
-  <owner>src/base/metrics/OWNERS</owner>
-  <summary>
-    Records the number of UI strings overriden for each study that overrides
-    strings. Recorded at start up when each study is evaluated.
-  </summary>
-</histogram>
-
 <histogram name="Variations.TimeSinceLastFetchAttempt" units="minutes"
     expires_after="2024-11-01">
   <owner>asvitkine@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index d2a74a70..7231f97 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -13,8 +13,8 @@
             "full_remote_path": "perfetto-luci-artifacts/3f522a981c45dc5d735a5e5d775c70188adff93c/linux-arm/trace_processor_shell"
         },
         "mac": {
-            "hash": "48589bafb0da791d6f18b50e99be39e03c355035",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/8dc60d8a5484638134420511e0f54415853621c9/trace_processor_shell"
+            "hash": "b72021acf93ec3bdcca6fc3da2fd6e290ee11263",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/9c4d5090f6a29c785d4e2a1a1f577bcc17eeb648/trace_processor_shell"
         },
         "mac_arm64": {
             "hash": "cc287491e9ff9fe2c4866e5574eaea04134895a0",
diff --git a/ui/accessibility/ax_event_generator_unittest.cc b/ui/accessibility/ax_event_generator_unittest.cc
index 2523ff5..8fc8e1d 100644
--- a/ui/accessibility/ax_event_generator_unittest.cc
+++ b/ui/accessibility/ax_event_generator_unittest.cc
@@ -29,8 +29,6 @@
 using testing::PrintToString;
 using testing::UnorderedElementsAre;
 
-// TODO(gilmanmh): Improve printing of test failure messages when the expected
-// values are themselves matchers (e.g. Not(3)).
 MATCHER_P2(HasEventAtNode,
            expected_event_type,
            expected_node_id,
@@ -38,8 +36,24 @@
                PrintToString(expected_event_type) + " on " +
                PrintToString(expected_node_id)) {
   const auto& event = arg;
-  return Matches(expected_event_type)(event.event_params.event) &&
-         Matches(expected_node_id)(event.node_id);
+  std::string failure_message;
+  if (!Matches(expected_event_type)(event.event_params.event)) {
+    failure_message +=
+        "Expected event type: " + PrintToString(expected_event_type) +
+        ", actual event type: " + PrintToString(event.event_params.event);
+  }
+  if (!Matches(expected_node_id)(event.node_id)) {
+    if (!failure_message.empty()) {
+      failure_message += "; ";
+    }
+    failure_message += "Expected node id: " + PrintToString(expected_node_id) +
+                       ", actual node id: " + PrintToString(event.node_id);
+  }
+  if (!failure_message.empty()) {
+    *result_listener << failure_message;
+    return false;
+  }
+  return true;
 }
 
 }  // namespace
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
index ceac008..23e321b 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
@@ -902,6 +902,7 @@
   // window. (The windows code doesn't need this because their window change is
   // synchronous.)
   ScheduleRelayout();
+  GetWidget()->OnNativeWidgetWindowShowStateChanged();
 }
 
 void DesktopWindowTreeHostPlatform::OnCloseRequest() {
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index c6d8f2b5..e3307ed 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -1674,6 +1674,10 @@
 
 void Widget::OnNativeWidgetWindowShowStateChanged() {
   SaveWindowPlacementIfInitialized();
+
+  for (WidgetObserver& observer : observers_) {
+    observer.OnWidgetShowStateChanged(this);
+  }
 }
 
 void Widget::OnNativeWidgetBeginUserBoundsChange() {
diff --git a/ui/views/widget/widget_observer.h b/ui/views/widget/widget_observer.h
index c4fbdcb..01e72d2 100644
--- a/ui/views/widget/widget_observer.h
+++ b/ui/views/widget/widget_observer.h
@@ -57,6 +57,11 @@
 
   virtual void OnWidgetSizeConstraintsChanged(Widget* widget) {}
 
+  // Invoked when a display-state affecting change happens. This can happen when
+  // either `ui::WindowShowState` or `ui::PlatformWindowState` changes depending
+  // on the platform in question.
+  virtual void OnWidgetShowStateChanged(Widget* widget) {}
+
  protected:
   ~WidgetObserver() override = default;
 };